【実務・中級編】【プロフェッショナル】WithEventsでApplicationのPresentationClose直前イベントを監視し、特定の「社外秘」タグを持つプレゼンテーションが閉じられる前に、自動的に一時ファイルを暗号化してローカルに退避させるセキュリティシステム – PowerPoint VBA解析バイブル

スポンサーリンク

【PowerPoint VBA】Applicationレベルのイベントフックで実現する「社外秘」自動検閲システムの設計思想

PowerPointの自動化において、多くのエンジニアが犯す過ちは「個別のマクロ」を作ることだ。ボタンを押して実行するだけのツールは、ユーザーが「実行を忘れた」瞬間に無力化する。

真の自動化エンジニアは、「イベント駆動」と「アプリケーションのライフサイクル」を掌握する。

今回は、特定のタグが付与されたプレゼンテーションが閉じられる際、自動的にセーフティネットを発動させる「セキュリティ・ガーディアン」の設計について、プロフェッショナルの視点から解説する。

—

なぜ「WithEvents」なのか?

VBAの`ActivePresentation`に依存したコードは脆弱だ。ユーザーがファイルを切り替えた瞬間にポインタがずれ、意図せぬファイルを操作するリスクがある。

Applicationレベルのイベントを監視する`WithEvents`を使えば、PowerPointプロセス全体を監視下に置ける。これにより、ユーザーが意識せずとも「閉じる」というトリガーに対して、システムの強制力を介入させることが可能になる。

—

堅牢な実装のためのアーキテクチャ

本システムを構築するには、クラスモジュールを利用した「イベントリスナー」の設計が不可欠だ。

1. クラスモジュール:`AppEventClass`

まずはApplicationイベントをキャプチャする窓口を作る。

‘ クラスモジュール名: AppEventClass
Public WithEvents App As Application

‘ Presentationが閉じられる直前のイベント
Private Sub App_PresentationBeforeClose(ByVal Pres As Presentation, Cancel As Boolean)
‘ 1. 「社外秘」タグの有無を判定
If Pres.Tags(“SecurityLevel”) = “Secret” Then
‘ 2. バックアップ生成処理を呼び出し
If Not PerformSecureBackup(Pres) Then
‘ バックアップ失敗時は閉じる操作をキャンセル
MsgBox “セキュリティ保護のため、ファイルを閉じられません。管理者に連絡してください。”, vbCritical
Cancel = True
End If
End If
End Sub

2. 標準モジュール:システムの初期化

Applicationオブジェクトは、宣言しただけでは機能しない。生存期間を維持する仕組みが必要だ。

‘ 標準モジュール
Dim myAppEvents As AppEventClass

Sub InitializeSecuritySystem()
‘ インスタンスを永続化(これが消えると監視が停止する)
Set myAppEvents = New AppEventClass
Set myAppEvents.App = Application
End Sub

—

プロフェッショナルが守るべき3つの鉄則

① 競合を避けるエラーハンドリング

`BeforeClose`イベント内でファイル操作を行う際は、必ず`On Error GoTo`で例外をキャッチせよ。ファイルロックやディスクフル等の予期せぬ事態で`Cancel = True`に失敗すると、最悪の場合PowerPointがクラッシュする。

② 暗号化と退避の非同期性

ファイルを暗号化する際、重い処理をメインスレッドで行うとUIが固まる。小規模なファイルなら問題ないが、数百MBのプレゼンでは別プロセスを叩くか、API連携でクラウドストレージへ投げる設計を推奨する。

③ タグの信頼性

`Tags`プロパティは非常に強力だが、ユーザーが手動で編集可能である点に注意が必要だ。重要なデータであれば、`CustomDocumentProperties`と併用し、二重検証を行うのが企業グレードのセキュリティだ。

—

実装例:セキュアバックアップの核心

Private Function PerformSecureBackup(Pres As Presentation) As Boolean
On Error GoTo ErrHandler
Dim backupPath As String
backupPath = “C:\SecureArchive\” & Pres.Name & “_” & Format(Now, “yyyymmdd_hhnnss”) & “.bak”

‘ 簡易的な退避(実際にはここでAES暗号化ライブラリ等を介在させる)
Pres.SaveCopyAs backupPath

‘ ログ記録等(FileSystemObjectでテキストに追記)
Debug.Print “Secure backup created at: ” & backupPath

PerformSecureBackup = True
Exit Function

ErrHandler:
PerformSecureBackup = False
End Function

—

最後に:自動化の真髄

「コピペして動いた」で満足してはいけない。本システムを導入する際、最も重要なのは「ユーザーの操作を阻害しないこと」だ。

セキュリティが厳しすぎて作業効率が落ちれば、ユーザーは必ずマクロを無効化する。今回のような「閉じる瞬間」というイベントの活用は、ユーザー体験(UX)を損なわずに安全性を担保できる、最もスマートな解の一つだ。

次にあなたが取り組むべきは、このバックアップファイルを「誰が閲覧したか」のアクセスログをDB化し、Power BIで可視化するフェーズだ。VBAは、そのための強力な「末端のゲートウェイ」になり得る。

さあ、現場の技術力を証明せよ。あなたのコードが、企業の機密を守る盾となることを期待している。

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