【入門編】【実務中級】Presentation.SlideShowSettingsを操作し、特定の「カスタムスライドショー(NamedSlideShows)」を動的に作成・実行する自動化 – PowerPoint VBA解析バイブル

スポンサーリンク

こんにちは! PowerPoint VBAの深淵へようこそ。
これまでに「マクロの記録」ボタンを押してみたものの、生成された暗号のようなコードに絶望したり、ネットから拾ってきたコードを貼り付けてはエラーの連続で頭を抱えたりしていませんか?

大丈夫。今日、ここで「オブジェクトモデルの階層構造」と「スライドショー制御の裏側」を掴んでしまえば、PowerPoint VBAはあなたの最強の武器に変わります。

今回は、実務で驚くほど重宝する「条件に合致するスライドだけを動的に抽出し、カスタムスライドショーとして即座に上映する自動化テクニック」を解説します。

ここをクリアすれば、PowerPoint VBAの基本はバッチリですよ。さあ、一緒に扉を開けましょう。

1. なぜ「カスタムスライドショー」をVBAで操るのか?

例えば、全50ページある巨大な提案書を抱えているとします。
しかし、目の前のクライアント(または役員)に見せたいのは、「要約」と「特定の機能Aの仕様」に関する計10ページだけ。

通常なら、スライドを非表示にしたり、別のファイルにコピペしたり……そんなアナログな作業していませんか? 手間がかかるだけでなく、元のファイルを汚すリスクもあります。

ここで登場するのが、PowerPoint標準機能の「カスタムスライドショー(NamedSlideShows)」です。
特定のスライドだけをグループ化して名前をつけ、それだけを上映できる機能ですが、これをVBAで動的に(その場でプログラムに組ませて)実行できたらどうでしょう?

  • 会議の直前に「要約版」「技術詳細版」をボタン一つで自動生成
  • 不要なスライドを削除・非表示にする手間がゼロに
  • 1つのマスターファイルから無限のプレゼンパターンを量産可能

このロジックを、プロのエンジニアの作法で実装していきましょう。

2. PowerPointオブジェクトモデルの「地図」を持て

コードを書く前に、PowerPointがメモリ上で世界をどう認識しているか(オブジェクトモデル)を頭に叩き込みます。迷子にならないための地図です。

Application (PowerPoint本体)
┗ Presentations (開いているプレゼンテーションのコレクション)
┗ Presentation (対象のファイル。アクティブなら ActivePresentation)
┣ Slides (全スライドのコレクション)
┃ ┗ Slide (個々のスライド)
┗ SlideShowSettings (スライドショーの設定・管理)
┗ NamedSlideShows (カスタムスライドショーのコレクション)
┗ NamedSlideShow (個別のカスタムスライドショー)

今回の主役は、一番下にある `SlideShowSettings.NamedSlideShows` です。
「名前付きのスライドショーの集まり」を操作するのが、この領域のミッションになります。

3. 実装:動的カスタムスライドショー生成&実行マクロ

それでは、実務でそのまま使える完全版のコードを提示します。
今回は、スライドのノート(Notes)やタイトルに「#重要」というキーワードが含まれているページだけを自動収集し、その場で即座に上映するというプログラムを作ります。

VBE(Visual Basic Editor)を開き、標準モジュールに以下のコードを貼り付けてください。

Sub RunDynamicCustomShow()
Dim targetPres As Presentation
Dim slideColl As String
Dim i As Long
Dim slideCount As Long
Dim targetSlide As Slide
Dim customShowName As String
Dim isFound As Boolean

‘ 1. 対象のプレゼンテーションを定義(ここでは現在アクティブなファイル)
Set targetPres = ActivePresentation

‘ カスタムスライドショーの識別名
customShowName = “VBA_Dynamic_Show”

‘ 2. 既存の同名カスタムショーがあれば、一度削除しておく(ゴミを残さない鉄則)
On Error Resume Next
targetPres.SlideShowSettings.NamedSlideShows(customShowName).Delete
On Error GoTo 0

‘ 3. 全スライドを走査し、条件に合うスライドのインデックス番号を集める
slideColl = “”
slideCount = 0

For i = 1 = 1 To targetPres.Slides.Count ‘ ※1からスタート
Set targetSlide = targetPres.Slides(i)

