ExcelVBAのパスワード解除に成功した時の方法|Windows10/Excel2010 32bit

仕事でExcelVBAのパスワードを解除する必要に迫られる事態となりましたが、無事にVBAパスワードの解除をすることができました。その時やったことをまとめておきます。今回は、Windows10Pro 64bit/Excel2010 32bitで行いました。

以下の内容は、全ての動作を保証するものではありません。もしも実行される際には、万が一の場合に備えて、必ずバックアップをしてから実行してください。
ad

VBAパスワード解除の手順

それでは早速、VBAパスワード解除の手順です。

まずは、パスワードがかかっているエクセルファイルを開き、開いた状態のまま新しく空白のブックを作成します。

 

Book1という空白のブックが新規に作成されました。

 

続けて、VBE(Visual Basic Editor)の画面に切り替えます。

VBE(Visual Basic Editor)の画面は「Alt」と「F11」キーを同時に押すと表示されます。

 

新しく作成したパスワードがかかっていないBook1(空白のブック)に標準モジュールを追加します。

 

標準モジュールが追加された状態の画面はこちら

 

新しくできた標準モジュールに、下記のコードをコピペします。

Option Explicit
 
Private Const PAGE_EXECUTE_READWRITE = &H40
Private Declare Sub MoveMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Long, Source As Long, ByVal Length As Long)
Private Declare Function VirtualProtect Lib "kernel32" (lpAddress As Long, ByVal dwSize As Long, ByVal flNewProtect As Long, lpflOldProtect As Long) As Long
Private Declare Function GetModuleHandleA Lib "kernel32" (ByVal lpModuleName As String) As Long
Private Declare Function GetProcAddress Lib "kernel32" (ByVal hModule As Long, ByVal lpProcName As String) As Long
Private Declare Function DialogBoxParam Lib "user32" Alias "DialogBoxParamA" (ByVal hInstance As Long, ByVal pTemplateName As Long, ByVal hWndParent As Long, ByVal lpDialogFunc As Long, ByVal dwInitParam As Long) As Integer
Dim HookBytes(0 To 5) As Byte
Dim OriginBytes(0 To 5) As Byte
Dim pFunc As Long
Dim Flag As Boolean
  
Private Function GetPtr(ByVal Value As Long) As Long
    GetPtr = Value
End Function
  
Private Sub RecoverBytes()
    If Flag Then MoveMemory ByVal pFunc, ByVal VarPtr(OriginBytes(0)), 6
End Sub
  
Private Function Hook() As Boolean
    Dim TmpBytes(0 To 5) As Byte
    Dim p As Long
    Dim OriginProtect As Long
  
    Hook = False
    pFunc = GetProcAddress(GetModuleHandleA("user32.dll"), "DialogBoxParamA")
    If VirtualProtect(ByVal pFunc, 6, PAGE_EXECUTE_READWRITE, OriginProtect) <> 0 Then
        MoveMemory ByVal VarPtr(TmpBytes(0)), ByVal pFunc, 6
        If TmpBytes(0) <> &H68 Then
            MoveMemory ByVal VarPtr(OriginBytes(0)), ByVal pFunc, 6
            p = GetPtr(AddressOf MyDialogBoxParam)
            HookBytes(0) = &H68
            MoveMemory ByVal VarPtr(HookBytes(1)), ByVal VarPtr(p), 4
            HookBytes(5) = &HC3
            MoveMemory ByVal pFunc, ByVal VarPtr(HookBytes(0)), 6
            Flag = True
            Hook = True
        End If
    End If
End Function
  
Private Function MyDialogBoxParam(ByVal hInstance As Long, ByVal pTemplateName As Long, ByVal hWndParent As Long, ByVal lpDialogFunc As Long, ByVal dwInitParam As Long) As Integer
    If pTemplateName = 4070 Then
        MyDialogBoxParam = 1
    Else
        RecoverBytes
        MyDialogBoxParam = DialogBoxParam(hInstance, pTemplateName, _
        hWndParent, lpDialogFunc, dwInitParam)
        Hook
    End If
End Function
 
Public Sub unprotected()
    If Hook Then
        MsgBox "パスワード解除成功", vbInformation, "unlocked"
    End If
End Sub

 

VBAコードをペーストした状態の画面はこんな感じです。

 

ペースト出来たら、再生ボタンを押してVBAを実行します。

 

すると、数秒後には「パスワード解除成功」と表示されて、VBAのパスワードが解除されます。

 

これで、見事にVBAのパスワードを解除することができました!

パスワードを解除した状態で保存する方法

せっかくパスワードを解除できたとしても、パスワードがかかっていたブックをそのまま上書き保存してしまうと、またパスワードがかかっている状態にもどってしまいますので、パスワードがかかっていない状態で保存しなおします。

 

VBAメニューのツールから「VBAprojectのプロパティ」を開きます。

 

プロパティウィンドウが開いたら、「保護」のタブに切り替えて、「プロジェクトを表示用にロックする」のチェックを外してOKします。

 

これで、パスワードがかかっていない状態で保存することができました。

ad

VBAパスワードの解除方法は主に3パターン

今回、ExcelVBAのパスワードを解除しなければならなくなって調べてみたところ、いくつかのパスワード解除方法がヒットしました。主な対応は以下の3つでした。

  1. パスワード解除ソフトを使う
  2. バイナリエディタを使う
  3. パスワードを解除するためのExcelファイル(VBA標準モジュール)を使う

どれを試そうかと思ったのですが、

  1. パスワード解除ソフトを使う → あんまりやたらとインストールしたくないです。職場のパソコンですし、何かあったらまずいので。
  2. バイナリエディタを使う → これはアリですが、あまり使い慣れていない「バイナリエディタ」をインストールしないといけません。
  3. パスワードを解除するためのExcelファイル(VBA標準モジュール)を使う → これが一番やりやすそうです。

ということで、今回は「パスワードを解除するためのExcelファイル(VBA標準モジュール)を使う」でやってみました。

 

なお、今回はExcel2010の32bitバージョンで行い成功しました。Excelの64bitバージョンですとVBAコードが変わるようです。自分のエクセルが32ビットか64ビットか確認する方法はこちらをご参照ください。

関連記事

普段はあまり意識することはないのではと思いますが、自分のマイクロソフトオフィスエクセルが32ビットなのか64ビットなのか確認しなければならないケースがあるかもしれませんので、念のため確認方法を記録しておきます。 ちなみに、ほとんどの場[…]

 

今回のVBAコードや手順は、こちらの記事を参考にさせていただきました。どうもありがとうございました。
Excel VBAマクロ パスワード解除方法 | ホームページ制作のサカエン(墨田区)

Office2019でも成功しました

Office2019 32bit版でも試してみましたが、特に問題なくパスワード解除に成功しました。操作手順は全く同じです。
パスワードがかかっているエクセルを開いた状態で、新規に空白のブックを作り、VBEで標準モジュールを追加し、上記のコードを実行します。
無事にパスワード解除に成功しました。
ad