Excel VBAマクロ パスワード解除方法
Excel VBAでパスワードロックを解除する方法です。
VBAのパスワードロックは、ユーザーがプログラムを変更できないよう制限する為に設定するものです。しかし、時にパスワードが紛失するということがあります。「パスワードを忘れてしまった」「開発者が退職し、パスワードがわからない」などが理由として多いのではないでしょうか。
ひどい案件でVBAのパスワードがかかったまま渡され、担当者に聞いたところ「知らない」と言われて途方に暮れるプログラマーもいたと聞いたことがあります。
そんな方たちの助けになればと、VBAのパスワード解除方法を掲載しておきます。
くれぐれも悪用したり、他人の著作物を覗き見るような不正はしないでください。
全て自己責任において実施してください。当方では一切の責任を負いません。
スポンサーリンク
検証したExcelのバージョン
今回は Windows7 / Excel 2010 を使って検証しました。Excel 2007 以降であれば同じ操作で適用できると思います。
本記事の対象はOffice 32Bit版のみです。64Bit版は対象外です。
詳細なバージョン情報は「ファイル」-「アカウント」から「Excelのバージョン情報」をクリックして出てきた下記の画面で確認できます。
動作可能か事前に確認しておいてください。
VBAパスワードの解除方法
VBAのパスワードを解除するには、VBAを記述します。プログラムによって解除するというものです。
以降の操作をする前に、該当の Excel ブックはコピーしてバックアップしておいてください。ファイルが破損する可能性があります。
まず最初に、パスワードロックされている xlsm ファイルを開きます。
ここではファイル名を「locked.xlsm」としています。
「開発タブ」から「Visual Basic」を選択します。下図のように、パスワードロックがかかっていることを確認します。
次に「ファイルタブ」から「新規作成」-「空白のブック」をクリックします。
「名前を付けて保存」から、ファイルの種類を xlsm として適当な場所に保存します。
ここではわかりやすいように、「unlocked.xlsm」として保存しました。
再び VBA の画面に戻って、新規作成した xlsm ファイルを右クリックして「挿入」-「標準モジュール」をクリックします。
下図のように Module1 にソースを貼り付けます。
貼り付けるソースは以下のとおりです。
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 59 | 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 "VBA Project is unprotected!" , vbInformation, "*****" End If End Sub |
「Sub/ユーザー フォームの実行」ボタンを押下するか、「F5キー」を押下します。
「unprotected」を選んで「実行」ボタンを押下します。
このメッセージが出ればパスワードロックは解除されています。
VBA Project を開いてパスワードロックが解除されていることを確認してみましょう。
新しいブックを作ってインポート
上述の方法でパスワード解除した後、ファイルを保存して再パスワード設定しようとすると Excel が強制終了することがあります。どうやらブックに何か障害で出てしまうようですね。xls形式, xlsm形式共にNGでした。新しいブックを作ってそちらにインポートすることで解決できます。
パスワード解除した後、パスワードロックのかかったVBAプロジェクトを右クリックして「VBAProject のプロパティ」を開きます。
「保護」タブの「プロジェクトを表示用にロックする」のチェックを外します。
次に、VBAの記述されたファイルを選んで「ファイルのエクスポート」を選択します。
適当な場所に保存します。
次に、新しいブックを作って保存します。(xls形式かxlsm形式)
新規ブックの VBA プロジェクトを右クリックして「ファイルのインポート」を選びます。
先ほど保存した場所に移動し、エクスポートしたファイルを選択します。
インポートされたことを確認します。
エクスポート・インポートを使わなくても、VBAソースをコピペしても同じです。シートはExcel上でコピーすればOKですし、ThisWorkbookに何か記述していた場合もコピペでOKです。フォームを使っている場合は、エクスポート・インポートを利用しましょう。
参考サイト
まとめ
Excel VBAでパスワードロックを解除する方法を紹介しました。
「Excel シートやブックの保護パスワード解除方法」でも書きましたが、パスワード管理って安易におこなわれているケースが多いですね。企業の大小にかかわらず、担当者任せのパスワード管理となっていて、きちんと管理・共有されていないように感じられます。
特に、Excel や VBA では簡単にパスワード設定できることから、開発者が安易に変更した後、忘れてしまうこともあるようですね。
ソースを書き換えた後、パスワード設定を間違ってしまうなどのケースもあるのかな・・。
上述の方法で解除できる範囲であればいいですが、VBAの場合パスワードを紛失すると、もう一度同じものを作らなくてはならないなどの大きな損害が発生する可能性があります。
私も開発者の一人として、きちんとしたパスワード管理と、変更時の情報共有をしっかりやりたいと思います。
おつかれさまでした。
プログラミングに関することを中心にアウトプットしています。気軽にフォローしてくださいね。
おすすめコンテンツ
コメント - Thank you for the comment.
Trackback
[…] っと、いろいろ探していたら、ホームページ制作のサカエンさんの記事に助けられました。 […]
[…] Excel VBAマクロ パスワード解除方法 | ホームページ制作のサカエン(墨田区… […]
[…] ちなみに、パスワードを忘れてしまって困ったというケースでロックを解除したい場合、Excel VBAマクロ パスワード解除方法が参考になるかもしれません。こちらでは全く試していませんが、悪用厳禁ですし、32bit環境のみのようなので、当然サイトにも書かれていますが自己責任にてどうぞとなります。 […]
2016/01/31 13:45
28行目ところでエラーになる
28 pFunc = GetProcAddress(GetModuleHandleA”user32.dll”), “DialogBoxParamA”)
2016/01/31 23:53
コメントありがとうございます。お使いの環境はどのようなものでしょうか?この記事を書いた時の環境は、Windows 7 と Excel 2010 でした。
2016/02/21 08:18
ロック解除のメッセージは出ましたが、ロックは解除されていませんでした。
2016/02/22 09:02
コメントありがとうございます。お使いのPC環境はどのようなものでしょうか?こちらで検証したのはWin7, Excel 2010 32Bitです。64Bit版では正しく動作しませんのでご了承ください。
2016/02/22 16:30
PCは、MacBook Retina15インチ(2013年)で、OSはMac OSX Yosemite Version 10.10です。エクセルは、 Office for Mac 2011のExcel (32Bitだと思います)を使っています。
2016/02/22 22:25
Macですか。申し訳ないのですが、こちらには同一環境がないので検証できないです。Windows APIを使っているのおそらくMacでは動作しないものかと・・・。お知り合いの方でWindows 32Bit版 + Excel 2007/2010をご利用の方がいらっしゃれば頼んでみてはいかがでしょうか?どうしてもパスワード解除したい場合、こちらでもお引き受けできますが費用がかかりますのでご了承ください。詳しくはお問い合わせフォームよりご連絡をお願いいたします。
2016/03/24 13:41
大変役に立ちました。ありがとうございました。
2016/03/24 21:57
コメントありがとうございます。お役にたててこちらもうれしいです♪
2016/09/12 11:35
十分、助かりました。ありがとうございます。
2016/09/12 22:39
コメントありがとうございます。お役にたててこちらもうれしいです♪
2016/10/23 00:09
参考になります。
こちらで紹介されているパスワードの解析方法は、総当たりでしょうか?
APIでパスワードを直接読み取りに行くのでしょうか?
解読不可能なパスワードは存在しますか?
ご回答いただけると幸いです。
2016/10/24 23:12
コメントありがとうございます。参考サイトをベースに作っただけですので、私も細かなことまでは正直わかりません。。ご質問いただいている件で、何か不都合がありましたでしょうか?
2016/11/14 13:48
・ありがとうございました。
本当に助かりました。
ところでマクロによって一旦ロック解除になった状態で、プロジェクトのプロパティの保護を外し、
プロジェクトが開いたままの状態で保存すると、再度読み直してもロックが外れたままとなりました。
EXCEL2010/WIN7です。
2016/11/14 13:54
・先程の者です。
一見、正常になったように見えましたが、プロジェクトのプロパティがロックされたままでした。
やはり書かれているとおりに関係ファイルを吐き出して、新しく読み直すしか無さそうですね。
2016/11/14 23:09
コメントありがとうございます。そうですね、ロック解除した後は正常に見えますし、保存も問題なくできます。でも再パスワード設定する際にExcelが強制終了するんですよねー。他にも手順があるのかもしれませんが、私の方では掲載している手順しか再設定の方法が見つかりませんでした。
もっと簡単な手順を発見された方、ご存知の方、コメントお待ちしておりまーす。(知っている方は見ないかな、この記事^^;)
2016/12/28 09:33
VBA初心者で、dll等についても全く分かっていないのですが、8行目のPrivate Declare Function DialogBoxParamの変数で、pTemplateName As Longとありますが、「lpTemplateName」の方が良いのでしょうか?
参考サイトもそうなっていますね。(これから勉強させていただきます。)
2016/12/31 15:58
コメントありがとうございます。「lpTemplateName」については変数名なので、なんでも構いませんよ^^
重要なのはパスワード解除することなので、コンパイルエラーが出なければ特に意識しなくても大丈夫だと思います。
2017/03/12 15:19
こちらの環境
Excel2013(開いたのは.xls)では
64-bitでも正常に動作しました。
2017/03/13 22:47
コメントありがとうございます。本当ですか?!Declare文が32Bit版なので、64Bit版ではコンパイルエラーが出て、動作しないと思うのですが・・・><。
2017/04/15 18:34
Windows10 64bit
Excel2007 32bit
で正常に動作しました。
有難うございます。
2017/04/17 22:12
コメントありがとうございます。正常に動作できたようでこちらもうれしいです♪
2017/11/21 17:25
大変役に立ちました。ありがとうございました。
1点確認させていただきたいことですが、上記のマクロを実行した後、「保護」タブの「プロジェクトを表示用にロックする」のチェックがチェックしている状態です、そのチェックを外す方法がわかりましたら、教えてください。
2017/11/22 13:18
syoukonさん
コメントありがとうございます。お役に立ててよかったです。ご質問いただいている件ですが、「プロジェクトを表示用にロックする」のチェックが外れないという現象でしょうか?(例えばグレーアウトして非アクティブになっているとか)
当方の環境では起こっておりませんので、動作環境をご確認ください。また、追記の手順にありますように、新規ブックを作って、エクスポート・インポートをすることで解消するのではないかと思います。試してみてください。
2018/02/08 13:02
Win10(64bit)-Excel2016(32bit)試行結果、
・Excel2003.xls
・Excel2016.xlsm
BookのVBAProjectのパスワードは解除できソースコードを見る事ができました…感謝。
但し、保護:「プロジェクトを表示用にロックする」に「チェック」が入ったままでした。
願わくば「チェック」を外すコードを紹介いただけれは幸いです…宜しくお願いいたします。
2018/02/11 13:39
さくらさん
コメントありがとうございます。別の記事にて紹介しています。よろしければこちらを参考にしてみてください。Excel VBAでプロジェクトを表示用にロックするにチェックする方法
2018/02/12 14:07
早々のご回答どうも有り難うございます。
keybd_event関数での「ロック解除」の試行は…成功しました。
但しPassword既知が前提条件のようです。
欲を言えば、本「Excel VBAでパスワードロックを解除」の合わせ技として実行できる「ロック解除」のコードを提示頂けれぎ大助かりなのですが、何とぞ宜しくお願いいたします。
2018/02/12 15:23
さくらさん
合わせ技であれば双方のソースコードを一つのモジュールにまとめて、上記のunprotectedメソッド内MsgBoxの次の行に、CheckLockProjectForDisplayをCallすればいいのではないでしょうか。試してみて下さい。
2018/02/14 03:14
CheckLockProjectForDisplayをCallして試行(成功)…感謝
2018/02/15 02:55
「PERSONAL.XLSB」に登録して運用する場合、
「CheckLockProjectForDisplay」モジュール内のCall文全行に対し「Application.VBE.ActiveVBProject」を定義する事で解決しました…大丈夫と思うのですが。
With Application.VBE.ActiveVBProject
Call SendKeybdEvent(vbKeyMenu, vbKeyT)
Call SendKeybdEvent(vbKeyE)
:
Call SendKeybdEvent(vbKeyReturn)
End With
2018/02/15 22:26
さくらさん
解決したのですね、よかったです。しかし随分と遅い時間まで作業されているのですね。おつかれさまでした。
2018/02/26 01:33
saka-enさん、大変お世話になっております。
紛らわしいコメントを投稿してしまいました…次の4件を削除していただければ幸いです。
・さくら 2018/02/14 03:16 先ほどの件、継続(1)
・さくら 2018/02/14 03:27 先ほどの件、継続(3)
・さくら 2018/02/14 03:37 先ほどの件、継続(2)
・さくら 2018/02/18 00:47 ▼解決しない問題点
以上
2018/03/02 22:29
さくらさん
遅くなりましたが、ご指摘のコメント削除しましたよ。
2018/03/29 15:15
Hook関数の7行目、MoveMemory~で
VarPtrの型が一致しませんと言うコンパイルエラーが出るのですが、何かわかりますでしょうか・・・
2018/03/29 15:20
あ、環境はWindows7でExcel2016です
2018/03/29 22:26
misaさん
コメントありがとうございます。そのメッセージ、おそらく64ビット版のOfficeを利用されているのはないでしょうか(Excelメニューのファイルのアカウントからバージョン情報を見ることができます)。当ページのプログラムは32Bit版Excelのみ動作対象となっています。お近くに32Bit版Excelを利用されている方がいらっしゃれば頼んでみて下さい。当方でも作業はできますが、費用がかかりますのでご了承ください。
2018/05/03 10:51
コンパイルエラー プロシージャーの外では無効です。のエラーが出てしまします。よろしくお願いします。
2018/05/03 13:38
うまく行きました。お騒がせして申し訳ありません。
2018/05/04 22:03
蓑口さん
コメントありがとうございます。連絡が遅くなりましたが、自己解決できたようでよかったです。
2019/08/16 19:31
はじめまして。上手くできました!というか上手くできては困るのですが、パスワードを解除されない方法を探しています。そんな方法はないのでしょうか?
2019/08/16 22:30
whiteさん
コメントありがとうございます。上手くできてよかったですね。申し訳ないのですが、ご質問いただいた「パスワードを解除されない方法」については把握しておりません。もしかしたら有償のツールなら何かあるかもですが、どれほどの効果があるのか検証したこともなく。何かソースを見られたら困るケースがあるのでしょうか。VBAのパスワード設定は脆弱です。もしツールとして外部に提供するならVBA以外の言語を使うことをおすすめします。お力になれずに申し訳ありません。
2019/08/17 00:06
お返事ありがとうございます。
>>お力になれずに申し訳ありません。
いえ、これだけ詳しい方でさえも確たる方法を知らない事、VBA以外の言語のお勧め、とても参考になりました。本当に脆弱なのですね。ありがとうございました。
2019/08/18 11:48
ご回答ありがとうございます。
>>何かソースを見られたら困るケースがあるのでしょうか。
ファイルを開く時のパスワードの変更や解除をされないように「名前を付けて保存」の禁止のマクロ、とやりたいだけです。
今回の解除方法ですが、例えば、
「再び VBA の画面に戻って、新規作成した xlsm ファイルを右クリックして「挿入」-「標準モジュール」をクリックします。」という手順ですから「標準モジュール」を選択すると、あるいは単純にVBA の画面を開くとシートの数式が消える、というようなマクロはできないものでしょうか?
2019/08/19 21:45
whiteさん
コメントありがとうございます。ちょっとやりたいことの詳細が理解ができませんでしたが「名前を付けて保存」をさせたくないのであれば、VBAのThisWorkbookに、
==
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
If SaveAsUI = True Then
Call MsgBox(“名前を付けて保存は禁止!!”)
Cancel = True
Application.Quit
End If
End Sub
==
のコードを貼り付けたくらいじゃダメでしょうか。
2019/08/19 23:48
こんばんは。お返事ありがとうございます。
コードをありがとうございました。
前回の説明が解りにくかったですね。
時系列に書いてみます。
エクセルファイルにパスワードを設定した。→しかし「名前を付けて保存」からパスワードを変更、または削除されてしまう。→なので「名前を付けて保存の禁止」のマクロを作り、そしてこのマクロにパスワードをかけた。→しかしこの度の解除方法で解除されてしまう。
で、解除されてしまうのであればこのエクセルファイル自体を使えないようにできないだろうかと考えました。パスワード解除作業工程で「visual basic」をどうしても開かなければなりませんよね。そこで「visual basic」を開くとシートの数式、内容を消去してしまうマクロが発動する、そんなマクロって可能なのかな、という質問でした。
2019/08/21 20:52
whiteさん
返信遅くなりました。なかなか危険な発想ですね。個人的には誰かが喜ぶためにプログラムを書くべきであると思うので、自爆するプログラムなんて発想はちょっとできませんね。だいたいどうやって改修をかけるのか、バグとかあったら自分でも開けなくなりませんか?ソースはオープンにした方が助かる人が多いし、オープンソースってそんなエンジニア達の助け合いで出来ていると思っています。とはいえお困りのようですので、私なりにVisual Basicエディタ(VBE)を開かせない方法を考えてみました。下記のリンク先を参考にしてみてください。
Excel 開発タブを非表示にしてVBAやマクロを変更させない方法
2019/08/22 10:15
お返事ありがとうございます。
私の作成したエクセルファイルはもちろん相手に喜んでいただけるものです。しかし私の規定したい最低限のルール(パスワードを変更しない)を守ってもらえないようであれば使用不可にしたい、という考えでしたが(自爆は)危険な発想なのですね。招致いたしました。
リンク先情報ありがとうございました。
なかなか有用な方法ですね。
私の完全な理想を求めて他のプログラム言語の勉強を始めました。
エクセルは理想レベルを落としていろいろ柔軟に考えていきたいと思います。
いろいろとアドバイスありがとうございました。
2019/08/22 20:34
whiteさん
コメントありがとうございます。そうですね、VBAに偏らない方がよいかと思います。何かお手伝いできることがあれば気軽にお問い合わせください。