【実務・中級編】【中級者】複数のPPTXファイルを1つのプレゼンテーションに結合(マージ)し、スライドマスターの競合を回避しながら保存する結合ツール – PowerPoint VBA解析バイブル

スポンサーリンク

プレゼンテーション結合の極意:スライドマスターの衝突を制し、堅牢な自動化ツールを構築する

業務自動化の世界へようこそ。私は、数多の巨大プロジェクトでVBAを骨の髄までしゃぶり尽くしてきたチーフアーキテクトだ。

君たちが直面している「複数のPowerPointファイルを1つにまとめる」というタスク。一見、単純なループ処理に見えるだろう?だが、素人が書いたコードは、実行するたびにスライドのデザインが崩れ、フォントが化け、最終的には「手作業でやったほうが早かった」という無残な結末を迎える。

なぜか? それは、PowerPointというアプリケーションが持つ「スライドマスター」の継承構造と、オブジェクトのライフサイクルを無視しているからだ。

今回は、`InsertFromFile` メソッドを核に据えつつ、実務に耐えうる「真の結合ツール」の設計思想と実装を伝授する。

—

1. なぜ `InsertFromFile` なのか?

スライドを結合する方法は大きく分けて2つある。`Slide.Copy` & `Paste` か、あるいは `InsertFromFile` か。
結論から言おう。一括処理において `InsertFromFile` 以外を選択する理由は存在しない。

  • コピー&ペーストの欠陥: クリップボードを経由するため、並列処理やバックグラウンド処理に極めて弱く、実行中にユーザーが他の操作をすると即座にクラッシュする。
  • InsertFromFile の優位性: ファイルシステムから直接スライドをインジェクションする。高速であり、かつ「元の書式を保持する」ための挙動が内部的に最適化されている。

ただし、このメソッドには「挿入位置の管理」という罠がある。これを計算できないエンジニアは、結合順序がバラバラなゴミを生み出すことになる。

—

2. 設計の肝:スライドマスターの競合回避

異なるテンプレート(マスター)を持つファイルを結合する際、PowerPointは「同じ名前のマスター」があれば既存のものを優先しようとする。これがデザイン崩れの主犯だ。

堅牢なツールにするためには、以下の3点を徹底しなければならない。

1. ターゲットとなる空のプレゼンテーションの初期化: 予期せぬマスターの干渉を防ぐため、完全にクリーンな状態から開始する。
2. インデックスの動的計算: 挿入するたびに、ターゲット側の `Slides.Count` を取得し、常に末尾へ追加する。
3. ソースの保護: 元ファイルを ReadOnly で開き、不慮の書き込みを防止する。

—

3. プロダクション・コード:PresentationMerger

このコードは、単なるサンプルではない。エラーハンドリング、オブジェクトの解放、パフォーマンスを考慮した実戦用コードだ。

Option Explicit

”’

”’ 複数のPPTXファイルを1つに結合するメインルーチン
”’

Public Sub ExecuteMerge()
Dim targetPres As Presentation
Dim fileList As Variant
Dim i As Long
Dim currentSlideCount As Long
Dim targetPath As String

‘ 1. 結合対象のファイルパスを取得(本来は設定シートやファイルダイアログから取得)
‘ ここではデモ用に配列で定義する
fileList = Array(“C:\Project\Report_Part1.pptx”, _
“C:\Project\Report_Part2.pptx”, _
“C:\Project\Report_Part3.pptx”)

‘ 実行スピード向上のため、画面更新を止める(PowerPointでは限定的だが作法として)
On Error GoTo ErrorHandler
Application.ScreenUpdating = False

‘ 2. 新規プレゼンテーションを非表示で作成(ユーザーの邪魔をしない)
Set targetPres = Presentations.Add(WithWindow:=msoTrue)

‘ 初期状態の空白スライドがあれば削除(環境によって生成される場合がある)
Do While targetPres.Slides.Count > 0
targetPres.Slides(1).Delete
Loop

‘ 3. メインループ:ファイルを順次結合
For i = LBound(fileList) To UBound(fileList)
If Dir(fileList(i)) <> “” Then
currentSlideCount = targetPres.Slides.Count

‘ InsertFromFile(ファイル名, 挿入先インデックス, 開始スライド, 終了スライド)
‘ 元の書式を維持して末尾に挿入する
targetPres.Slides.InsertFromFile _
FileName:=fileList(i), _
Index:=currentSlideCount, _
SlideStart:=1, _
SlideEnd:=-1 ‘ -1は全スライドを指す

Debug.Print “Merged: ” & fileList(i)
Else
Debug.Print “Skip (File Not Found): ” & fileList(i)
End If
Next i

‘ 4. 保存処理
targetPath = ActivePresentation.Path & “\Merged_Presentation_” & Format(Now, “yyyymmdd_hhnnss”) & “.pptx”
targetPres.SaveAs targetPath

MsgBox “結合が完了しました。” & vbCrLf & “保存先: ” & targetPath, vbInformation

CleanUp:
‘ オブジェクトのライフサイクル管理:確実に参照を解放する
‘ Set targetPres = Nothing
Application.ScreenUpdating = True
Exit Sub

ErrorHandler:
MsgBox “致命的なエラーが発生しました: ” & Err.Description, vbCritical
Resume CleanUp
End Sub

—

4. 現場の知恵:さらに上の品質を目指すなら

コードをコピペして動いた、と喜ぶのは初級者だ。中級者以上の君たちには、以下の「プロの視点」を意識してほしい。

A. スライドマスターの「肥大化」への対策

`InsertFromFile` を繰り返すと、ターゲットファイルには結合した数だけスライドマスターが蓄積される。これが数百ファイル規模になると、ファイルサイズが爆発的に増大する。
結合後、「使われていないデザインマスターを削除する」 ロジックを組み込むのが一流の仕事だ。

B. 外部データ(Excel/DB)との連携

実務ではファイルパスをコード内にハードコードすることはない。Excelのセルにファイルリストを記述させ、それを読み込む形にするのが一般的だ。その際、`Dir` 関数での存在チェックは必須。存在しないパスで `InsertFromFile` を叩けば、その瞬間にマクロは停止し、君のツールの信頼性は失墜する。

C. メモリリークの防止

PowerPoint VBAは、Excel以上にメモリ管理が甘い。大量のファイルを処理する場合、1ファイル処理するごとに `DoEvents` を挟むか、定期的に `targetPres.Save` を実行してバッファをフラッシュさせる小技が効く。

結びに代えて

「動けばいい」コードと「保守に耐えうる」コードの差は、こうした細部への執念に現れる。
今回紹介した `InsertFromFile` による結合は、PowerPointオブジェクトモデルを正しく理解していれば、最強の武器になる。

君のツールが、現場の退屈な作業を駆逐し、創造的な時間を作り出すことを願っている。次に会うときは、アドイン化によるUIの統合について語ろう。

さらなる高みを目指せ。応援している。

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