理由はさておきVBAのパスワードを解除したいことありませんか?
古くはバイナリエディタを使ってパスワードを強制変更している時代もありましたが今はプログラム実行するだけで解除できます
悪用厳禁ではありますが困った時はお試しください
※解除に使うプログラムは下部にあります
解除手順
細かい操作みたいなものはないのでサクッと手順をまとめました
パスワード解除手順
- STEP1パスワード解除したいエクセルファイルを開く
とりあえず対象ファイルを開いておきます
- STEP2新規ファイルを作成
プログラムを実行するためのファイルを作ります
- STEP3新規ファイルでモジュールを作成
新規ファイルに標準モジュールを挿入して所定のプログラムを貼り付ける
(プログラムは下部にあります)
- STEP4貼り付けたプログラムを実行
無事プログラム実行できれば解除完了!
パスワードを入力しないと展開されないはずのプロジェクトが開けるようになっています
操作動画
手順を動画化しただけですが文字だけで伝わらない時は参考にどうぞ
注意点
この手順を使っても完全にパスワード解除することはできません
上書き保存をしたとしてもファイルを閉じて開きなおすとまたパスワードが適用されているので”パスワードを解除する”と言うより”こっそり見る”方がしっくりするかもしれないです
“Screenpresso”のPR
↑のように画面操作を動画にするなら”Screenpresso”がオススメです!
https://www.screenpresso.com/ja
保護解除プログラム
実際に使うプログラムはコチラなのでコピペでどうぞ↓↓
Option Explicit
Private Const PAGE_EXECUTE_READWRITE = &H40
Private Declare PtrSafe Sub MoveMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As LongPtr, Source As LongPtr, ByVal Length As LongPtr)
Private Declare PtrSafe Function VirtualProtect Lib "kernel32" (lpAddress As LongPtr, ByVal dwSize As LongPtr, ByVal flNewProtect As LongPtr, lpflOldProtect As LongPtr) As LongPtr
Private Declare PtrSafe Function GetModuleHandleA Lib "kernel32" (ByVal lpModuleName As String) As LongPtr
Private Declare PtrSafe Function GetProcAddress Lib "kernel32" (ByVal hModule As LongPtr, ByVal lpProcName As String) As LongPtr
Private 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 pFunc As LongPtr
Dim Flag As Boolean
Private Function GetPtr(ByVal Value As LongPtr) As LongPtr
GetPtr = Value
End Function
Private Sub RecoverBytes()
If Flag Then MoveMemory ByVal pFunc, ByVal VarPtr(OriginBytes(0)), 6
End Sub
Public Function Hook() As Boolean
Dim TmpBytes(0 To 5) As Byte
Dim p As LongPtr
Dim OriginProtect As LongPtr
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 LongPtr, ByVal pTemplateName As LongPtr, ByVal hWndParent As LongPtr, ByVal lpDialogFunc As LongPtr, ByVal dwInitParam As LongPtr) As Integer
If pTemplateName = 4070 Then
MyDialogBoxParam = 1
Else
RecoverBytes
MyDialogBoxParam = DialogBoxParam(hInstance, pTemplateName, hWndParent, lpDialogFunc, dwInitParam)
Hook
End If
End Function
Public Sub VBAProjectパスワード解除()
If Hook Then
MsgBox "VBAProjectのパスワード解除成功!", vbInformation, "Congratulations"
End If
End Sub
あとがき
VBAパスワード解除方法は調べればいくつか方法があるようですが、こんかいの方法が一番簡単な気がします
コメント