非表示にできる< 目次 >
VBA-マクロのパスワード解除とは?(VBAProjectパスワードのこと)
マクロのパスワード解除とは、「VBAProject パスワード」の解除って意味ですね。
↓の画像で、赤枠で囲ってあるパスワード解除方法について、本記事では触れていきます。
簡単ですので、ちゃちゃっとやっていきましょう。
本記事でできること
本記事で紹介するコードでは、以下のことができます。
本記事で出来ること
EXCEL-VBAのVBAProjectパスワードを解除することができる。
使い方がやや特殊です。
そのため使用方法も記載しましたので併せて読んでおきましょう。
VBA-ユースケース
ユースケースは、主に3点かな、と。
ユースケース-3例
- VBAツールを引き継いだが、PWロックされているためメンテナンスが出来ない
- 過去に開発した自作VBAツールのPWを忘れてしまった!
- なんかしらの理由でVBAコード見たい
僕は、開発したVBAを利用者に渡すときに問題の切り分けができるように、
VBAにPWを付けて利用者に渡しています。
それでエラーが発生した時に、
自己解決してくれるなら良いんですけど、
大体はVBA開発者に手戻りが発生するんですよね。。。
だから、「自分のコードが悪さをしている」と断定できるように、
パスワードをつけるようにしています。
VBA-使用時の注意点
EXCEL VBAのパスワード解除は、開発者の「何かしらの意図」があって施されたものです。
よって、本コード利用者はすべて自己責任で対応ください。
VBA-PW解除コードの紹介(※コピペでOK)
EXCELのバージョンによって、使用するコードが若干異なります。
64bit版だとlongptrという変数を使用しています。
緩い感じですみません。
◆EXCEL-32bit版はコチラ
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 |
Public Const PAGE_EXECUTE_READWRITE = &H40 Public Declare PtrSafe Sub MoveMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As LongPtr, Source As LongPtr, ByVal Length As LongPtr) Public Declare PtrSafe Function VirtualProtect Lib "kernel32" (lpAddress As LongPtr, ByVal dwSize As LongPtr, ByVal flNewProtect As LongPtr, lpflOldProtect As LongPtr) As LongPtr Public Declare PtrSafe Function GetModuleHandleA Lib "kernel32" (ByVal lpModuleName As String) As LongPtr Public Declare PtrSafe Function GetProcAddress Lib "kernel32" (ByVal hModule As LongPtr, ByVal lpProcName As String) As LongPtr Public Declare PtrSafe Function DialogBoxParam Lib "user32" Alias "DialogBoxParamA" (ByVal hInstance As LongPtr, ByVal pTemplateName As LongPtr, ByVal hWndParent As LongPtr, ByVal lpDialogFunc As LongPtr, ByVal dwInitParam As LongPtr) As Integer Dim HookBytes(0 To 5) As Byte Dim OriginBytes(0 To 5) As Byte Dim projectFunction As Long Dim Flag As Boolean Public Function GetPtr(ByVal Value As LongPtr) As LongPtr GetPtr = Value End Function Public Sub RecoverBytes() If Flag Then MoveMemory ByVal projectFunction, ByVal VarPtr(OriginBytes(0)), 6 End Sub Public Function MyDialogBoxParamater(ByVal hInstance As LongPtr, ByVal pTemplateName As LongPtr, ByVal hWndParent As LongPtr, ByVal lpDialogFunc As LongPtr, ByVal dwInitParam As LongPtr) As Integer If pTemplateName = 4070 Then MyDialogBoxParamater = 1 Else RecoverBytes MyDialogBoxParamater = MyDialogBoxParamater(hInstance, pTemplateName, hWndParent, lpDialogFunc, dwInitParam) HookFlag End If End Function Public Function HookFlag() As Boolean Dim TmpBytes(0 To 5) As Byte Dim p As Long Dim OriginProtect As Long HookFlag = False projectFunction = GetProcAddress(GetModuleHandleA("user32.dll"), "DialogBoxParamA") If VirtualProtect(ByVal projectFunction, 6, PAGE_EXECUTE_READWRITE, OriginProtect) <> 0 Then MoveMemory ByVal VarPtr(TmpBytes(0)), ByVal projectFunction, 6 If TmpBytes(0) <> &H68 Then MoveMemory ByVal VarPtr(OriginBytes(0)), ByVal projectFunction, 6 p = GetPtr(AddressOf MyDialogBoxParamater) HookBytes(0) = &H68 MoveMemory ByVal VarPtr(HookBytes(1)), ByVal VarPtr(p), 4 HookBytes(5) = &HC3 MoveMemory ByVal projectFunction, ByVal VarPtr(HookBytes(0)), 6 Flag = True HookFlag = True End If End If End Function Sub VBAProjectパスワード解除() If HookFlag Then MsgBox "VBA Project を解除しました。", vbInformation, "成功しました。" End If End Sub |
◆EXCEL-64bit版はコチラ
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 |
Public Const PAGE_EXECUTE_READWRITE = &H40 Public Declare PtrSafe Sub MoveMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As LongPtr, Source As LongPtr, ByVal Length As LongPtr) Public Declare PtrSafe Function VirtualProtect Lib "kernel32" (lpAddress As LongPtr, ByVal dwSize As LongPtr, ByVal flNewProtect As LongPtr, lpflOldProtect As LongPtr) As LongPtr Public Declare PtrSafe Function GetModuleHandleA Lib "kernel32" (ByVal lpModuleName As String) As LongPtr Public Declare PtrSafe Function GetProcAddress Lib "kernel32" (ByVal hModule As LongPtr, ByVal lpProcName As String) As LongPtr Public Declare PtrSafe Function DialogBoxParam Lib "user32" Alias "DialogBoxParamA" (ByVal hInstance As LongPtr, ByVal pTemplateName As LongPtr, ByVal hWndParent As LongPtr, ByVal lpDialogFunc As LongPtr, ByVal dwInitParam As LongPtr) As Integer Dim HookBytes(0 To 5) As Byte Dim OriginBytes(0 To 5) As Byte Dim projectFunction As LongPtr Dim Flag As Boolean Public Function GetPtr(ByVal Value As LongPtr) As LongPtr GetPtr = Value End Function Public Sub RecoverBytes() If Flag Then MoveMemory ByVal projectFunction, ByVal VarPtr(OriginBytes(0)), 6 End Sub Public Function MyDialogBoxParamater(ByVal hInstance As LongPtr, ByVal pTemplateName As LongPtr, ByVal hWndParent As LongPtr, ByVal lpDialogFunc As LongPtr, ByVal dwInitParam As LongPtr) As Integer If pTemplateName = 4070 Then MyDialogBoxParamater = 1 Else RecoverBytes MyDialogBoxParamater = MyDialogBoxParamater(hInstance, pTemplateName, hWndParent, lpDialogFunc, dwInitParam) HookFlag End If End Function Public Function HookFlag() As Boolean Dim TmpBytes(0 To 5) As Byte Dim p As LongPtr Dim OriginProtect As LongPtr HookFlag = False projectFunction = GetProcAddress(GetModuleHandleA("user32.dll"), "DialogBoxParamA") If VirtualProtect(ByVal projectFunction, 6, PAGE_EXECUTE_READWRITE, OriginProtect) <> 0 Then MoveMemory ByVal VarPtr(TmpBytes(0)), ByVal projectFunction, 6 If TmpBytes(0) <> &H68 Then MoveMemory ByVal VarPtr(OriginBytes(0)), ByVal projectFunction, 6 p = GetPtr(AddressOf MyDialogBoxParamater) HookBytes(0) = &H68 MoveMemory ByVal VarPtr(HookBytes(1)), ByVal VarPtr(p), 4 HookBytes(5) = &HC3 MoveMemory ByVal projectFunction, ByVal VarPtr(HookBytes(0)), 6 Flag = True HookFlag = True End If End If End Function Sub VBAProjectパスワード解除() If HookFlag Then MsgBox "VBA Project を解除しました。", vbInformation, "成功しました。" End If End Sub |
VBA-紹介コードの使用方法
本記事ご覧の方は、VBA開発者だと思いますので、省略気味で説明しますね。
使い方は、以下の通り。
簡単な流れ
- 新しいEXCELを開く(以下、Aファイルとする)
- マクロにPWが掛かったEXCELを開く(以下、Bファイルとする)
- Aファイル側にPW解除マクロコードをコピペ(適当な新規プロシージャに。)
- Aファイル側でPW解除コードを実行(実行するSub名:VBAProjectパスワード解除)
- Bファイル側のマクロPWが解除されている
VBA実行時の画面を貼っておきますね。
注意ポイント
尚、Bファイルを閉じてしまうとPWロックが復活してしまいますので、
もしPW自体を削除したい場合は、PWロック解除後に、
BファイルのVBE側で「ツール」→「VBAProjectのプロパティ」から設定されたパスワードを削除しましょう。
そうすればPW復活はしなくなります。
具体的には、以下のキャプチャの通りの状態にしてあげましょう。
慣れてしまえば、ササっとできてしまうと思います。
終わりに+ちょっとだけ宣伝(VBA-1週間学習記事を無料公開中)
今回はここまでとなります。
本記事が皆様のVBAライフを良い感じで充実させるものになっているのであれば、記事作成冥利につきます。
とは言っても、パスワード管理するのもメンドイですからね。。。
ちょっとだけ宣伝ですが、VBAを1週間で学習する記事も公開しています。
もちろん無料ですので、もしよろしければコチラもどうぞ。
本記事で紹介したPW解除コードも同様ですね。
もしVBA学習に迷われていたら、上記で紹介した記事をサラッと一読してみると、VBAを理解するキッカケができるかもしれません。
ちなみに、自分の記事ですが、ブックマーク登録してます。笑
「もし良ければ」という程度ですので、スルーして貰って構いません!
さて、ここまでの長文をお読みいただきありがとうございました
今後もNakamuraBlog(ナカログ)をよろしくお願いいたします。
おわり。