シート保護のパスワードを探すマクロ

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
これを試行回数の上限まで繰り返します。

Sub シート保護パスワードを外す()
    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桁の場合は相当、時間がかかりそうです。ただし、シートの保護はパスワードが違っても開く場合があるので、意外と早く、解除できるかもしれません。

コメント

  1. […] 大したことも書いていないのに他人の干渉を拒む人です。 解消するには、シートのタグを右クリックして、シート保護の解除を選択。 パスワードがセットされていたら諦めましょう。なおマクロでパスワードを探す方法を試す価値はあるかもしれません。 […]

タイトルとURLをコピーしました