まるで魔法!!簡単ExcelVBAのプロジェクトロックをさらっと解除する方法。本当は教えたくない!?いたずら厳禁の簡単解決法

今回は、EXCEL VBAで困った時に役立つ「VBAプロジェクトのロック解除コード」をご紹介しちゃいます。

※今回ご紹介するコードは、私が開発したものではありません。

流用元はすでに削除されていましたので、改めて掲載させていただきました。

また、現在「Office 365 Business バージョン1901(ビルド 11231.20174)」

では、動作しないことを確認していますので、ご注意下さい。

VBAでプログラミングをしていると、コードの保護をするためにプロジェクトをロックすることがあります。

主な目的は誰かが勝手にコードを変更して、エラーなどのトラブルにならないように行ったりするためにロックしますが、実はこれがくせ者なんです。

プログラミングしている人が一人であれば良いんですが、その人が退職したりロックの解除用パスワードを伝え忘れたりしていると、後任の人は基になるExcelを改良したり、作り変えたり出来ないのでこれがトラブルの原因になります。

なにせコードが見られない。ということは最初から同じものを作り直さなくてはいけない可能性が高くなってしまいます。

こうなると、相当の時間使うことになってしまいます。

それに同じものが作れるとは限らないです。

これは、会社にとっても後任の方にとっても大きな損失にですよね。

そんな時は、これから紹介する方法を試してみて下さい。VBAプロジェクトを解除できる可能性があります。

それでは、早速本編に行ってみましょう!!

VBAのプロジェクトのロックを解除するコードはこれだ!!(64bit対応版)

いきなりですが、64bit版のExcelを使っていてロックが掛かって困っている場合は、次の2つのコードをそれぞれのモジュールにコピペしてコードを実行してみましょう。

上手くいけば実行するだけで、ロックを外してくれる優れたプログラムです。

※このコードを実行する時は、必ずロックを解除したいファイルのバックアップをして下さい。もしもに備えることが大切です。 

【実行するコード (モジュール1) 】

Option Explicit

Sub unprotected()
    If Hook Then
        MsgBox "VBA Project is unprotected!", vbInformation, "*****"
    End If
End Sub

【セットで記述するコード(モジュール2)】

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

Public 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

【コードに関する補足】

今回、コードの内容( セットで記述するコード(モジュール2) )の表記の問題をご指摘いただきました。

原因と解決法が分かりましたので、同じようなトラブルで悩まれている方は参考にしてみて下さいね。

《問題点》「&」→「 &amp; 」と表示されてしまう

《原因》「SyntaxHighlighter Evolved」というプラグインの影響

《解決法》基本的には、作者様に対応していただけることを待ちますが、「functions.php」にコードを書くことで一時的ですが解決出来ます。

尚、問題が発生していた部分は「ハイライト表示」にしてありますのでコピペし直すか、コピペ済みの方はお手数ですが置換機能などで修正して下さい。

▼ 「functions.php」の追記に必要なコードはこちらです。

function kagg_syntaxhighlighter_precode( $code, $atts, $tag ) {
    if ( 'code' === $tag ) {
        $code = wp_specialchars_decode( $code );
    }
    return $code;
}
add_filter( 'syntaxhighlighter_precode', 'kagg_syntaxhighlighter_precode', 10, 3 );

同じ悩みを持っている方は参考にしてみてくださいね。

使い方を確認してロックを解除しよう

使い方は、シンプル

  1. 解除したいEXCELファイルを開きます。
  2. 作成したロック解除用のEXCELファイルを開いておきます。
  3. ロック解除ファイルの『unprotected』というプログラムを実行します。
  4. 下記のメッセージボックスが表示されればプログラムのロックは解除されます。

ちょっと分かり辛いので今回は動画を用意したので見てみて下さい。

※事前にロックが掛かっているファイルと新規のExcelファイルを2つ開いておきましょう。
コードを記入したファイル(解除用のExcel)でマクロを実行するとロックを解除することが出来ます。

