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

スポンサーリンク

【PowerPoint VBA極限活用】動的カスタムスライドショー構築術:NamedSlideShowsを支配せよ

こんにちは。開発プロジェクトを率いるチーフアーキテクトの私だ。
これまで数々の巨大な業務自動化案件をクリアしてきたが、現場からもっとも頻繁に持ち込まれる厄介な要望の一つがこれだ。

「全100ページあるマスター資料から、今日の相手に必要な15ページだけを抜き出してスマートにプレゼンしたい。しかも、その組み合わせは相手の企業や部署ごとに毎回変わる」

君ならどうする?まさか、顧客ごとに別々のPowerPointファイルをコピー&ペーストで量産し、改修のたびに全ファイルの同期に苦しむという、地獄のような泥臭い運用をしていないだろうか?ファイルが分散した瞬間、それはメンテナンス不能の「負債」に成り下がる。

PowerPointには、この課題をエレガントに、かつ一瞬で解決するネイティブの仕組みが備わっている。それが `NamedSlideShows`(カスタムスライドショー) コレクションだ。

今回は、この隠れた強力なオブジェクトをVBAから完全に制御し、外部データ(ExcelやDB)と連携して「動的なプレイリスト」を秒速で構築・実行するプロダクションコードを伝授しよう。

1. なぜ「別ファイルへの分割」は悪手なのか?

実務において、プレゼン資料の本体(マスター)は常に進化する。法改正、新サービスの追加、実績データの更新……。
もし顧客ごとにファイルを作っていたら、マスターを改修した際に全ファイルの更新漏れが発生し、商談で古い情報を提示してしまうという致命的なミス(ヒューマンエラー)に直結する。

唯一の正解:シングルソース・オブ・トゥルース(SSOT)

資料の本体は1つの `.pptm`(または `.pptx`)に一元化し、再生する順番やスライドのセットリストだけをプログラム(VBA)で動的に組み立てる。これが大規模プレゼンを制するアーキテクチャの鉄則だ。

2. NamedSlideShows オブジェクトモデルの核心

PowerPointのオブジェクト階層において、カスタムスライドショーは `Presentation` オブジェクトの配下に存在する。

Application
┗ Presentation (ActivePresentation)
┣ Slides (全スライドのマスター)
┗ SlideShowSettings
┗ NamedSlideShows (カスタムスライドショーのコレクション)
┗ NamedSlideShow (個別のカスタムショー)

ここで重要な注意点がある。
「カスタムスライドショーは、スライドのインデックス番号の配列(Array)を登録して名前(Name)を紐付ける」 という仕様になっている点だ。
つまり、VBA側で「どのスライドID、あるいはスライド番号が必要か」を動的に判定し、配列として `NamedSlideShows.Add` メソッドに渡してやらなければならない。

3. 【実践】動的カスタムスライドショー自動生成&実行コード

以下のコードは、特定のタグ(例:スライドのノート欄や特定のセクション、あるいはコード内のハードコードされた配列)を元に、実行時にカスタムスライドショーを動的に生成し、そのまま全画面でプレビュー(スライドショー開始)する実用的なプロシージャだ。

実務への組み込みを想定し、「同名のカスタムショーがすでに存在する場合は安全に削除してから再作成する」という堅牢なエラーハンドリング(イデポテンシーの確保)を実装している。

Option Explicit

‘ =========================================================================
‘ 概要: 指定されたスライド番号のリストからカスタムスライドショーを動的に作成し、
‘ 即座に実行するプロダクションコード
‘ アーキテクトノート: 既存の同名設定をクリーンアップしてから再構築するのが鉄則。
‘ =========================================================================
Public Sub RunDynamicCustomShow()

Dim targetPres As Presentation
Set targetPres = ActivePresentation

‘ 1. プレイリストに含めるスライド番号を定義
‘ ※実務では、ここをExcel読み込みやユーザーフォームの入力値に置き換える
Dim slideIndices() As Variant
slideIndices = Array(1, 3, 5, 8, 9, 12) ‘ 例として特定の番号を指定

Dim showName As String
showName = “Dynamic_Auto_Session”

