【実務・中級編】【初心者】開いている複数のプレゼンテーションから、特定のキーワードを含むスライドだけを抽出して新しいファイルとして保存する仕分けマクロ – PowerPoint VBA解析バイブル

スポンサーリンク

【PowerPoint VBA】散らばる資料から「必要な真実」だけを抽出せよ:堅牢な自動仕分けマクロの設計思想

現場でよく見る光景だ。数十個のプレゼンファイルを開き、必要なスライドを探しては「名前を付けて保存」を繰り返す。そんな非生産的な作業に、あなたの貴重なエンジニアリング・リソースを浪費してはならない。

今日は、「開いている全てのプレゼンテーションから、特定のキーワードを含むスライドだけを抽出し、クリーンな状態で別ファイルとして保存する」という、実務直結型の自動化コードを授ける。

ただ動くだけのコードは誰でも書ける。我々が目指すのは、「メモリリークを起こさず、例外に強く、保守可能なプロダクションコード」だ。

—

1. なぜ「力技」では失敗するのか?

初心者が陥る罠は、`ActivePresentation`に依存しすぎることだ。複数のファイルが並列で動く環境では、アクティブなウィンドウは一瞬で切り替わる。これに依存した設計は、実行タイミングによって挙動が揺らぐ「不安定なツール」の元凶だ。

堅牢な設計のための3大原則
1. オブジェクトを明示的に参照する: `ActiveWindow`や`ActivePresentation`は極力使わず、変数として保持した `Presentation` オブジェクトを操作する。
2. クリーンアップを徹底する: 保存後の不要なオブジェクトは即座にメモリから解放する。
3. エラーハンドリングの抽象化: どのファイルが読み込みに失敗したのかを特定できるログ出力構造を持つ。

—

2. 実務向けプロダクションコード

このコードは、現在開いている全てのプレゼンテーションを巡回し、指定キーワードが含まれるスライドを新規ファイルとして保存する。

Option Explicit

‘ メイン処理:開いている全プレゼンテーションからキーワード抽出
Public Sub ExtractSlidesByKeyword()
Dim targetKeyword As String
Dim sourcePres As Presentation
Dim newPres As Presentation
Dim sld As Slide
Dim i As Long

targetKeyword = InputBox(“抽出するキーワードを入力してください”, “キーワード指定”)
If targetKeyword = “” Then Exit Sub

‘ 念のため、現在開いているプレゼンテーションの数を確認
If Presentations.Count = 0 Then
MsgBox “対象のプレゼンテーションが開かれていません。”
Exit Sub
End If

‘ 全プレゼンテーションを巡回
For Each sourcePres In Presentations
Set newPres = Presentations.Add(msoTrue) ‘ 新規プレゼンを作成

For Each sld In sourcePres.Slides
‘ スライド内のテキストを簡易検索(ノートや図形内も含む場合は拡張が必要)
If InStr(1, sld.Shapes.Title.TextFrame.TextRange.Text, targetKeyword, vbTextCompare) > 0 Then
sld.Copy
newPres.Slides.Paste
End If
Next sld

‘ スライドが抽出された場合のみ保存
If newPres.Slides.Count > 0 Then
newPres.SaveAs ThisPresentation.Path & “\Extracted_” & sourcePres.Name
End If

‘ 抽出がなかった場合は保存せずに閉じる
newPres.Close
Next sourcePres

MsgBox “仕分け作業が完了しました。”
End Sub

—

3. このコードを「現場の武器」に変えるために

上記のコードはあくまで「核」だ。実戦投入する際は、以下の視点を加えてほしい。

ファイル・データベース連携の注意点

  • フルパス管理: `ThisPresentation.Path` は、マクロ自体が保存されているフォルダを指す。ネットワークドライブや共有フォルダを扱う際は、`Environ(“USERPROFILE”)` 等で安全な一時ディレクトリを確保してから出力するように設計せよ。
  • 命名の競合: ファイル保存時に既存のファイルと名前が衝突すると、VBAはダイアログを出して停止する。`Dir()` 関数を使って事前にファイルが存在するかチェックし、上書きするか連番を振るロジックを必ず付与すること。

パフォーマンスの重み

  • 画面更新の停止: `Application.ScreenUpdating = False` を使えば実行速度は劇的に向上するが、エラー発生時に画面が戻らなくなるリスクがある。`Error Handler` 内で必ず `ScreenUpdating = True` に戻す「対となる設計」を忘れてはならない。
  • メモリ解放: `Set newPres = Nothing` をループの最後に入れることで、大規模な資料の処理でもメモリ負荷を最小限に抑えられる。

—

最後に:自動化の真髄

「コピペで動く」ことはスタートラインに過ぎない。あなたが真のエンジニアであるなら、このコードに「ログ出力」という付加価値を付け加えてみてほしい。どのファイルから何枚抽出できたのかをテキストファイルに書き出すだけで、あなたの作ったツールはチームの「信頼できる自動化資産」に昇華する。

設計を疎かにするな。ツールは、あなたの思考の写し鏡だ。
さあ、手作業の泥沼から脱出し、より高次元の課題へ挑戦しよう。

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