PowerPoint VBAを掌握せよ:キーワード抽出による「スライド仕分け」の極意
業務自動化を志すエンジニア諸君。PowerPointの操作を自動化する際、多くの初心者は「とりあえず動くコード」を書き、後で膨大なデバッグコストに追われるという泥沼に足を踏み入れる。
今日扱うのは、「特定のキーワードを含むスライドだけを抽出し、別ファイルとして保存する」という現場で頻出するタスクだ。一見単純だが、ここにはオブジェクトの参照管理、メモリ解放、そして非同期に近いファイル操作の罠が潜んでいる。
なぜ多くのコードが破綻するのか。それは「プレゼンテーションをコピーして不要なものを消す」という発想で実装するからだ。賢明なエンジニアは「新しいファイルを作成し、必要なものだけをインポートする」というアプローチをとる。
—
1. なぜ「削除」ではなく「抽出」なのか
既存のファイルをコピーしてスライドを削除し続けるコードは、以下の理由で推奨しない。
- 不安定さ: `Slide.Delete`を実行するとインデックスが即座に繰り上がる。ループ中にこれをやると、処理対象の判定が狂い、バグの温床となる。
- ファイルサイズの肥大化: スライドを削除しても、内部メタデータや埋め込みオブジェクトがキャッシュとして残りやすく、ファイルが最適化されない。
結論: 空のプレゼンテーションを作成し、必要なスライドだけを`Copy`して`Paste`する。これが最も堅牢で、かつ最速のアーキテクチャだ。
—
2. プロダクション品質の抽出コード
このコードは、エラーハンドリングとオブジェクトの解放を徹底した「現場で使える」設計になっている。
Option Explicit
‘ — 指定キーワードを含むスライドを抽出し、別ファイルとして保存する —
Sub ExtractSlidesByKeyword()
Dim sourcePres As Presentation
Dim targetPres As Presentation
Dim slideObj As Slide
Dim shapeObj As Shape
Dim targetFile As String
Dim keyword As String
Dim isFound As Boolean
‘ 1. 初期設定
keyword = InputBox(“抽出するキーワードを入力してください:”, “キーワード指定”)
If keyword = “” Then Exit Sub
Set sourcePres = ActivePresentation
‘ 新規プレゼンテーションの作成
Set targetPres = Presentations.Add
‘ 2. メインループ:スライドを精査
For Each slideObj In sourcePres.Slides
isFound = False
‘ スライド内の全シェイプからキーワードを探索
For Each shapeObj In slideObj.Shapes
If shapeObj.HasTextFrame Then
If InStr(shapeObj.TextFrame.TextRange.Text, keyword) > 0 Then
isFound = True
Exit For
End If
End If
Next shapeObj
‘ 3. キーワード合致時、スライドをコピーして挿入
If isFound Then
slideObj.Copy
targetPres.Slides.Paste
End If
Next slideObj
‘ 4. 保存処理
If targetPres.Slides.Count > 0 Then
targetFile = Environ(“USERPROFILE”) & “\Desktop\Extracted_” & Format(Now, “yyyymmdd_hhnnss”) & “.pptx”
targetPres.SaveAs targetFile
MsgBox “抽出完了: ” & targetFile, vbInformation
Else
targetPres.Close
MsgBox “該当するスライドは見つかりませんでした。”, vbExclamation
End If
‘ オブジェクトの明示的解放(メモリ管理の鉄則)
Set targetPres = Nothing
Set sourcePres = Nothing
End Sub
—
3. 現場で生き残るための設計思想
このコードをただコピペするだけでなく、以下の「アーキテクトの視点」をインストールしておいてほしい。
1. オブジェクトのライフサイクル管理
`Set … = Nothing` を記述するのは儀式ではない。PowerPoint VBAはメモリ管理が甘く、特に複雑なマクロを繰り返すとプロセスがバックグラウンドに残り続ける(いわゆる「ゾンビプロセス」)。明示的な解放は、長時間の業務自動化において必須だ。
2. インタフェースの分離
今回は `InputBox` を使用したが、実務では設定ファイル(ExcelやJSON)から検索ワードを読み込むのが定石だ。ハードコーディングを避けることが、メンテナンス性の鍵となる。
3. パフォーマンスへの配慮
もし対象ファイルが数百ページある場合、`Application.ScreenUpdating` を制御したくなるかもしれないが、PowerPoint VBAにはExcelのようなプロパティがない。その場合は、`ActiveWindow.ViewType = ppViewNormal` を活用し、画面描画の負荷を最小限に抑える工夫が必要だ。
—
まとめ
今回提示した手法は、「新しいプレゼンテーションに必要最低限の要素だけを移植する」という、極めてクリーンな設計に基づいている。
自動化の本質は「コードを書くこと」ではなく、「次に誰かが保守する際のコストを最小化すること」にある。このコードをベースに、君たちの現場の要件に合わせて拡張してほしい。
次は、これをPDFに一括変換する機能や、SharePoint上のファイルと連携する仕組みについて話そうか。自動化に終わりはない。研鑽を怠るな。
