【極限のVBA】PowerPointの「保存」を掌握せよ:PresentationBeforeSaveによる強制セキュリティ・ゲートキーパーの実装
業務自動化エンジニアとして多くの現場を見てきたが、最も「穴」になりやすいのは、エンドユーザーのPC内に放置された機密情報の取り扱いだ。どれだけ強力なDLP(データ漏洩防止)ソリューションを導入しても、ユーザーが「保存」ボタンを押す瞬間の挙動を制御できなければ、漏洩のリスクはゼロにならない。
今回は、アドイン(.ppam)を活用し、PowerPointの保存プロセスに介入してセキュリティ基準を満たさないファイルを強制ブロックするという、極めて実戦的なアーキテクチャを伝授する。
1. なぜ「BeforeSave」をフックする必要があるのか
多くのエンジニアは、保存後のファイルに対して「ファイル監視」や「バッチ処理」で事後対応しようとする。しかし、それは「事故が起きた後の検閲」に過ぎない。
`PresentationBeforeSave` イベントをフックすることで、以下のメリットが生まれる。
- 即時性: 保存処理そのものを中断するため、ディスクに違反データが書き込まれるのを未然に防げる。
- 強制力: ユーザーに修正を促すフローを組み込むことで、コンプライアンス意識を強制的に向上させられる。
- 軽量性: 別プロセスの監視ツールを常駐させる必要がなく、Officeの標準イベントのみで完結する。
—
2. 実装の設計指針:クラスモジュールによるイベント制御
VBAでイベントをフックする場合、標準モジュールではなく「クラスモジュール」で `Application` オブジェクトを `WithEvents` として宣言するのが鉄則だ。これを行わないと、アドインの読み込み時にイベントを捕捉できない。
手順
1. VBAエディタで「クラスモジュール」を追加し、名前を `EventClass` とする。
2. 以下のコードを記述する。
‘ — クラスモジュール: EventClass —
Public WithEvents App As Application
Private Sub App_PresentationBeforeSave(ByVal Pres As Presentation, Cancel As Boolean)
‘ セキュリティチェックを実行
If Not IsSecurePresentation(Pres) Then
‘ 保存を強制キャンセル
Cancel = True
MsgBox “【セキュリティ警告】” & vbCrLf & _
“スライド内に禁止キーワードが含まれているか、機密タグが不足しています。” & vbCrLf & _
“保存は許可されません。修正を行ってください。”, vbCritical, “保存ブロック”
End If
End Sub
‘ 独自のスキャンロジック(ここをカスタマイズする)
Private Function IsSecurePresentation(Pres As Presentation) As Boolean
Dim sld As Slide
Dim shp As Shape
‘ ここでは簡易的に「社外秘」という文字列が含まれているかチェック
‘ 本番環境では辞書検索や正規表現、外部データベース連携を推奨
For Each sld In Pres.Slides
For Each shp In sld.Shapes
If shp.HasTextFrame Then
If InStr(1, shp.TextFrame.TextRange.Text, “社外秘”) > 0 Then
IsSecurePresentation = False
Exit Function
End If
End If
Next
Next
IsSecurePresentation = True
End Function
—
3. アドインとして永続化させるための「初期化」
クラスを作っただけでは動作しない。アドイン(.ppam)を読み込んだ瞬間にこのクラスをインスタンス化する必要がある。
‘ — 標準モジュール: MainModule —
Dim MyEventClass As EventClass
Sub Auto_Open()
‘ アドイン読み込み時にイベントハンドラを初期化
Set MyEventClass = New EventClass
Set MyEventClass.App = Application
End Sub
この `Auto_Open` はアドインが起動した瞬間に実行される特別なプロシージャだ。これにより、PowerPointが起動している間、常にあなたの監視プログラムがメモリ上で息づくことになる。
—
4. プロダクション環境における「落とし穴」と対策
この実装を行う際、以下の点に注意しなければ「脆弱なコード」になってしまう。
A. パフォーマンスの劣化を最小限にする
スライド枚数が多いプレゼンで毎回全テキストをスキャンすると、保存時にフリーズが発生する。
- 対策: 「前回保存時からの変更点のみスキャンする」あるいは「非表示スライドはスキップする」といった最適化をロジックに加えること。
B. 「保存」以外のルートを封鎖せよ
`PresentationBeforeSave` はあくまで保存時のみ動く。ユーザーが「名前を付けて保存」を使用した場合や、他の手段を試みる可能性を考慮し、可能であれば「保存機能そのものをリボンUIから制限する」といった、より上位の制御を併用することを推奨する。
C. 外部DB連携の注意
セキュリティ基準を外部DBから取得する場合、社内ネットワークへの疎通状況に依存する。ネットワークオフライン時に全保存がブロックされると業務が止まる。
- 対策: 基準値はローカルの隠しファイルやレジストリにキャッシュし、バックグラウンド同期を行う設計にすること。
—
最後に:エンジニアとしての矜持
このコードは、単なる機能実装ではない。「システムが人の行動を制御し、組織を守る」というアーキテクチャの第一歩だ。
VBAは古い言語だと揶揄する人間もいるが、Officeの深層にこれほど深くアクセスできるツールは他に存在しない。この「境界防御」の技術を磨き、あなたの組織をセキュアかつ効率的な環境へと昇華させてほしい。
実装中に詰まったら、イベントのライフサイクルとメモリ上のインスタンス生存期間を再確認せよ。それが、プロのエンジニアが陥る唯一の罠だからだ。
