【実務・中級編】【プレゼン新規作成】”Application.Presentations.Add”時のデフォルトテーマ適用を回避し、完全にクリーンな「白紙」プレゼンテーションをVBAから生成する方法 – PowerPoint VBA解析バイブル

スポンサーリンク

PowerPoint VBAを掌握せよ:デフォルトの呪縛を断ち切る「完全白紙」プレゼン生成術

エンジニア諸君。業務自動化の現場において、PowerPoint VBAは時として「魔境」と化す。
特に自動生成ツールを開発する際、多くの者が遭遇する壁が「環境依存のテンプレート汚染」だ。

`Presentations.Add` を実行した瞬間、開発環境の `blank.potx` に設定された余計なフォント、色設定、あるいは謎のプレースホルダーが混入する。配布先の環境でデザインが崩れるのは、この「見えない依存関係」を排除できていないからに他ならない。

今日は、環境の影響を一切受けず、真の意味で「クリーンな白紙」を生成するための設計思想と実装を授ける。

1. なぜ `Presentations.Add` だけでは不十分なのか

`Presentations.Add(msoTrue)` と記述すれば「白紙」ができると信じているなら、それは甘い。
この引数は「GUIを表示させない」という挙動を制御するだけで、背後で読み込まれる既定のテンプレート設定(スライドサイズ、マスター設定、配色)まで無効化するわけではない。

プロフェッショナルな自動化ツールを作るなら、「生成した後に環境を強制的にリセットする」というアプローチが必要だ。

2. 堅牢な「完全白紙生成」プロダクションコード

以下のコードは、単にプレゼンを作るだけでなく、スライドサイズを明示的に定義し、不要なレイアウトを全削除した上で「真っさらなキャンバス」を準備する。

Option Explicit

‘ @brief クリーンなプレゼンテーションを生成するアーキテクチャ
Public Sub CreateCleanPresentation()
Dim pptApp As Application
Dim pptPres As Presentation
Dim pptSlide As Slide

Set pptApp = Application

‘ 1. プレゼンテーションの新規作成(GUI表示は適宜制御)
Set pptPres = pptApp.Presentations.Add(WithWindow:=msoTrue)

‘ 2. スライドサイズを規格化 (16:9 – ppSlideSizeOnScreen16x9)
‘ 環境による差異を排除するため、単位を固定する
pptPres.PageSetup.SlideSize = ppSlideSizeOnScreen16x9

‘ 3. 既定のスライドをすべて「白紙」のレイアウトに差し替え、余計な要素を削除
Dim i As Long
For i = pptPres.Slides.Count To 1 Step -1
Set pptSlide = pptPres.Slides(i)

‘ レイアウトを「白紙(ppLayoutBlank)」に強制変更
pptSlide.Layout = ppLayoutBlank

‘ プレースホルダー等の残骸を全削除
Dim shp As Shape
For Each shp In pptSlide.Shapes
shp.Delete
Next shp
Next i

‘ 4. マスタースライドのクリーンアップ(必要に応じて)
‘ ※上級者はここからSlideMasterのオブジェクトを操作し、
‘ フォントや配色をプログラムで再定義する。

MsgBox “クリーンなプレゼンテーションの生成が完了しました。”, vbInformation
End Sub

3. 実務で「刺されない」ための設計の注意点

A. オブジェクトの破棄とライフサイクル

VBAにおけるメモリリークの最大の原因は、`Presentation` オブジェクトを明示的に `Close` しないことだ。特にデータベースからデータを吸い上げてスライドを量産する場合、ループの過程で `pptPres` を適切にハンドリングしなければ、メモリ不足でExcelごと沈没する。

B. レイアウトIDの罠

`ppLayoutBlank` は比較的安全だが、企業独自のカスタムテンプレートが適用されている場合、`Layout` プロパティが意図しない挙動を示すことがある。
「レイアウトに頼るな、シェイプの削除に頼れ」。これが結論だ。全シェイプを走査して削除するループこそが、最も確実な「白紙化」の手法である。

C. データベース連携時のボトルネック

大量のデータをプレゼンに流し込む際は、必ず `Application.ScreenUpdating = False` (※PowerPointには存在しないため、`Presentation.Windows` の制御等で代用) を検討し、描画負荷を最小限に抑えること。描画を伴う自動化は、完了までの時間が指数関数的に伸びることを忘れてはならない。

最後に:エンジニアとしての矜持

自動化の目的は、単にコードを書くことではない。「誰がどの環境で実行しても、必ず同じ結果が返ってくる」という決定論的なシステムを構築することにある。

今回紹介した「白紙化」のプロセスは、いわばプレゼンテーション構築の「クリーンインストール」だ。基礎を疎かにする者は、複雑なロジックを組んだ瞬間に必ず崩壊する。

まずはこのコードをベースに、君たちの現場の要件に合わせて拡張してほしい。
君たちの書くコードが、誰かの退屈な作業を撲滅する武器になることを期待している。

健闘を祈る。

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