‘ 【抽出条件の判定】
‘ ここでは例として「スライドのノートに ‘#重要’ という文字が含まれているか」を判定
If IsKeywordInNotes(targetSlide, “#重要”) Then
If slideCount > 0 Then
slideColl = slideColl & “,”
End If
‘ スライドの「ID(またはスライド番号)」ではなく、
‘ NamedSlideShowsには「スライドのタイトル名(文字列)」を渡す仕様になっています。
‘ 注意:PowerPointの仕様上、NamedSlideShowsにはスライド名(例: “スライド 3″)を指定します。
slideColl = slideColl & targetSlide.Name
slideCount = slideCount + 1
End If
Next i

‘ 4. 抽出されたスライドが存在するかチェック
If slideCount = 0 Then
MsgBox “条件に合致するスライドが見つかりませんでした。”, vbExclamation, “処理中断”
Exit Sub
End If

‘ 5. カスタムスライドショーを新規作成(名前と、スライド名の配列を渡す)
‘ スライド名はカンマ区切りの文字列から配列(Array)に変換する必要があるため、Split関数を使用
targetPres.SlideShowSettings.NamedSlideShows.Add _
Name:=customShowName, _
Range:=Split(slideColl, “,”)

‘ 6. スライドショーの設定を「カスタムショー上映」に変更して実行!
With targetPres.SlideShowSettings
.ShowType = ppShowTypeSpeaker ‘ 発表者として表示(全画面)
.RangeType = ppShowNamedSlideShow ‘ カスタムショーを指定
.SlideShowName = customShowName ‘ 対象の名前を設定

‘ いざ、上映開始!!
.Run
End With

End Sub

‘ ————————————————–
‘ 補助関数:スライドのノート内に特定キーワードが含まれているか判定
‘ ————————————————–
Private Function IsKeywordInNotes(sld As Slide, keyword As String) As Boolean
Dim notesText As String

On Error Resume Next
‘ ノートペインのテキストを取得
notesText = sld.NotesPage.Shapes.Placeholders(2).TextFrame.TextRange.Text
On Error GoTo 0

If InStr(1, notesText, keyword, vbTextCompare) > 0 Then
IsKeywordInNotes = True
Else
IsKeywordInNotes = False
End If
End Function

4. プロのエンジニアが教える「陥りやすい罠」と回避策

このコードを動かすにあたり、PowerPoint VBA特有の「ハマりどころ」がいくつかあります。プロの知見として共有しておきます。

罠1: `NamedSlideShows.Add` に渡すのは「スライド番号」ではない

初心者最大の迷宮がここです。
「3枚目のスライドだから `3` を渡せばいいや」と思いきや、`NamedSlideShows.Add` の `Range` 引数に要求されるのは、スライドのオブジェクト名(例: `”スライド 3″` という文字列の配列)です。

今回のコードで使っている `targetSlide.Name` は、まさにこの内部名称を返しています。ここをスライドのインデックス番号(数値)で渡してしまうと、型ミスマッチや実行時エラーの餌食になります。

罠2: 破棄されないオブジェクトの残骸

VBAでカスタムスライドショーを作成すると、その情報はPowerPointファイル(.pptm)の内部に保存されます。
プログラムを何度も走らせるテスト段階で、同じ名前のカスタムショーが同名エラーを起こしたり、不要な設定が肥大化したりします。
そのため、処理の最初に `On Error Resume Next` を挟んで、同名のカスタムショーがすでに存在していれば `.Delete` で綺麗に消去する「お掃除ロジック」が実務では必須となります。

罠3: ノートが存在しないスライドへの配慮

スライドによっては、ノートエリアが削除されていたり、テキストプレースホルダーの構造が異なっていたりすることがあります。
補助関数 `IsKeywordInNotes` の中で `On Error Resume Next` を使っているのは、ノートがないスライドでエラー(実行時エラー 91: オブジェクト変数または With ブロック変数未設定)が発生してマクロが強制終了するのを防ぐための「防壁」です。

5. まとめ

今回は、`Presentation.SlideShowSettings.NamedSlideShows` を駆使し、条件に一致するスライドを動的に抽出して上映する高度な自動化テクニックを解説しました。

  • 全スライドのオブジェクトをループし、独自のロジックで評価する
  • 合致したスライドの名前を文字列の配列としてまとめる
  • `NamedSlideShows.Add` で動的にカスタムショーを生成する
  • `SlideShowSettings` で再生モードを切り替えて `.Run` で爆誕させる

この一連の流れをマスターしたあなたなら、単なる「マクロの記録の貼り付け屋」ではありません立派なPowerPoint自動化エンジニアです。

現場のプレゼン業務を効率化し、スマートに仕事を終わらせていきましょう。それでは、次回の極限の知見でお会いしましょう!

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