Excelのシートの保護を解除するためのパスワードを忘れてしまったときのために、マクロを使ってしらみつぶしに探します。
マクロの前半が本体です。
文字列を少しずつ変えて、試します。
「try_max」で試行回数の上限を指定します。デフォルトは100,000回にしています。
マクロの後半は試行する文字列を作ります。
数値を与えるとそれに応じた文字列を作ります。
「moji_list」で文字列に使用する文字を指定します。
デフォルトは数字と英小文字にしています。英大文字や記号を追加することもできます。
もし「moji_list」に”abc”を指定した場合は次のように作ります。
まず1桁の文字列。0:a,1:b,2:c
次に2桁の文字列。3:aa,4:ab,,,11:cc
さらに3桁の文字列。12:aaa,13:aab,,,38:ccc
これを試行回数の上限まで繰り返します。
Const try_max = 100000 '試行する回数
On Error GoTo errorlabel
try_password = "未設定"
try_number = -1
ActiveSheet.Unprotect (try_password)
MsgBox "パスワードは「" & try_password & "」です。"
Exit Sub
errorlabel:
try_number = try_number + 1
try_password = num2str(try_number)
If try_number > try_max Then
MsgBox "開けませんでした。"
Exit Sub
End If
Application.StatusBar = try_password
Resume
End Sub
Function num2str(num)
Const moji_list = "0123456789abcdefghijklmnopqrstuvwxyz"
list_length = Len(moji_list)
ketasu = 0
rank_max = 0
Do While num >= rank_max
ketasu = ketasu + 1
ex_rank_max = rank_max
rank_max = rank_max + list_length ^ ketasu
Loop
num2str = ""
nokori = num - ex_rank_max
For keta = 0 To ketasu - 1
num2str = Mid(moji_list, nokori Mod list_length + 1, 1) & num2str
nokori = Int(nokori / list_length)
Next
End Function
このマクロはパスワードが違うとエラーが発生する仕組みを利用しています。正しく動作しない場合は、VBエディタの「エラートラップ」を「エラー発生時に中断」以外にするとよいです。
「moji_list」に数字と英小文字を指定した場合、文字の種類は、0から9、aからzで、36種類。
1桁は36通り。
2桁は1296通り(36の2乗)なので、2桁までの文字列を網羅するには、1332通り。
3桁は46656通り(36の3乗)なので、3桁までの文字列を網羅するには、47988通り。
4桁は1679616通り(36の4乗)なので、4桁までの文字列を網羅するには、1727604通り。
試していませんが、4桁の場合は相当、時間がかかりそうです。ただし、シートの保護はパスワードが違っても開く場合があるので、意外と早く、解除できるかもしれません。
コメント
[…] 大したことも書いていないのに他人の干渉を拒む人です。 解消するには、シートのタグを右クリックして、シート保護の解除を選択。 パスワードがセットされていたら諦めましょう。なおマクロでパスワードを探す方法を試す価値はあるかもしれません。 […]