PowerPoint VBAの「深淵」を制す:カスタムスライドショーを自在に操る動的構築術
現場でPowerPointを扱っていると、必ず突き当たる壁がある。「相手によって話す内容を変えたいが、そのたびにスライドを手動で選別するのは生産性が低すぎる」という課題だ。
多くの初学者は、スライドを複製して別ファイルを作るという「破壊的アプローチ」をとる。だが、それは保守性の地獄への入り口だ。マスターデータ(元ファイル)に変更があった瞬間、全ての派生ファイルが陳腐化する。
真の自動化エンジニアは、`Presentation.SlideShowSettings`と`NamedSlideShows`を制御する。元ファイルは一つ。抽出ロジックだけをVBAに持たせる。これが、プロのアーキテクチャだ。
—
なぜ `NamedSlideShows` なのか?
PowerPointのオブジェクトモデルにおいて、`NamedSlideShows` コレクションは、特定の順序・選択肢でスライドを再生するための「仮想的なプレイリスト」だ。
これを動的に生成することで、以下のメリットが生まれる。
1. 非破壊性: 元のスライド構成を一切汚さない。
2. 即時性: データベース(ExcelやCSV)から条件を読み込み、瞬時に最適なプレゼン構成を組み立てられる。
3. 保守性: 編集が必要なのは「抽出ロジック(VBA)」と「スライド本体」のみ。
—
実装の極意:動的カスタムショー構築コード
以下に、実務でそのまま運用可能なプロダクションレベルのコードを提示する。エラーハンドリングとオブジェクトのクリーンアップは、堅牢なシステムの基本だ。
Option Explicit
‘ ———————————————————
‘ 目的: ターゲット顧客に応じてスライドを抽出し、即座にスライドショーを開始する
‘ ———————————————————
Public Sub ExecuteDynamicSlideShow(ByVal customShowName As String, ByRef targetSlideIndices As Variant)
Dim pres As Presentation
Dim customShow As CustomSlideShow
Dim i As Long
Set pres = ActivePresentation
‘ 1. 同名の既存カスタムショーが存在すれば削除(再実行時の衝突回避)
On Error Resume Next
pres.SlideShowSettings.NamedSlideShows(customShowName).Delete
On Error GoTo 0
‘ 2. 新規カスタムショーを作成
Set customShow = pres.SlideShowSettings.NamedSlideShows.Add(customShowName, targetSlideIndices)
‘ 3. スライドショーの設定を適用
With pres.SlideShowSettings
.RangeType = ppShowNamedSlideShow
.SlideShowName = customShowName
.LoopType = ppShowTypeSpeaker ‘ 発表者ツールを使用
‘ 4. 実行
.Run
End With
Debug.Print “カスタムショー [” & customShowName & “] の再生を開始しました。”
End Sub
‘ ———————————————————
‘ 使用例:外部データ(配列)から動的にカスタムショーを作る呼び出し元
‘ ———————————————————
Public Sub LaunchDemo()
‘ 例えば「顧客A向け」にスライド1, 3, 5, 8を抽出する場合
Dim slideArray As Variant
slideArray = Array(1, 3, 5, 8)
ExecuteDynamicSlideShow “Dynamic_ClientA”, slideArray
End Sub
—
開発における「3つの鉄則」
現場でこのシステムを運用する際、以下の3点に注意せよ。これらを疎かにすると、現場でツールが「動かない」という悲劇を招く。
1. スライド番号の「絶対参照」を避ける
`Array(1, 3, 5, 8)` のようにインデックスをベタ書きするのは危険だ。スライドが追加・削除された瞬間に整合性が崩れる。
対策: スライドに「タグ(`Slide.Tags`)」を埋め込み、実行時にタグを検索してインデックスを取得する設計にせよ。これにより、スライドの順序が変わってもマクロは壊れない。
2. `SlideShowSettings` の状態を初期化する
`SlideShowSettings` はグローバルに近い状態で保持されるため、前回の設定が残っていると挙動が予測不能になる。必ず、新しいカスタムショーを実行する直前に、`.RangeType` を明示的に再設定すること。
3. ファイル連携時のデッドロック回避
もし外部のExcelやデータベースから情報を取得する場合、ファイルを開いたままにするのは厳禁だ。
対策: `GetOpenFilename` や `DAO/ADO` を使い、ストリームとしてデータを読み取ったら即座にコネクションを閉じる。プレゼンテーションの実行中に外部ファイルがロックされていると、配布先環境で確実にクラッシュする。
—
アーキテクトからの助言
PowerPoint VBAの自動化は、単なる「作業の短縮」ではない。プレゼンテーションという「コミュニケーションの核」を、ロジックによって最適化する行為だ。
今回紹介した`NamedSlideShows`は、PowerPointが持つ隠れた「データベース的機能」である。これを使えば、一つのファイルで何百ものバリエーションのプレゼンが可能になる。ぜひ、あなたの現場の「手作業の山」を、このコードでスマートに片付けてほしい。
質問があればいつでも歓迎する。コードの先にある、真の自動化を目指そう。
