Excel VBAマクロ パスワード解除方法 ホームページ制作 | 墨田区

Excel VBAマクロ パスワード解除方法

LINEで送る
Pocket

Excel VBAでパスワードロックを解除する方法をご紹介します。

VBAのパスワードロックは、ユーザーがプログラムを変更できないよう制限する為に設定するものですね。しかし、時にパスワードが紛失するということがあります。「パスワードを忘れてしまった」「開発者が退職し、パスワードがわからない」などですね。

ひどい案件でVBAのパスワードがかかったまま渡され、担当者に聞いたところ「知らない」と言われ、途方に暮れるプログラマーもいたと聞いたことがあります。

そんな方たちの助けになればと、VBAのパスワード解除方法を掲載しておきます。
くれぐれも悪用したり、他人の著作物を覗き見るような不正はしないでください。

※全て自己責任において実施してください。当方では一切の責任を負いません。




【PR】マジか?!「アレ」してるLINEスタンプっていったい・・・


検証したExcelのバージョン

今回は Windows7 / Excel 2010 を使って検証しました。
Excel 2007 以降であれば同じ操作で適用できると思います。
※Windows 32Bit版のみ動作可能です。64Bit版は対象外です。


VBAパスワードの解除方法

VBAのパスワードを解除するには、VBAを記述します。
プログラムによって解除するというものです。
※以降の操作をする前に、該当の Excel ブックはコピーしてバックアップしておいてください。ファイルが破損する可能性があります。

まず最初に、パスワードロックされている xlsm ファイルを開きます。
※ここではファイル名を「locked.xlsm」としています。

「開発タブ」から「Visual Basic」を選択します。
下図のように、パスワードロックがかかっていることを確認します。
VBA Project パスワードロック確認

次に「ファイルタブ」から「新規作成」-「空白のブック」をクリックします。
Excel 空白のブック新規作成

「名前を付けて保存」から、ファイルの種類を xlsm として適当な場所に保存します。
※ここではわかりやすいように、「unlocked.xlsm」として保存しました。
ファイルの種類をxlsmで保存

再び VBA の画面に戻って、新規作成した xlsm ファイルを右クリックして「挿入」-「標準モジュール」をクリックします。
VBA 標準モジュールの挿入


下図のように Module1 にソースを貼り付けます。
VBA Module1にソースを貼り付け

貼り付けるソースは以下のとおりです。

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キー」を押下します。
VBA Sub/ユーザー フォームの実行

「unprotected」を選んで「実行」ボタンを押下します。
VBA unprotectedを実行

このメッセージが出ればパスワードロックは解除されています。
VBAパスワードロックは解除

VBA Project を開いてパスワードロックが解除されていることを確認してみましょう。
VBA パスワードロック解除の確認


参考サイト

Is there a way to crack the password on an Excel VBA Project – Stack Overflow


まとめ

Excel シートやブックの保護パスワード解除方法」でも書きましたが、パスワード管理って安易におこなわれているケースが多いですね。企業の大小にかかわらず、担当者任せのパスワード管理となっていて、きちんと管理・共有されていないように感じられます。

特に、Excel や VBA では簡単にパスワード設定できることから、開発者が安易に変更した後、忘れてしまうこともあります。
※ソースを書き換えた後、パスワード設定を間違ってしまうなどのケースもあるのかな・・。

VBAの場合、パスワードを紛失すると、もう一度同じものを作らなくてはならないなどの大きな損害が発生する可能性があります。
※上述の方法で解除できる範囲であればいいですが・・・。

私も開発者の一人として、きちんとしたパスワード管理と、変更時の情報共有をしっかりやりたいと思います。


追記

上述の方法でパスワード解除した後、ファイルを保存して再パスワード設定しようとすると Excel が強制終了することがわかりました。どうやらブックに何か障害で出てしまうようですね。xls形式, xlsm形式共にNGでした。新しいブックを作ってそちらにインポートすることで解決できそうです。

パスワード解除した後、パスワードロックのかかったVBAプロジェクトを右クリックして「VBAProject のプロパティ」を開きます。
VBAパスワード解除 VBAProjectのプロパティを開く

「保護」タブの「プロジェクトを表示用にロックする」のチェックを外します。
VBAパスワード解除 「プロジェクトを表示用にロックする」のチェックを外す

次に、VBAの記述されたファイルを選んで「ファイルのエクスポート」を選択します。
VBAパスワード解除 ファイルのエクスポート

適当な場所に保存します。
VBAパスワード解除 VBAファイル保存

次に、新しいブックを作って保存します。(xls形式かxlsm形式)
新規ブックの VBA プロジェクトを右クリックして「ファイルのインポート」を選びます。
VBAパスワード解除 VBAファイルのインポート

先ほど保存した場所に移動し、エクスポートしたファイルを選択します。
VBAパスワード解除 VBAファイルの選択

インポートされたことを確認します。
VBAパスワード解除 VBAファイルインポートの確認

エクスポート・インポートを使わなくても、VBAソースをコピペしても同じです。シートはExcel上でコピーすればOKですし、ThisWorkbookに何か記述していた場合もコピペでOKです。フォームを使っている場合は、エクスポート・インポートを利用しましょう。


おつかれさまでした。

