【入門編】【中級者】スピーカーノートに特定の制御タグ(例:[Skip])があるページを自動除外して、公開用のクリーンなプレゼンテーションを新しく作成・保存するフィルタリングマクロ – PowerPoint VBA解析バイブル

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

【極限の知見】スライドの「裏側」を制御せよ:スピーカーノートによる自動フィルタリングとクリーンな抽出術

こんにちは。業務自動化の深淵へようこそ。

「マクロの記録」ボタンを押し、生成されたコードを眺めて「ふむふむ、なるほど」と納得する。それは素晴らしい第一歩です。しかし、プロフェッショナルなエンジニアへの道は、その先にあります。

真の自動化とは、単に操作を記録することではありません。「オブジェクトの構造を理解し、意図した通りにデータのライフサイクルを制御すること」です。

今日、皆さんに伝授するのは、実務で極めて重要かつ、一歩間違えれば情報の流出を招きかねない、非常にエキサイティングなテーマです。

「スピーカーノートに特定のタグ(例:`[Skip]`)があるスライドを除外し、外部公開用のクリーンなプレゼンテーションを自動生成する」

このスクリプトを通じて、PowerPoint VBAの本質的な設計思想を学んでいきましょう。

1. 設計思想:なぜ「削除」ではなく「抽出」なのか?

コードを書く前に、エンジニアとして最も重要な「設計」の話をしましょう。

初心者はよくこう考えます。「スライドの中から `[Skip]` があるものを探して、そのスライドを削除すればいい」と。

しかし、これは破壊的な操作(Destructive Operation)です。
もしマクロの条件設定をミスして、大切なスライドをすべて消してしまったら? 元のファイルは修復不可能なダメージを受けます。これはプロの現場では絶対に避けるべき設計です。

我々が取るべき戦略は「非破壊的な抽出(Non-destructive Extraction)」です。

1. 元のファイル(ソース)は一切いじらない。
2. 新しいプレゼンテーション(デスティネーション)をメモリ上に作成する。
3. 条件に合致するスライドだけを、新しいファイルへ「コピー&ペースト」する。

この「新しい器を作る」という考え方が、オブジェクトのライフサイクルを安全に管理する鍵となります。

2. 実装コード:クリーン・スライド・エクスポート

それでは、魂を込めて書いたコードを見てみましょう。このコードは、単なるコピペ用ではありません。各行に「なぜそう書くのか」という意図を込めています。

Option Explicit

''' <summary>
''' スピーカーノートに [Skip] タグが含まれるスライドを除外し、
''' 新しいプレゼンテーションとして保存するマクロ
''' </summary>
Sub ExportCleanPresentation()
    ' --- 設定領域 ---
    Const SKIP_TAG As String = "[Skip]" ' 除外するためのキーワード
    Dim savePath As String
    ' ----------------
    
    Dim srcPres As Presentation
    Dim destPres As Presentation
    Dim sld As Slide
    Dim noteText As String
    Dim slideCount As Integer
    Dim copiedCount As Integer
    
    ' 現在開いているプレゼンテーションをソースとして定義
    Set srcPres = ActivePresentation
    
    ' 1. 新しいプレゼンテーションを作成(これが「器」になる)
    ' ※メモリ上に新しいオブジェクトを生成する
    Set destPres = Presentations.Add
    
    ' 処理の進捗を管理するためのカウンタ
    slideCount = 0
    copiedCount = 0
    
    On Error GoTo ErrorHandler
    
    ' 2. ソーススライドを一つずつ走査(ループ)
    For Each sld In srcPres.Slides
        slideCount = slideCount + 1
        
        ' スピーカーノートのテキストを取得
        ' スライドのNotesPageオブジェクトからテキストフレームを探し出す
        ' ※NotesPageはスライドとは別のレイヤー構造を持っている点に注意
        noteText = ""
        If sld.HasNotesPage Then
            ' 通常、ノートのテキストは2番目のプレースホルダーに格納されている
            noteText = sld.NotesPage.Shapes.Placeholders(2).TextFrame.TextRange.Text
        End If
        
        ' 3. 判定ロジック:タグが含まれていない場合のみコピー
        ' InStr関数は、文字列の中に特定の文字が含まれているか判定する
        If InStr(1, noteText, SKIP_TAG, vbTextCompare) = 0 Then
            ' 条件に合致した場合、スライドをコピーして新しいプレゼンに貼り付け
            sld.Copy
            destPres.Slides.Paste
            
            ' 貼り付けた直後のスライドは、destPresの最後尾に追加される
            copiedCount = copiedCount + 1
        End If
    Next sld
    
    ' 4. 後処理:空のプレゼンが作成された場合などのチェック
    If copiedCount > 0 Then
        ' 保存先のパスを生成(元のファイル名_Clean.pptx)
        savePath = srcPres.Path & "\" & srcPres.Name & "_Clean.pptx"
        
        ' 新しいプレゼンテーションを保存
        destPres.SaveAs savePath
        MsgBox "完了しました!" & vbCrLf & _
               "抽出スライド数: " & copiedCount & " / 全スライド: " & slideCount & vbCrLf & _
               "保存先: " & savePath, vbInformation, "成功"
    Else
        ' コピーできるスライドが一つもなかった場合、新しいプレゼンを閉じる
        destPres.Close
        MsgBox "除外対象以外のスライドが見つかりませんでした。", vbExclamation, "警告"
    End If

    Exit Sub

