仕事でExcelVBAのパスワードを解除する必要に迫られる事態となりましたが、無事にVBAパスワードの解除をすることができました。その時やったことをまとめておきます。今回は、Windows10Pro 64bit/Excel2010 32bitで行いました。
VBAパスワード解除の手順
それでは早速、VBAパスワード解除の手順です。
まずは、パスワードがかかっているエクセルファイルを開き、開いた状態のまま新しく空白のブックを作成します。
Book1という空白のブックが新規に作成されました。
続けて、VBE(Visual Basic Editor)の画面に切り替えます。
新しく作成したパスワードがかかっていない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します。
これで、パスワードがかかっていない状態で保存することができました。
VBAパスワードの解除方法は主に3パターン
今回、ExcelVBAのパスワードを解除しなければならなくなって調べてみたところ、いくつかのパスワード解除方法がヒットしました。主な対応は以下の3つでした。
- パスワード解除ソフトを使う
- バイナリエディタを使う
- パスワードを解除するためのExcelファイル(VBA標準モジュール)を使う
どれを試そうかと思ったのですが、
- パスワード解除ソフトを使う → あんまりやたらとインストールしたくないです。職場のパソコンですし、何かあったらまずいので。
- バイナリエディタを使う → これはアリですが、あまり使い慣れていない「バイナリエディタ」をインストールしないといけません。
- パスワードを解除するためのExcelファイル(VBA標準モジュール)を使う → これが一番やりやすそうです。
ということで、今回は「パスワードを解除するためのExcelファイル(VBA標準モジュール)を使う」でやってみました。
なお、今回はExcel2010の32bitバージョンで行い成功しました。Excelの64bitバージョンですとVBAコードが変わるようです。自分のエクセルが32ビットか64ビットか確認する方法はこちらをご参照ください。
普段はあまり意識することはないのではと思いますが、自分のマイクロソフトオフィスエクセルが32ビットなのか64ビットなのか確認しなければならないケースがあるかもしれませんので、念のため確認方法を記録しておきます。 ちなみに、ほとんどの場[…]
Excel VBAマクロ パスワード解除方法 | ホームページ制作のサカエン(墨田区)