【実務・中級編】【初心者】プレゼンテーションの保存時に、すべてのスライドに自動で「社外秘」のウォーターマーク(テキスト図形)を挿入してから保存するマクロ – PowerPoint VBA解析バイブル

スポンサーリンク

【極限の自動化】PowerPoint VBAで「社外秘」スタンプを完全自動化する堅牢な実装術

現場の自動化で最も避けるべきは、「なんとなく動くコード」を量産することだ。特に今回のような「セキュリティに関わる処理」において、コードの脆弱性や中途半端な実装は、そのまま情報漏洩のリスクに直結する。

今日は、プレゼンテーション保存時に全スライドへ「社外秘」ウォーターマークを挿入し、安全にエクスポートするプロフェッショナルな実装を伝授する。

1. なぜ「手動」は排除されるべきか

多くの初心者は、全スライドに図形をコピペするマクロを書き、最後に手動で保存ボタンを押す。しかし、これでは「保存するのを忘れた」「ウォーターマークを消し忘れて社外に出した」というヒューマンエラーを防げない。

真の自動化エンジニアは、「保存というイベント(BeforeSave)をフックし、処理を強制的に介入させる」設計を採る。

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

今回のアプローチは以下の通りだ。
1. イベントハンドラの使用: `App_PresentationBeforeSave` イベントを監視。
2. 状態管理: 既にウォーターマークがある場合は二重挿入を避ける。
3. 背面配置: 既存コンテンツを隠さないよう、図形は最背面に配置し、透明度と階層を制御する。

3. 実践コード:プロダクションレベルの「社外秘挿入」

以下のコードを、標準モジュールではなく「`Class Module`」に記述し、`App` オブジェクトとしてインスタンス化して運用すること。これがイベントドリブン設計の基本だ。

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

Private Sub App_PresentationBeforeSave(ByVal Pres As Presentation, ByVal SaveAsUI As Boolean, Cancel As Boolean)
‘ 保存直前に実行される。自動保存の誤作動を防ぐため、必要に応じてロジックを分岐させる。
On Error GoTo ErrorHandler

Call InsertConfidentialWatermark(Pres)

Exit Sub
ErrorHandler:
MsgBox “ウォーターマークの挿入に失敗しました: ” & Err.Description, vbCritical
End Sub

Private Sub InsertConfidentialWatermark(ByRef targetPres As Presentation)
Dim sld As Slide
Dim shp As Shape
Dim watermarkName As String
watermarkName = “Confidential_Stamp”

For Each sld In targetPres.Slides
‘ 既に存在する場合はスキップ(再実行時の二重作成防止)
If Not ShapeExists(sld, watermarkName) Then
Set shp = sld.Shapes.AddTextbox(msoTextOrientationHorizontal, 100, 200, 500, 100)
With shp
.Name = watermarkName
.TextFrame.TextRange.Text = “【社外秘】”
.TextFrame.TextRange.Font.Size = 60
.TextFrame.TextRange.Font.Color.RGB = RGB(200, 200, 200) ‘ 薄いグレー
.Rotation = -45 ‘ 斜めに配置
.ZOrder msoSendToBack ‘ 最背面に配置
.Fill.Transparency = 0.8 ‘ 視認性を考慮し透過させる
End With
End If
Next sld
End Sub

Private Function ShapeExists(sld As Slide, name As String) As Boolean
Dim shp As Shape
For Each shp In sld.Shapes
If shp.Name = name Then
ShapeExists = True
Exit Function
End If
Next
ShapeExists = False
End Function

4. 開発現場で生き残るための設計思想

  • 名前管理の重要性: `shp.Name` を固定値で指定しているのは、後で「一括削除」や「更新」を行う際に必須だからだ。名前のない図形はゴミになり、プレゼンのファイルサイズを肥大化させる。
  • イベントの競合: `BeforeSave` 内で `Save` メソッドを呼ぶと無限ループに陥る。今回は「保存時に自動でスタンプを打つ」という挙動に留め、保存操作そのものはユーザーに委ねる、あるいは別プロシージャで制御する構成が安全だ。
  • メタデータの考慮: PDF変換を自動化したい場合は、この処理の直後に `targetPres.ExportAsFixedFormat` を呼び出すフローを組むと、一撃で「社外秘PDF」が完成する。

結論

VBAは「おもちゃ」ではない。適切に設計すれば、業務のガードレールとして機能する強力なツールだ。

今回紹介した「名前判定」と「イベントフック」を組み合わせる手法は、他のあらゆる自動化に応用できる。まずはこのコードを読み解き、自身の環境で「一度保存した瞬間にスライドがどう変化するか」を確認してほしい。

それが、凡庸な作業者から脱却し、真の自動化エンジニアへ至る最初の一歩だ。次回の記事では、この図形をファイル出力後に即座に「削除・クリーンアップ」する、より高度なメモリ管理術について解説しよう。

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