最後の仕上げを忘れずに

ふぅ~。無事ロックを解除することに成功しました。

これで次回からは、コードを改良してサクサク便利なプログラムが書けそうだ。

そう思って上書き保存して安心してはダメです。

ここでポイントが1つあります。

このプログラムは、ロックを解除してくれるのは良いんですが、暗証番号の削除まではしてくれません。

では、何も対策せず保存してもう一度ファイルを開くと、どうなるんでしょう?

答えは… … … 。

ファイルを開いた時にまたロックされてしまいます。

そんなときは一度、暗証番号を削除しておきましょう。

その後に新しいパスワードでロックすれば、安全性は上がっても心配は減ります。

もちろん、暗証番号を設定しなくても使うことは出来るので、そのままでもOKです。

じゃあ、どうすれば暗証番号を削除出来るのか?

答えは簡単です。順を追って説明しますね。

事前にロック解除済みのExcelを開いてVBEの画面を表示しておいて下さい。

①「ツール」→「VBAProjectのプロパティ(E)…」をクリックします

②「保護タブ」のプロジェクトロックの「プロジェクトを表示用にロックする(V)」のチェックを外します。

③2ヶ所のパスワードを両方とも削除します。

④「OK」ボタンをクリックします。

⑤上書き保存をして完了です。

すごく簡単でしたよね

これをしないと、何度も保護の解除をしなくてはいけません。

忘れずに最後の仕上げをしましょう!!

まとめ

今回のお話は以上です。

私も以前ロックが掛かったマクロ有効ブックで同じ目にあったのでこの方法で解決しました。

本当に困った時にこの方法を使ってみましょう。

きっと助けてくれますよ。

但し、悪用は厳禁です。

意図的にコードを削除したり、書き換えたりすれば大切なデータが壊れてしまったり、下手にいじってプログラム自体を壊してしまわないように注意しましょう。

プログラムというのは、良い使い方をすれば多くの人を助けてくれる素晴らしいものですが、悪いことに使おうと思えばコンピューター・ウイルスです。

今回紹介したコードは、64bit(64ビット)というタイプにも対応しているプログラムです。

実は、Excel(Office)には、32bit版と64bit版があります。

64bit版の特徴は、平たく言うとたくさんの情報を扱う時に処理速度が向上する大容量ファイル 対応 タイプのExcelです。

あまり大きな容量のファイルを扱うことは、実務ではそんなに無いので、通常は32bit版を使われる方が多いかと思いますが、私のように多くの情報を扱うことがある場合は、64bit版の方が良いですね。

もし、上手くいかない場合や作り方が分からない場合は相談して下さい。

分かる範囲で回答します。

コメント・各SNSなんでも大丈夫です。お気軽にどうぞ。

今回も最後まで読んでいただきありがとうございました。

それではまた次回お会いしましょう。じゃあね。

3 件のコメント

  • 【セットで記述するコード(モジュール2)】にあるソースコードにおいて
    &を&に修正しないとそのままコピペしてEXCELの標準モジュールに張り付けてもコンパイルエラーとなります。

    • gyokusen_sinceさん
      こんにちは

      気楽生活管理人の鶴谷です。
      モジュール2の「&」→「&」になってコンパイルエラーになってしまう件のご指摘ありがとうございます。

      結論から言うと、今回の原因はソースコードの表示用プラグインの仕様に問題があったことが分かりました。
      再調整をしたところ、表記の問題は解決出来たと思います。(私も再度コピペを行いコンパイルエラーにはならないことを確認しました)
      詳細は、後ほど記事内容に追記する予定ですので、そちらで確認をお願いします。

      教えて下さり、ありがとうございました。

    • Web上ではアンパサントは&amp;と書いても&になってしまうようですね。
      そのあたりで発生した問題なのでしょうか?
      VBE上で張り付けた後に置換をすれば解決します。

  • コメントを残す

    メールアドレスが公開されることはありません。 * が付いている欄は必須項目です