BOOGALOOメニュー
おしゃれな憩いの場・コミュニティサイトのnanini
nanani | 憩いの場・コミュニティサイトはこちら

「Excel – VBA」VBAプロジェクトのロック(保護)を解除されたらログを残す方法

追記:当記事のマクロが正常に動作しない方へ

VBAプロジェクトオブジェクトモデルへのアクセスを信頼するが入っていることが前提です。Excelのファイルタブオプション(その他-オプション)トラストセンタートラストセンターの設定マクロの設定 を開くとウィンドウ内に当該チェック欄がございますので、チェックを入れてOKボタンを押してください

Excel でマクロファイルを作成後、勝手にいじられると困るのでVBAプロジェクトのロック(保護)をかけます。それでもルールを守らず強引にパスワード解析などをする社内クラッカーがいます

そんな時のために、VBAプロジェクトのロック(保護)を勝手に解除する者の名前と日時をログに残す方法を教えます

業務評価にログを添付して、解雇事由に使うこともございます。参考になれば幸いです

まずはVBAプロジェクトのロック(保護)の手順をおさらいします

「Alt + F11」 を押してVBAProjectウィンドウを開きます

「ツールタブ – VBAProjectのプロパティ」 の順に選択してプロジェクトプロパティを開きます

ツールタブ - VBAProjectのプロパティ の順に選択してプロジェクトプロパティを開きます

プロジェクトプロパティの「保護タブ」を選択して、「プロジェクトを表示用にロックする」へをいれます

「パスワードと、パスワードの確認入力」へパスワード(同じもの)を入力してOKボタンをクリックします

VBAProject-プロジェクトプロパティの保護タブを選択して、プロジェクトのロック(保護)、パスワードを設定する

これでブックを保存し閉じると、以降はブックを開きVBAProjectウィンドウを開こうとするとパスワードを求められます

今回は、この設定したロック(保護)を何かしらの方法で解除された場合にログを残す方法を説明いたします

まずはログファイルを用意してください。サンプルVBAコードと一致させるために「log.txt」を用意いただければと存じます

ログファイルを作成しましたら「Alt + F11」 を押してVBAProjectウィンドウを開きます

ThisWorkbookに以下をコピーしてください。右上のアイコンをクリックしてコピー

Private Sub Workbook_BeforeClose(Cancel As Boolean)
    
    Dim userName As String '変数userNameを文字列型で宣言
    userName = Environ$("USERNAME") 'ユーザー名を取得

    On Error Resume Next
    'エラー非表示(ログ保存先がネットワーク上の時は、オフライン時にエラー表示されるため)
    
    If ThisWorkbook.VBProject.Protection <> 1 Then
    'プロジェクトが保護されていない場合、ログを残す
        Open "ここにディレクトリを書いてください\log.txt" For Append As #1 '開くログファイルを指定
        Print #1, userName & "がVBAプロジェクト保護を解除をしてからブックを閉じました。日時:" & Now 'ログファイルに書き込む文字列
        Close #1 'ログファイルを閉じる
    End If

End Sub

11行目の「ここにディレクトリを書いてください」の箇所を、実際のログファイル保存場所に書き換えてください

VBAコードを入力しましたらブックを保存してください

完了です

これでログファイルにログが書き込まれるようになりましたので、試しにVBAプロジェクトのロック(保護)パスワードを入力解除してVBAプロジェクトを開いてからブックを閉じてみてください(保存してもしなくても)

サンプルのVBAコードはネットワーク上にログファイルを置くこと想定しておりますが、PCローカルでもネットワーク上でもログファイルを置く場所はどちらでも動作します

インターネット経由で入手したOfficeファイルにはWEB符号が付きます(Mark of the Web (MOTW) )。これは、EMOTET等のマルウェア対策でMicrosoft社がセキュリティ強化のためOfficeソフトにアップデートをかけたものです。個々のユーザー環境(Officeの設定など)によりますが、インターネット経由で入手したOfficeファイルを開くと赤い警告メッセージがメッセージバーに表示されます。当該メッセージが表示されている時に、同時に当記事の「VBAプロジェクトロック(保護)解除ログ」マクロファイルを開き、閉じると、ロック(保護)解除していないのにログが残るバグを確認いたしました。誤判定をしてしまうような動作です。当情報は独自の検証結果です。海外フォーラムを調べられておりませんが、国内公開情報では見当たりませんでしたので、赤い警告メッセージが他ファイルのマクロ実行に及ぼす影響内容は不明です。赤い警告メッセージは下に表示したものです

このファイルのソースが信頼できないため、Microsoftによりマクロの実行がブロックされました。
このファイルのソースが信頼できないため、Microsoftによりマクロの実行がブロックされました。

英語:Microsoft has blocked macros from running because the source of this file untrusted.

VBAプロジェクトの保護状態を確認するために以下検証をいたしました

誤生成されるログに、VBProject.Protectionの値を合わせて書き込みするようVBAコードを修正したところ、”0″が入力されておりました。これはVBAプロジェクトのロック(保護)を解除、またはVBAプロジェクト(VBAコード)を表示している状態を表す値です

以下2ファイルを用意して当該事象をおさらい

  • Book1.xlsm:「VBAプロジェクトロック(保護)解除ログ」マクロファイル
  • Book2.xlsm:「赤い警告メッセージが表示される」マクロファイル


Book1とBook2を開き(開く順番は関係なし)、Book1を閉じるとログが誤生成されます。ただ、Book1とBook2を開き、VBAProjectウィンドウを開いてから(Alt + F11)、閉じるとログは残らずでした。Book1はBook2と当時に開いてもマクロは有効です。Book2はVBAProjectウィンドウを開くと、赤い警告メッセージ表示が消えますがマクロは無効のままです。VBAProjectウィンドウを開き、赤い警告メッセージ表示が消えた状態になるとバグ(誤動作によるログ生成)は発生しません

Debug.PrintでVBProject.Protectionの値を出力しイミディエイトウィンドウで確認 (必然的にVBAProjectウィンドウを開いている状態) すると、”1″ (保護されている状態) が表示されます。また、テーブルのA1セルにVBProject.Protectionの値を出力 (VBAProjectウィンドウを開かずに確認) しても、”1″ (保護されている状態) が表示されました

その他にも関係ないマクロを登録して実行してみたところ、赤い警告メッセージ表示が消えるマクロと、消えないマクロがございました。赤い警告メッセージ表示が消えると、他ファイルのマクロ動作でバグ(私どものケースだとVBProject.Protectionの判定)は発生せずでした。VBAに明るい方であれば働きかけを分類したマクロを数種類実行し、結果を分析すれば今回起きている事象を説明できるかもしれません

個人的には、VBAプロジェクトオブジェクトモデルへのアクセスを拒否している状態と予想しております

Officeのアップデートでもバグは様々発生します、イレギュラー時に誤動作されるのが困る、信頼性100%を求めたい場合には今回の方法はおすすめできません。否認防止ではなく、コードを見られても解読不可にしたい場合は難読化・暗号化の検討をおすすめします

いかがでしょうか。一助になれば幸いです

この記事が気に入ったら
フォローしてね!

  • URLをコピーしました!
  • URLをコピーしました!
おしゃれな憩いの場・コミュニティサイトのnanini

この記事を書いた人

BOOGALOO BOOGALOO ブガルー代表

憩いの場・コミュニティサイト
nanini を開発いたしております
左のリンクボタンからどうぞ↓🙏

目次