PowerPointを要塞化せよ:PresentationBeforeSaveで「保存」を制御する高度なセキュリティ対策
こんにちは。業務自動化の深淵へようこそ。
普段、何気なく押している「Ctrl + S」。しかし、その保存ボタンが「機密情報の流出を食い止める最後の砦」になるとしたらどうでしょう?
今回は、マクロの記録から一歩踏み出し、「PowerPointそのものを監視する」という高度な領域に挑戦します。イベントフック技術を使い、ルール違反のプレゼンを物理的に保存させない。この堅牢な仕組みを構築しましょう。
—
1. イベント駆動型開発:VBAの「深層」に触れる
通常のVBAは「ボタンを押したら動く」ものですが、今回扱うのは「イベント」です。
ユーザーの操作を横取りし、その裏で独自のチェックロジックを走らせる。これがアドイン開発の真髄です。
なぜ「アドイン(.ppam)」なのか?
個別のファイルにマクロを埋め込むと、ファイルが増えるたびにコードをコピーする必要があります。アドイン化することで、「PowerPointを起動している間、常に監視者が背後にいる」状態を作り出せるのです。
—
2. 実装の設計図:クラスモジュールが鍵
イベントをフックするには、標準モジュールではなく「クラスモジュール」を使います。これにより、PowerPointアプリケーション自体の挙動を「監視対象」として定義できるからです。
手順:
1. クラスモジュールを作成し、名前を `clsAppEvents` に変更。
2. `WithEvents` キーワードでPowerPoint Appを定義。
3. `PresentationBeforeSave` イベントを実装。
‘ 【クラスモジュール:clsAppEvents】
‘ WithEventsを使って、PowerPointのAppオブジェクトを監視します
Public WithEvents App As Application
Private Sub App_PresentationBeforeSave(ByVal Pres As Presentation, ByVal SaveAsUI As Boolean, Cancel As Boolean)
‘ ここが監視の心臓部。保存が実行される直前に割り込みます
‘ 1. スキャン実行(関数を呼び出し)
If Not IsSecure(Pres) Then
‘ 2. 基準を満たさない場合、CancelをTrueにして保存を阻止
MsgBox “【警告】機密情報が含まれています!保存を中断しました。”, vbCritical, “セキュリティ保護”
Cancel = True
End If
End Sub
—
3. なぜ保存をブロックできるのか?
上記のコードにある `Cancel = True` が魔法の言葉です。
PowerPointは保存処理を実行する直前、このイベントを呼び出します。ここで `Cancel` 引数に `True` を渡すと、PowerPointは「あ、ユーザーが何らかの理由で保存を止めたんだな」と判断し、保存処理そのものを破棄します。
セキュリティチェックのロジック例(IsSecure関数)
ここには貴社の要件に合わせてロジックを組み込みます。例えば「社外秘」という文字列が含まれていないかスキャンする例です。
Private Function IsSecure(Pres As Presentation) As Boolean
Dim slide As slide
Dim shp As Shape
‘ 全スライドを走査
For Each slide In Pres.Slides
For Each shp In slide.Shapes
If shp.HasTextFrame Then
If InStr(shp.TextFrame.TextRange.Text, “社外秘”) > 0 Then
IsSecure = False ‘ 危険あり
Exit Function
End If
End If
Next
Next
IsSecure = True ‘ 安全
End Function
—
4. 運用に乗せるための「アドイン化」の作法
作成したコードを動かし続けるためには、起動時にクラスを初期化する必要があります。
標準モジュール(Auto_Open)
Dim myApp As clsAppEvents
Sub Auto_Open()
‘ PowerPointが起動した瞬間に監視を開始
Set myApp = New clsAppEvents
Set myApp.App = Application
End Sub
これを `.ppam` 形式で保存し、「ファイル」→「オプション」→「アドイン」から読み込めば、あなたのPCでPowerPointを使うたびに、この強力なセキュリティバリアが展開されます。
—
5. 初学者が陥りやすい「落とし穴」
1. クラス変数のスコープ: `myApp` をプロシージャ内で宣言すると、すぐに破棄されて監視が止まります。必ずモジュールレベルの変数(一番上に書く)にしましょう。
2. ループの罠: 全文検索はスライド枚数が多いと保存が重くなります。必要に応じて「特定のノート」や「特定のプロパティ」のみをチェックするように工夫してください。
3. 強制終了: `Cancel = True` は強力です。誤作動を起こすと上書き保存ができなくなるため、デバッグは必ず別ファイルで行ってください。
—
最後に:エンジニアとしての矜持
VBAは「古い言語」と揶揄されることもあります。しかし、OSの深いレイヤーにアクセスし、業務の隙間を埋める力において、これほど手軽で強力なツールは他にありません。
今回学んだ「イベントフック」をマスターすれば、保存の監視だけでなく、「特定の印刷操作を禁止する」「スライドの変更履歴を自動でログに残す」といった、企業のコンプライアンスを支える基盤システムさえ構築可能です。
次はぜひ、ご自身の業務で「何を監視すれば、もっと楽に、もっと安全になるか」を考えてみてください。その問いこそが、一流の自動化エンジニアへの第一歩です。
それでは、素晴らしいVBAライフを!