LINEで送る
Pocket

この記事がお役に立ちましたら シェア をお願いいたします。

Office / VBAの勉強が思うように進まないときは!

Office / VBAの勉強が思うように進まないのであれば、プロに直接質問ができる プログラミングスクール を検討してみてはいかがでしょうか?プログラミングスクールに申し込めば、短期間で一定のスキルを身に着けることができます!

Office / VBAコースあり!未経験者にウケてる KENスクール パソコンスクール・パソコン教室 【KENスクール】個別指導のWeb-DTP・OA・IT PCスクール

理解度や学習ペースに合わせて、一人ひとりが納得して前進できる授業を提供してくれるのが特徴です。特に課題製作は現場さながらで、実務に即したものとなっていますので短期でのスキルアップが望めます。自宅学習のサポートも充実していて、授業内容をいつでもビデオで振り返ることができるのもうれしいですね。好きな時間に好きな場所で、無理なくスケジューリングできるので、仕事の忙しい方でも柔軟に学ぶことができますよ。

更にさらに、なんと 就職サポート をしてくれるというのですから驚きです!!

履歴書の書き方から面接指導、求人の紹介など、具体的な就職先まで提案してくれるんです!私も「もっと早く出会いたかったなぁー、こんなスクール」・・・って思っちゃいました^^

東京・神奈川・愛知・大阪を営業エリアとされています。
まずは気軽に 無料体験予約 に申し込んでみるのもアリですよ。


コメント - Thank you for the comment.

  1.  

    28行目ところでエラーになる

    28 pFunc = GetProcAddress(GetModuleHandleA”user32.dll”), “DialogBoxParamA”)

    返信

     
    •  

      コメントありがとうございます。お使いの環境はどのようなものでしょうか?この記事を書いた時の環境は、Windows 7 と Excel 2010 でした。

      返信

       
  2. 佐藤一利

    2016/02/21 08:18

     

    ロック解除のメッセージは出ましたが、ロックは解除されていませんでした。

    返信

     
    •  

      コメントありがとうございます。お使いのPC環境はどのようなものでしょうか?こちらで検証したのはWin7, Excel 2010 32Bitです。64Bit版では正しく動作しませんのでご了承ください。

      返信

       
  3. 佐藤一利

    2016/02/22 16:30

     

    PCは、MacBook Retina15インチ(2013年)で、OSはMac OSX Yosemite Version 10.10です。エクセルは、 Office for Mac 2011のExcel (32Bitだと思います)を使っています。

    返信

     
    •  

      Macですか。申し訳ないのですが、こちらには同一環境がないので検証できないです。Windows APIを使っているのおそらくMacでは動作しないものかと・・・。お知り合いの方でWindows 32Bit版 + Excel 2007/2010をご利用の方がいらっしゃれば頼んでみてはいかがでしょうか?どうしてもパスワード解除したい場合、こちらでもお引き受けできますが費用がかかりますのでご了承ください。詳しくはお問い合わせフォームよりご連絡をお願いいたします。

      返信

       
  4. 香西隆

    2016/03/24 13:41

     

    大変役に立ちました。ありがとうございました。

    返信

     
    •  

      コメントありがとうございます。お役にたててこちらもうれしいです♪

      返信

       
  5. 日暮里ななし

    2016/09/12 11:35

     

    十分、助かりました。ありがとうございます。

    返信

     
    •  

      コメントありがとうございます。お役にたててこちらもうれしいです♪

      返信

       
  6. 田端ななし

    2016/10/23 00:09

     

    参考になります。
    こちらで紹介されているパスワードの解析方法は、総当たりでしょうか?
    APIでパスワードを直接読み取りに行くのでしょうか?

    解読不可能なパスワードは存在しますか?
    ご回答いただけると幸いです。

    返信

     
    •  

      コメントありがとうございます。参考サイトをベースに作っただけですので、私も細かなことまでは正直わかりません。。ご質問いただいている件で、何か不都合がありましたでしょうか?

      返信

       
  7. ポンプ屋

    2016/11/14 13:48

     

    ・ありがとうございました。
     本当に助かりました。

     ところでマクロによって一旦ロック解除になった状態で、プロジェクトのプロパティの保護を外し、
    プロジェクトが開いたままの状態で保存すると、再度読み直してもロックが外れたままとなりました。
    EXCEL2010/WIN7です。

    返信

     
  8. ポンプ屋

    2016/11/14 13:54

     

    ・先程の者です。
     一見、正常になったように見えましたが、プロジェクトのプロパティがロックされたままでした。
    やはり書かれているとおりに関係ファイルを吐き出して、新しく読み直すしか無さそうですね。

    返信

     
    •  

      コメントありがとうございます。そうですね、ロック解除した後は正常に見えますし、保存も問題なくできます。でも再パスワード設定する際にExcelが強制終了するんですよねー。他にも手順があるのかもしれませんが、私の方では掲載している手順しか再設定の方法が見つかりませんでした。

      もっと簡単な手順を発見された方、ご存知の方、コメントお待ちしておりまーす。(知っている方は見ないかな、この記事^^;)

      返信

       

コメントを残す

お名前 (必須)
メールアドレス
(アドレスは公開されません)

コメント(必須)

Trackback URL