PowerPoint VBAを掌握せよ:スライド自動選別による「プレゼン資料の動的生成」術
エンジニア諸君。現場で「社内用資料と社外用資料をいちいち手作業でコピーして作り分けている」という無駄な時間を過ごしていないか?
プレゼン資料の数が増え、複雑になればなるほど、手作業による削除や非表示設定は「ヒューマンエラーの温床」となる。
今回は、PowerPointのオブジェクトモデルを深く理解し、スライドのメタデータ(キーワード)を基に「非表示スライド」を一括制御する堅牢なアーキテクチャを伝授する。
—
1. なぜ「手作業」が地獄への入り口なのか
多くの者がやりがちなのは、「スライドを削除して別名保存する」という非破壊的ではない手法だ。これは論外である。元ファイルが破壊されるリスク、そして修正が入った際に複数ファイルを同期させるコスト。これらは自動化の敵だ。
我々が取るべきアプローチは「属性のトグル(切り替え)」である。
PowerPointの `Slide.SlideShowTransition.Hidden` プロパティを操作することで、ファイル構造を維持したまま、表示・非表示を論理的に切り替える。これが最も安全で、最も拡張性の高い設計だ。
—
2. 堅牢なプロダクションコードの設計思想
以下のコードは、単に動くだけのスクリプトではない。
- エラーハンドリング: スライドが存在しない、あるいは参照が外れた際もクラッシュさせない。
- 可読性: 処理の分離を行い、保守性を確保する。
- 効率: `Application.ScreenUpdating` に類する制御(PPTにはないが、オブジェクト操作を最小化する設計)でパフォーマンスを担保する。
実装コード:`ToggleSlideVisibilityByKeyword`
Option Explicit
‘ ———————————————————
‘ 指定したキーワードを含むスライドを非表示にする
‘ @param targetKeyword 検索対象の文字列
‘ @param setHidden Trueなら非表示、Falseなら表示
‘ ———————————————————
Public Sub ToggleSlideVisibilityByKeyword(ByVal targetKeyword As String, ByVal setHidden As Boolean)
Dim pptPres As Presentation
Dim pptSlide As Slide
Dim pptShape As Shape
Dim isFound As Boolean
Set pptPres = ActivePresentation
‘ 処理の高速化と意図せぬ挙動を防ぐためのエラーハンドリング
On Error GoTo ErrorHandler
For Each pptSlide In pptPres.Slides
isFound = False
‘ スライド内の全テキストボックス・図形を走査
‘ 注意: グループ化された図形がある場合は再帰処理が必要だが、
‘ 今回はシンプルかつ高速な実装のためトップレベルを対象とする
For Each pptShape In pptSlide.Shapes
If pptShape.HasTextFrame Then
If InStr(1, pptShape.TextFrame.TextRange.Text, targetKeyword, vbTextCompare) > 0 Then
isFound = True
Exit For
End If
End If
Next pptShape
‘ キーワードが見つかった場合、スライドの表示状態を変更
If isFound Then
pptSlide.SlideShowTransition.Hidden = IIf(setHidden, msoTrue, msoFalse)
End If
Next pptSlide
MsgBox “処理が完了しました。”, vbInformation
Exit Sub
ErrorHandler:
MsgBox “予期せぬエラーが発生しました: ” & Err.Description, vbCritical
End Sub
‘ 実行用ラッパー
Public Sub HideInternalSlides()
‘ 例えば「【社内秘】」というキーワードを含むスライドを非表示にする
Call ToggleSlideVisibilityByKeyword(“【社内秘】”, True)
End Sub
—
3. 実践の極意:さらなる高みへ
このスクリプトを導入する際、以下の3点に注意せよ。これこそが「伝説のエンジニア」と「単なるコーダー」の境界線だ。
① スライドマスターの罠
スライドマスターやレイアウトにテキストを埋め込んでいる場合、上記のコードでは検知できない。もしマスターレベルまで徹底管理したい場合は、`pptPres.SlideMaster` 以下のオブジェクトを走査する必要がある。しかし、基本的には「個別のスライド」にタグを埋め込む運用を推奨する。
② データベース・外部連携
もし資料が100枚を超え、キーワードが動的に変化するなら、VBAだけで完結させるべきではない。Excelを「設定ファイル」として使い、`GetObject` でExcelシートからキーワードリストを読み込む設計に拡張せよ。これにより、コードを修正することなく、非表示ルールを運用側で管理できるようになる。
③ クリーンアップの重要性
納品前には必ず `Hidden = msoFalse` を行うリセットマクロを用意しておくこと。自動化ツールは「元に戻す手段」があって初めて完成する。
—
結論:自動化は「設計」で決まる
今回提示したコードは、単なるテキスト検索・属性変更に過ぎない。しかし、これを「業務プロセスにどう組み込むか」という視点を持つことで、君のプレゼン資料作成時間は劇的に短縮されるはずだ。
コードをコピペして終わりにするな。なぜ `vbTextCompare` を使ったのか、なぜ `On Error` を置いたのか。その背景にある論理を理解し、自身の現場に合わせて最適化せよ。
それが、真の自動化エンジニアへの第一歩だ。次なる課題があれば、いつでも持ってくるがいい。期待している。
