【極限の知見】外部共有前の最終防衛ライン:正規表現で機密情報を自動伏せ字にするPowerPoint VBA術
こんにちは。現場の自動化を支えるアーキテクトです。
「マクロの記録」を使って、ボタン一つで図形の色を変えたり、文字を大きくしたり……そんな初歩的なステップはもう卒業ですね。素晴らしい一歩です。
しかし、実務の世界、特にコンサルティングやプロジェクトマネジメントの現場では、もっと「重み」のある自動化が求められます。例えば、外部パートナーへ資料を送る直前。「あ、このスライドにプロジェクトコードが残っていた!」「顧客の個人情報が紛れ込んでいる!」……そんなヒヤリとする瞬間を、エンジニアの力でゼロにする。
今日は、正規表現(Regular Expression)という強力な武器を使い、スライド内の機密情報を一括で検知・マスキング(伏せ字化)し、安全な別名で保存する、プロフェッショナル仕様のマクロを伝授します。
ここをクリアすれば、あなたのPowerPoint VBAスキルは「便利ツール作成者」から「業務プロセス設計者」へと昇華しますよ。さあ、一緒に見ていきましょう。
1. なぜ「マクロの記録」では到達できないのか?
「特定の単語を置換する」だけなら、標準の「置換」機能でも可能です。しかし、実務で守るべき情報は、単一の単語ではありません。
- プロジェクトコード: `PRJ-12345` のような、法則性のある文字列
- メールアドレス: `name@example.com` のような、パターンを持つ文字列
- 電話番号: `090-XXXX-XXXX` のような、形式が決まっている数字
これらを一つずつ指定して置換するのは、現実的ではありません。そこで登場するのが「正規表現」です。正規表現を使えば、「『英字3文字+ハイフン+数字5桁』というパターンに一致するものをすべて探せ」という命令が可能になります。
これこそが、高度な自動化への入り口です。
2. PowerPoint VBAの「階層構造」を支配する
コードを書く前に、PowerPointという宇宙の構造(オブジェクトモデル)を理解しましょう。ここを間違えると、プログラムは迷子になります。
PowerPointのデータは、以下の階層で管理されています。
1. Application: PowerPointソフトそのもの
2. Presentation: 開いているプレゼンテーション(ファイル)
3. Slide: 各ページ
4. Shape: スライド上の要素(テキストボックス、図形、画像など)
5. TextFrame: 図形の中にある「テキストを保持するための枠」
6. TextRange: テキストフレーム内の「具体的な文字列」
私たちが操作したいのは、一番底にある「TextRange」です。しかし、すべての「Shape」がテキストを持っているわけではありません。画像や線にはテキストがありませんよね? だから、コードの中で「この図形はテキストを持っているか?」という判定(If文)を挟むのが、プロの作法です。
3. 実装:プライバシー保護マクロ
それでは、魂を込めたコードを公開します。このコードは、指定したパターンに一致する文字列を `` に置き換えた上で、元のファイルを汚さずに別名で保存します。
Option Explicit
''' <summary>
''' スライド内の機密情報を検知し、伏せ字にして別名保存する
''' </summary>
Sub ProtectPrivacyAndSave()
Dim targetPres As Presentation
Dim sld As Slide
Dim shp As Shape
Dim regExp As Object
Dim savePath As String
Dim pattern As String
Dim maskChar As String
' --- 設定エリア ---
' 検知したい正規表現パターン(例:PRJ-XXXXX の形式)
pattern = "PRJ-[0-9]{5}"
' 置換後の文字列
maskChar = "[CONFIDENTIAL]"
' ------------------
Set targetPres = ActivePresentation
' 正規表現オブジェクトの生成 (VBScript.RegExpを使用)
' これにより、高度なパターンマッチングが可能になります
Set regExp = CreateObject("VBScript.RegExp")
With regExp
.Global = True ' 見つかったすべての箇所を対象にする
.IgnoreCase = True ' 大文字・小文字を区別しない
.Pattern = pattern ' 上記で設定したパターンを適用
End With
On Error GoTo ErrorHandler
' 1. 全スライドをループ
For Each sld In targetPres.Slides
' 2. 各スライド内の全シェイプをループ
For Each shp In sld.Shapes
' 3. 【重要】そのシェイプがテキストを持っているか判定
' これを怠ると、テキストのない図形にアクセスしてエラーになります
If shp.HasTextFrame Then
If shp.TextFrame.HasText Then
' 4. テキスト範囲に対して正規表現で置換を実行
' TextRange.Text を直接いじるのではなく、
' 正規表現のReplaceメソッドを活用して一気に書き換えます
Dim originalText As String
Dim newText As String
originalText = shp.TextFrame.TextRange.Text
' パターンに一致するかチェック
If regExp.test(originalText) Then
newText = regExp.Replace(originalText, maskChar)
shp.TextFrame.TextRange.Text = newText
End If
End If
End If
' ※発展:グループ化された図形の中も探索したい場合は、
' ここに再帰的な処理(GroupItemsのループ)が必要になります。
Next shp
Next sld
' 5. 別名で保存(元のファイルは変更しないための安全策)
' ファイル名の末尾に "_protected" を付与
savePath = targetPres.Path & "\" & _
Left(targetPres.Name, InStrRev(targetPres.Name, ".") - 1) & _
"_protected.pptx"
targetPres.SaveCopyAs savePath
MsgBox "処理が完了しました!" & vbCrLf & "保存先: " & savePath, vbInformation, "完了"
Exit Sub
ErrorHandler:
MsgBox "エラーが発生しました: " & Err.Description, vbCritical, "エラー"
End Sub
4. アーキテクトによる技術解説:ここが「プロ」の分かれ道
コードをただコピペするだけでは、あなたはまだ「初級者」です。このコードのどこに「設計の意図」があるのかを理解しましょう。
① `CreateObject(“VBScript.RegExp”)` の選択
VBA標準の `Replace` 関数は、特定の文字列を置き換えることしかできません。しかし、`VBScript.RegExp` を呼び出すことで、Windowsの強力な正規表現エンジンをVBAから操れるようになります。これができるだけで、自動化の幅は10倍に広がります。
② `HasTextFrame` と `HasText` の二段構え
ここが一番のハマりポイントです。
- `HasTextFrame`: 「文字を入れるための箱(枠)があるか?」
- `HasText`: 「その箱の中に、実際に文字が書き込まれているか?」
この両方をチェックせずに `TextRange` に触れると、プログラムは「そんなものはない!」と悲鳴を上げて止まってしまいます。堅牢なコード(エラーに強いコード)の基本は、この「事前の存在確認」にあります。
③ `SaveCopyAs` による安全設計
業務自動化において、「元のデータを破壊しない」ことは鉄則です。`SaveAs` を使うと、今開いているファイルそのものが書き換わってしまいます。`SaveCopyAs` を使うことで、作業中のファイルはそのままに、加工済みの「コピー」だけを生成できます。これは、万が一マクロが暴走した際のリスクヘッジとして極めて重要です。
5. 陥りやすいエラーと、次へのステップ
このマクロを運用する上で、以下の点に注意してください。
- グループ化された図形: 上記のコードは、単体の図形は処理しますが、「グループ化された図形」の中にあるテキストは見落としてしまいます。これに対応するには、`shp.Type = msoGroup` の場合に、その中の `GroupItems` をさらにループで回す処理を追加する必要があります。
- 表(Table)の中のテキスト: 表の中の文字も、`Shape` オブジェクトの一部ですが、構造が特殊です。表を処理するには `shp.HasTable` を判定し、行と列をループするロジックが必要です。
最後に
一気にすべてをやろうとしなくて大丈夫です。まずは、この「テキストフレームを判定して、中身を書き換える」という基本構造をマスターしてください。
「もし、ここに表があったら?」「もし、ここにグループがあったら?」と、思考を拡張させていくこと。それが、伝説のエンジニアへの唯一の道です。
ここをクリアすれば、あなたのPowerPoint VBAの基本はバッチリですよ。応援しています!