ErrorHandler:
    MsgBox "予期せぬエラーが発生しました。" & vbCrLf & _
           "エラー番号: " & Err.Number & vbCrLf & _
           "内容: " & Err.Description, vbCritical, "エラー発生"
    ' エラー時も、作成途中のプレゼンテーションを閉じてリソースを解放する
    If Not destPres Is Nothing Then destPres.Close
End Sub

3. 技術的深掘り:ここがプロの分かれ目

コードを理解する上で、絶対に外せない「3つの重要ポイント」を解説します。ここをクリアすれば、あなたのVBAスキルは一段上のステージへ到達します。

① `NotesPage` という特殊なオブジェクト

スライド(`Slide`)と、その裏にあるノート(`NotesPage`)は、PowerPoint内部では異なるオブジェクトとして管理されています。
`sld.NotesPage.Shapes.Placeholders(2)` という記述がありますが、これは「ノート部分のテキスト入力欄」を指しています。この階層構造を意識できるかどうかが、プレゼンテーション操作の鍵となります。

② `InStr` 関数の使いこなし

`InStr(1, noteText, SKIP_TAG, vbTextCompare)`
ここで `vbTextCompare` を指定しているのがポイントです。これを入れることで、大文字と小文字を区別せずに検索できます(例:`[skip]` も `[SKIP]` も検知できる)。実務ではユーザーの入力ミスを考慮して、このように「寛容な設計」にするのが鉄則です。

③ メモリとリソースの管理(エラーハンドリング)

コードの終盤にある `ErrorHandler` を見てください。
プログラミングにおいて、エラーは「起きるもの」です。エラーが起きた際に、作成途中の `destPres`(新しいファイル)が開きっぱなしになると、メモリを無駄に消費し、最悪の場合ファイルがロックされてしまいます。
`On Error GoTo ErrorHandler` を使い、エラーが起きても「必ずファイルを閉じてから終了する」という後始末(クリーンアップ)を徹底するのが、一流の書き方です。

4. まとめ:自動化のその先へ

今回のマクロは、単にスライドを分けるだけのものではありません。
「情報の機密性を守りつつ、業務のスピードを最大化する」という、エンジニアリングの本質的な価値を提供しています。

「マクロの記録」で得た断片的な知識を、今回のような「論理的な構造」へと組み上げていく。その繰り返しが、あなたを伝説的なアーキテクトへと導きます。

もし、このコードを動かしてみて「もっとこうしたい!」という要望が出てきたら、それはあなたの成長のサインです。

  • 「PDFとして一括保存したい」
  • 「特定の画像が含まれるスライドも除外したい」

そんな時は、ぜひまたこの設計思想を思い出してください。オブジェクトを、構造を、そしてライフサイクルを。

さあ、次はあなたが、このコードを自分流に進化させる番です。

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