こんにちは。自動化の深淵へようこそ。
「複数のPPTを結合したら、レイアウトが崩壊して地獄絵図になった」――。
これはVBAを扱う者なら誰もが一度は通る洗練の儀式です。原因は明白。「異なるマスター(設計図)を持つスライドを、無理やり一つの場所に押し込んでいるから」です。
今日は、力技で解決するのではなく、「マスターの血統を統一してからマージする」という、アーキテクトとしての作法を伝授します。ここを理解すれば、あなたの自動化スキルは間違いなく一段階上のステージへ到達します。
—
1. なぜレイアウトは崩れるのか?
PowerPointのマスターは、いわば「家系図」です。
Aさんのファイルは「標準マスター」、Bさんのファイルは「独自デザインマスター」。この二つを結合すると、PowerPointは「どっちの家系図に従えばいいの?」と混乱し、スライド上のオブジェクトが迷子になります。
解決策はシンプルです。
1. 結合先となる「テンプレート(マスター)」を確定させる。
2. 結合したい全ファイルを、そのテンプレートで強制的に「上書き(適用)」する。
3. その上で、全スライドを一つの器に流し込む。
これだけで、デザイン崩壊の9割は防げます。
—
2. 破壊的な美学:マスター統一&結合スクリプト
このコードは、指定したフォルダ内の全PPTXを、ターゲットとなるテンプレートに合わせて変換・統合します。
Option Explicit
‘ 伝説のアーキテクトによる、堅牢なプレゼン統合メソッド
Sub MergePresentationsWithMasterSync()
Dim targetTemplatePath As String
Dim sourceFolder As String
Dim targetPres As Presentation
Dim sourcePres As Presentation
Dim fileName As String
‘ 1. 設定:統合先のテンプレートと、素材が入ったフォルダ
targetTemplatePath = “C:\Templates\Master.pptx”
sourceFolder = “C:\TargetFiles\”
‘ 2. 統合用の新規プレゼンを作成
Set targetPres = Presentations.Open(targetTemplatePath)
fileName = Dir(sourceFolder & “.pptx”)
Do While fileName <> “”
‘ 3. ファイルを開く
Set sourcePres = Presentations.Open(sourceFolder & fileName, WithWindow:=msoFalse)
‘ 4. マスターの統一(ここが生命線!)
‘ 各スライドにマスターを再適用することで、デザインの衝突を回避
ApplyMasterToAllSlides sourcePres, targetTemplatePath
‘ 5. 全スライドをターゲットへコピー
sourcePres.Slides.Range.Copy
targetPres.Slides.Paste
sourcePres.Close
fileName = Dir()
Loop
MsgBox “統合完了!マスター統一による美しきマージが成功しました。”, vbInformation
End Sub
‘ マスターを強制的に差し替える魔法の関数
Sub ApplyMasterToAllSlides(pres As Presentation, templatePath As String)
Dim sld As Slide
Dim customLayout As CustomLayout
‘ テンプレートからマスターをインポート
pres.ApplyTemplate templatePath
‘ 念のため、全てのスライドのレイアウトを再設定する
For Each sld In pres.Slides
‘ マスターの1番目のレイアウトを強制適用
sld.CustomLayout = pres.SlideMaster.CustomLayouts(1)
Next sld
End Sub
—
3. このコードの「設計意図」を読み解く
このスクリプトには、初心者が陥りがちな罠を回避する知恵が詰まっています。
① `WithWindow:=msoFalse` の魔法
`Presentations.Open` でファイルを開く際、この引数を忘れると画面がチカチカと点滅し、処理速度が劇的に低下します。バックグラウンドで処理させるのが、プロの自動化です。
② `ApplyTemplate` による血統変更
これが今回のキモです。`ApplyTemplate` を実行することで、スライドが持っている古いマスターの呪縛を解き、新しいマスターのルールに無理やり従わせます。
③ `CustomLayout` の再設定
`ApplyTemplate` だけでは、個別のスライドが古いレイアウトを記憶している場合があります。`sld.CustomLayout = …` と記述することで、強制的に新しいマスターの型にはめ込んでいます。
—
4. 陥りやすいエラーと対策
- 「そんなレイアウトありません」エラー:
ターゲットのテンプレートに存在する「レイアウトのインデックス(番号)」と、元ファイルのレイアウトが一致しない時に起こります。基本は `CustomLayouts(1)`(表紙)や `(2)`(本文)を使いつつ、必要に応じてレイアウト名を指定する手法に切り替えてください。
- 画像がずれる問題:
マスターを統一しても、画像やテキストボックスが絶対座標で配置されているとズレます。こればかりは「プレースホルダー(テキストボックスの枠)」を意識して資料を作るという、運用側の教育も必要です。ツールは魔法ではありません。設計が9割です。
—
最後に:自動化とは「敬意」である
自動化とは、単に作業を短縮することではありません。次にこのファイルを触る人、あるいは半年後の自分が「何が起きたか」を理解できるようにコードを書くこと。それがプロフェッショナルです。
まずはこのスクリプトを動かしてみてください。レイアウトがピタリと揃った瞬間の快感こそが、VBAエンジニアとしての喜びです。
さあ、次のステージへ行きましょう。何かあれば、いつでも聞いてくださいね。