On Error GoTo ErrorHandler

‘ 2. 既存の同名カスタムスライドショーが存在すれば削除(クリーンアップ)
Call RemoveExistingCustomShow(targetPres, showName)

‘ 3. NamedSlideShowsコレクションに新しいカスタムショーを追加
‘ ※引数: Name (文字列), SafeArray (スライド番号の1次元配列)
Dim nss As NamedSlideShow
Set nss = targetPres.SlideShowSettings.NamedSlideShows.Add(showName, slideIndices)

‘ 4. スライドショーの設定を「カスタムスライドショー再生」に切り替え
With targetPres.SlideShowSettings
.RangeType = ppShowNamedSlideShow ‘ カスタムショーモードを指定
.NamedSlideShowName = showName ‘ 実行するカスタムショーの名前を指定
.AdvanceMode = ppSlideShowUseSlideTimings ‘ タイミング設定を継承
End With

‘ 5. スライドショーの実行
Dim ssWin As SlideShowView
Set ssWin = targetPres.SlideShowSettings.Run.View

Exit Sub

ErrorHandler:
MsgBox “予期せぬエラーが発生しました: ” & Err.Description, vbCritical, “致命的エラー”
End Sub

‘ ————————————————————————-
‘ ヘルパー関数: 同名のカスタムスライドショーが存在する場合に安全に削除する
‘ ————————————————————————-
Private Sub RemoveExistingCustomShow(pres As Presentation, targetName As String)
Dim i As Long
On Error Resume Next
For i = pres.SlideShowSettings.NamedSlideShows.Count To 1 Step -1
If pres.SlideShowSettings.NamedSlideShows(i).Name = targetName Then
pres.SlideShowSettings.NamedSlideShows(i).Delete
Exit For
End If
Next i
On Error GoTo 0
End Sub

4. プロフェッショナルとしての応用:外部データ(Excel)連携

実務でこの仕組みを本番稼働させる場合、コード内にスライド番号をハードコードすることはまずない。
以下のように、Excelの顧客別シートやマスタ管理表から「今日見せるべきスライドの条件」を動的に取得する アーキテクチャへと昇華させるべきだ。

‘ 【概念コード】Excel連携による動的プレイリスト生成
Public Sub GenerateShowFromExcel(customerCode As String)
‘ 1. ExcelアプリケーションをCreateObjectまたは参照設定で操作
‘ 2. customerCode に合致する行から「必要なスライド番号のカンマ区切り文字列」を取得
‘ 例: “1,4,5,10,15”
Dim rawString As String
rawString = “1,4,5,10,15” ‘ ※実際にはExcelから取得

‘ 3. Split関数で配列に変換してVariant型にキャスト
Dim tempArray() As String
tempArray = Split(rawString, “,”)

Dim slideIndices() As Long
ReDim slideIndices(UBound(tempArray))

Dim i As Long
For i = 0 To UBound(tempArray)
slideIndices(i) = CLng(tempArray(i))
Next i

‘ 4. 前述のNamedSlideShows.Addへと流し込む
‘ (※AddメソッドはVariant型の配列を要求するため、型変換に注意すること)
End Sub

※VBAの `NamedSlideShows.Add` は引数に `Variant` 型の配列を要求する。文字列のまま渡すと型ミスマッチエラー(実行時エラー 13)になるため、`CLng` 等で数値型(Long)にしっかりキャストするのが、バグを生むプログラマーと一流のエンジニアを分かつ分水嶺だ。

5. チーフアーキテクトからの提言

PowerPoint VBAは、Excel VBAに比べてネット上の情報が少なく、一見するとマイナーな領域に見えるかもしれない。しかし、プレゼンテーションの現場において「情報の鮮度を保ったまま、一瞬で最適化された構成を組む」という要件をクリアできるのは、この `NamedSlideShows` を駆使したプログラムアプローチだけだ。

泥臭い手作業や、無駄なファイル複製によるバージョン管理の崩壊とは今日でサヨナラしてほしい。
君の手でこのコードを実装し、スマートで圧倒的な業務効率化の仕組みを現場に定着させたまえ。健闘を祈る。

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