【ExcelVBA・マクロ】VBAプロジェクトにパスワードを設定する方法|SendKeysでコードを保護する仕組みと限界【コピペOK】

ExcelVBA

社内で配布するExcelツールのマクロを、他の人に見られたり改変されたりしたくない――そう考えたことがある方は多いと思います。VBEの画面から手動でパスワードを設定することはできますが、配布用ファイルを量産する場合は、この設定作業も自動化できると効率的です。

この記事では、VBAプロジェクトにパスワードを設定する仕組みと、SendKeysを使って自動設定するマクロを紹介します。あわせて、この方法の限界についても正直に解説します。

スポンサーリンク
スポンサーリンク

VBAプロジェクトのパスワード保護とは

「VBAProjectのプロパティ」ダイアログにある「保護」タブから、「プロジェクトを表示用にロックする」にチェックを入れてパスワードを設定すると、次回ファイルを開いたときにVBEの画面(コード)を見るためにパスワード入力が必要になります。

これにより、マクロの中身を他人にコピーされたり、うっかり編集されたりするのをある程度防ぐことができます。

なぜVBAオブジェクトから直接パスワードを設定できないのか

VBAにはVBProjectオブジェクトのProtectionプロパティがありますが、これは現在の保護状態を取得できるだけの読み取り専用プロパティで、パスワードを書き込む手段は用意されていません。

Debug.Print ThisWorkbook.VBProject.Protection
' 0 = vbext_pp_none(保護なし)
' 1 = vbext_pp_locked(保護あり)

VBAの正式なオブジェクトモデルには「パスワードを設定するメソッド」自体が存在しないため、パスワードを設定するには、VBE上のダイアログ操作をSendKeysでキー入力として自動再現する、という少し変則的な方法を取る必要があります。

事前準備:VBAプロジェクトオブジェクトモデルへのアクセスを信頼する

Application.VBEを使ってVBEを操作するには、事前に以下の設定を有効にしておく必要があります。

  1. Excelの「ファイル」タブ →「オプション」を開く
  2. 「トラストセンター」→「トラストセンターの設定」を開く
  3. 「マクロの設定」を選択し、「VBAプロジェクトオブジェクトモデルへのアクセスを信頼する」にチェックを入れる

この設定はセキュリティに関わるため、マクロから自動でオンにすることはできません。配布前に手動で有効化しておく必要がある点に注意してください。

SendKeysでパスワードを自動設定するマクロ

事前準備が済んだら、以下のマクロでパスワード設定を自動化できます。

Sub ProtectVBAProjectWithPassword()

    Dim vbProj As Object
    Dim password As String

    password = "P@ssw0rd123"

    Set vbProj = Application.VBE.ActiveVBProject

    ' すでに保護済みの場合は処理しない
    If vbProj.Protection = 1 Then
        MsgBox "このプロジェクトはすでに保護されています。"
        Exit Sub
    End If

    ' VBEを表示し、「VBAProjectのプロパティ」ダイアログを開く
    Application.VBE.MainWindow.Visible = True
    Application.VBE.CommandBars(1).FindControl(ID:=2578).Execute

    Application.Wait Now + TimeValue("0:00:01")

    ' 「保護」タブへ切り替えてパスワードを入力する
    SendKeys "^{TAB}", True                        ' 保護タブへ切り替え
    SendKeys " ", True                              ' 「プロジェクトを表示用にロックする」にチェック
    SendKeys password & "{TAB}" & password, True    ' パスワードと確認用パスワードを入力
    SendKeys "~", True                              ' OKボタンを押す(Enterキー相当)

    Application.Wait Now + TimeValue("0:00:01")

    MsgBox "パスワード保護を設定しました。ファイルを上書き保存後、一度閉じて開き直して確認してください。"

End Sub

コードの流れ

  1. vbProj.Protectionで既に保護されていないか確認する
  2. Application.VBE.CommandBars(1).FindControl(ID:=2578).Executeで「VBAProjectのプロパティ」ダイアログを開く(IDはVBEツールバーの「VBAProjectのプロパティ…」に割り当てられたコントロールIDです)
  3. ダイアログが開いたタイミングでSendKeysを使い、「保護」タブへの切り替え・チェックボックスのオン・パスワード入力・OKボタン押下を順番に再現する
  4. 設定後はファイルを保存し、一度閉じて開き直すことで保護が反映される

Application.Waitでダイアログが開くまでの待機時間を入れているのは、ダイアログの表示前にSendKeysが実行されてしまい、キー入力が別のウィンドウに送られてしまう事故を防ぐためです。

実行時の注意点

  • 保存して閉じ直すまで保護は反映されません。 マクロ実行直後にVBEを開いても、まだロックされていないように見えるのは正常な動作です。
  • 実行中は他の操作をしない。 SendKeysはアクティブなウィンドウにキー入力を送るだけの仕組みのため、実行中に別のウィンドウをクリックするとパスワードが意図しない場所に入力されてしまいます。
  • Excelのバージョンによってダイアログの構成が異なる場合があります。 コントロールIDやタブの切り替え回数がずれる場合は、実際にVBEを手動操作しながらキー操作を調整してください。

この方法の限界

正直にお伝えすると、この方法には次のような限界があります。

  • VBAプロジェクトのパスワード保護は、市販の解析ツールを使えば比較的容易に解除できることが知られており、本格的なセキュリティ対策にはなりません。あくまで「うっかり閲覧・編集されるのを防ぐ」程度の抑止力と考えてください。
  • SendKeysはUI操作をそのまま再現する仕組みのため、実行環境(Excelのバージョン・画面解像度・言語設定など)によって動作が不安定になることがあります。大量のファイルに一括適用する前に、必ずテスト環境で動作確認をしてください。
  • 本当に重要なロジックや機密情報を扱う処理は、VBAで完結させずに外部のサーバーサイド処理に任せるなど、根本的な設計から見直すことも検討しましょう。

まとめ

今回は、VBAプロジェクトにパスワードを設定する仕組みと、SendKeysを使った自動化マクロを紹介しました。

  • VBProject.Protectionは読み取り専用で、パスワードの書き込みには使えない
  • パスワード設定にはVBEダイアログの操作をSendKeysで再現する必要がある
  • 事前に「VBAプロジェクトオブジェクトモデルへのアクセスを信頼する」設定を有効化しておく
  • 保護は解析ツールで解除され得るため、あくまで簡易的な抑止力として利用する

配布用ファイルを量産する場面では便利なテクニックですが、限界を理解した上で、必要に応じて他の対策と組み合わせて活用してください。

スポンサーリンク
スポンサーリンク
ExcelVBA
シェアする
いがぴをフォローする

コメント

タイトルとURLをコピーしました