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

スポンサーリンク

こんにちは!PowerPoint VBAの世界へようこそ。
マクロの記録ボタンを押して、生成されたコードをただ眺めるだけの段階はもう卒業しましょう。

今回は、実務で圧倒的な称賛を受ける「Presentation.SlideShowSettings」と「NamedSlideShows(カスタムスライドショー)」を組み合わせた、動的なプレゼン自動構築の極意を伝授します。

「全100枚ある巨大なスライドから、今日の顧客A社向けに必要な15枚だけを瞬時に抽出し、そのまま全画面プレゼンを開始したい」
そんな現場の切実な要望を、VBAのコード数行で鮮やかに解決してみせましょう。ここをクリアすれば、あなたのPowerPoint VBAのスキルは間違いなく中級者の領域に到達します!

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

通常、PowerPointでスライドを絞り込むときは、手動で「スライドショーの記録」や「カスタムスライドショー」の設定画面を開き、ポチポチとチェックボックスを操作しますよね。

しかし、対象のスライドが何十枚もあり、相手や目的によってその組み合わせがコロコロ変わる場合、手動での管理はヒューマンエラー(見せちゃいけない機密スライドの混入など)の温床になります。

ここで登場するのが、オブジェクトモデルの隠れた名優 `NamedSlideShows` コレクションです。
これを使うと、「プログラムの実行瞬間に、必要なスライドだけを集めた再生リスト(カスタムショー)を自動生成し、即座にそれを再生する」という神業が可能になります。

2. オブジェクトの階層構造を理解する

まずは、PowerPointのオブジェクトモデルにおける位置づけを頭に叩き込みましょう。迷子になりがちな「スライドショーの設定」へは、以下のルートでアクセスします。

Application (PowerPoint全体)
┗ ActivePresentation (現在開いているプレゼンテーション)
┗ SlideShowSettings (スライドショーの再生設定)
┗ NamedSlideShows (カスタムスライドショーのコレクション)

この `NamedSlideShows` に対して、「新しくリストを作れ」「既存のリストを削除しろ」「そのリストを使ってショーを開始しろ」と命令を送るのが、今回の自動化の核心です。

3. 【実践】動的カスタムスライドショー作成・実行マクロ

それでは、実務でそのまま使えるサンプルコードを公開します。
このコードは、現在開いているプレゼンの中から、特定の条件(例:タイトルに特定のキーワードが含まれる、または特定の番号のスライド)だけを抽出し、「DynamicShow」という名前のカスタムショーを動的に作って即座に再生するものです。

VBAエディタ(`Alt + F11`)を開き、標準モジュールに以下のコードを貼り付けてください。

Sub RunDynamicCustomShow()
Dim pptPres As Presentation
Dim customShowName As String
Dim slideIDs() As Long
Dim i As Long, count As Long

‘ 1. アクティブなプレゼンテーションを特定
Set pptPres = ActivePresentation
customShowName = “AutoGenerated_TargetShow”

‘ —————————————————-
‌【ステップA】既存の同名カスタムショーがあれば予め削除する
‘ —————————————————-
On Error Resume Next
pptPres.SlideShowSettings.NamedSlideShows(customShowName).Delete
On Error GoTo 0 ‘ エラートラップを通常に戻す

‘ —————————————————-
‌【ステップB】条件に合致するスライドのID配列を動的に構築する
‘ —————————————————-
‘ ここでは実用性を考慮し、「特定のキーワード(例: “【重要】”)」が
‘ スライド内のタイトルに含まれているものを抽出するロジックにします。

count = 0
ReDim slideIDs(1 To pptPres.Slides.Count) ‘ 最大数を確保

Dim sld As Slide
For Each sld In pptPres.Slides
‘ スライド内にテキストフレームを持つ図形が存在するかチェック
If HasKeywordInTitle(sld, “【重要】”) Then
count = count + 1
‘ 注意: カスタムショーに登録するのは「スライド番号」ではなく「SlideID」です!
slideIDs(count) = sld.ID
End If
Next sld

