【入門編】【中級者】スライド内に散在するすべてのテキストフレームから特定部門の機密キーワードを正規表現で自動検知し、該当箇所の文字列を伏字に置換してから別名保存するプライバシー保護マクロ – PowerPoint VBA解析バイブル

スポンサーリンク
スポンサーリンク

【極限の知見】外部共有前の最終防衛ライン:正規表現で機密情報を自動伏せ字にする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の基本はバッチリですよ。応援しています!

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