‘ 該当スライドが1枚もない場合は処理を中断
If count = 0 Then
MsgBox “条件に合致するスライドが見つかりませんでした。”, vbExclamation, “処理中断”
Exit Sub
End If

‘ 配列のサイズを実際の抽出数にリサイズ
ReDim Preserve slideIDs(1 To count)

‘ —————————————————-
‌【ステップC】NamedSlideShows に新しいカスタムショーを追加
上の配列をVARIANT型に変換して渡します
‘ —————————————————-
Dim varIDs As Variant
varIDs = slideIDs

pptPres.SlideShowSettings.NamedSlideShows.Add _
Name:=customShowName, _
SlideIDs:=varIDs

‘ —————————————————-
‌【ステップD】作成したカスタムショーを指定してスライドショーを実行
‘ —————————————————-
With pptPres.SlideShowSettings
.ShowType = ppShowTypeKiosk ‘ 必要に応じてウィンドウ表示等に変更可能
.RangeType = ppShowNamedSlideShow
.SlideShowName = customShowName

‘ 運命の実行!
.Run
End With

Debug.Print “カスタムショー「” & customShowName & “」を ” & count & “枚のスライドで起動しました。”
End Sub

‘ —————————————————-
‘ ヘルパー関数: スライドのタイトルに特定キーワードが含まれるか判定
‘ —————————————————-
Private Function HasKeywordInTitle(targetSlide As Slide, keyword As String) As Boolean
Dim shp As Shape
HasKeywordInTitle = False

On Error Resume Next
For Each shp in targetSlide.Shapes
If shp.HasTextFrame Then
If shp.TextFrame.HasText Then
‘ プレースホルダー(タイトル等)または文字列内にキーワードが含まれるか
If InStr(1, shp.TextFrame.TextRange.Text, keyword, vbTextCompare) > 0 Then
HasKeywordInTitle = True
Exit Function
End If
End If
End If
Next shp
On Error GoTo 0
End Function

4. 陥りやすい罠とプロのエンジニアの知見

このコードを書くにあたって、初心者が必ずハマる「罠」が2つあります。ここを知っているかどうかが、プロとアマの分かれ道です。

罠①:「スライド番号(SlideIndex)」と「スライドID(Slide.ID)」の混同

`NamedSlideShows.Add` メソッドに渡す配列には、`SlideIndex`(左ペインに並ぶ1, 2, 3…という通し番号)ではなく、`Slide.ID`(PowerPointが内部で自動生成する固有の不変ID)を指定しなければなりません。
もしスライドの順番を入れ替えたとき、Indexを指定していると全く意図しないスライドが再生されて大惨事になります。必ず `sld.ID` を使うようにしてください。

罠②:古いカスタムショーの「ゴミ」が残る

一度コードで作成したカスタムショー(`NamedSlideShows` のアイテム)は、プレゼンテーションファイルを保存するとそのまま内部に残り続けます。
そのため、プログラムを二回目、三回目と走らせたときに「同名のカスタムショーがすでに存在します」という実行時エラー(エラー番号:-2147188160など)が発生します。
必ず、今回のコードの【ステップA】のように、追加する前に `On Error Resume Next` を使って同名のエントリを安全に削除する(あるいは上書きする)処理をセットで組み込むのが鉄則です。

5. おわりに:ここをクリアすれば、PowerPoint VBAはあなたのもの

今回は、`Presentation.SlideShowSettings` と `NamedSlideShows` を駆使した動的なプレゼン構築の技術を解説しました。

「あらかじめ用意された枠組みに縛られず、プログラム側でデータや状況に応じて見せるスライドを自在にスイッチングする」
このアプローチが身につけば、定型的なプレゼン資料の作成や、個別最適化された営業資料の自動生成など、業務効率化の幅が劇的に広がります。

基礎から本質までを理解したあなたなら、もうマクロの記録に頼る必要はありません。ぜひ自分の手でコードをカスタマイズし、現場の業務をスマートに自動化してみてくださいね!

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