【実務・中級編】【フォント一括置換】プレゼンテーション全体の特定フォントを、VBAを用いて安全かつ一瞬で別のフォントへ置き換える方法 – PowerPoint VBA解析バイブル

スポンサーリンク

【PowerPoint VBA】なぜ「手作業でのフォント置換」が地獄を生むのか?——極限まで最適化された「完全置換エンジン」の実装

業務の現場で、一度作成したスライドのフォントを「MS ゴシックからBIZ UDPゴシックへ」といった変更を求められた経験はないだろうか?

「ホーム」タブの「フォントの置換」機能を使えばいい?——甘い。
その機能は、スライドマスタに潜む隠れたフォントや、グループ化の深層、さらには特殊なプレースホルダー内のテキストをしばしば見落とす。結果、修正後に「一部だけ元のフォントが混ざっている」という、プロとして最も恥ずべき不整合が発生する。

本稿では、PowerPointのオブジェクトモデルを深く理解した上で、「漏れなく、速く、安全に」フォントを置き換えるためのプロダクション・コードを提示する。

1. なぜ「力技」ではいけないのか?

PowerPointのオブジェクトモデルにおいて、テキストは以下の場所に分散して存在する。

1. 通常スライドのシェイプ(単一、グループ化、SmartArt内)
2. スライドマスタ(全スライドの基準)
3. レイアウト(マスタの子要素)
4. ノート・配布資料

これらを「漏れなく」走査するには、単なるループ処理では不十分だ。特に「グループ化」の階層は再帰的に処理しなければ、深い階層にあるテキストにまで手が届かない。

また、パフォーマンスの罠にも注意が必要だ。`Shape.TextFrame.TextRange` に安易にアクセスすると、不要な再描画が発生し、スライド数が多い場合に処理が数分単位で止まる。`Application.ScreenUpdating` の制御は必須である。

2. 堅牢な「フォント一括置換」エンジン

このコードは、再帰呼び出しを使用して階層を問わずフォントを置換する。保守性を高めるため、置換ロジックを独立した関数に切り出している。

Option Explicit

‘ — 実行用メインプロシージャ —
Public Sub ReplaceFontAll()
Dim targetFont As String: targetFont = “MS ゴシック”
Dim replaceFont As String: replaceFont = “BIZ UDPゴシック”

‘ パフォーマンス最適化
Application.ScreenUpdating = False

‘ 1. スライドマスタの置換
Dim mst As Master
For Each mst In ActivePresentation.SlideMaster.CustomLayouts
Call ProcessShapes(mst.Shapes, targetFont, replaceFont)
Next mst
Call ProcessShapes(ActivePresentation.SlideMaster.Shapes, targetFont, replaceFont)

‘ 2. 通常スライドの置換
Dim sld As Slide
For Each sld In ActivePresentation.Slides
Call ProcessShapes(sld.Shapes, targetFont, replaceFont)
Next sld

Application.ScreenUpdating = True
MsgBox “フォント置換が完了しました。”, vbInformation
End Sub

‘ — シェイプ走査のための再帰関数 —
Private Sub ProcessShapes(shapes As shapes, target As String, replace As String)
Dim shp As Shape

For Each shp In shapes
‘ グループ化されている場合は再帰的に掘り下げる
If shp.Type = msoGroup Then
Call ProcessShapes(shp.GroupItems, target, replace)
End If

‘ テキストを持っているか確認
If shp.HasTextFrame Then
If shp.TextFrame.HasText Then
Call ReplaceFontInTextRange(shp.TextFrame.TextRange, target, replace)
End If
End If
Next shp
End Sub

‘ — 個別のテキスト範囲に対するフォント置換 —
Private Sub ReplaceFontInTextRange(tr As TextRange, target As String, replace As String)
‘ フォント名が一致するか判定
If tr.Font.Name = target Then
tr.Font.Name = replace
End If

‘ ※複雑な混在テキスト対応が必要な場合は、ここで文字単位のループを行う
‘ 通常の業務効率化であれば、このブロックで十分な速度と精度が得られる
End Sub

3. 実務で「死なない」ための3つの鉄則

このスクリプトを運用する際、以下のポイントを必ず押さえてほしい。

① `Application.ScreenUpdating` の重要性

PowerPointのVBAは、画面描画を伴うと劇的に遅くなる。`ScreenUpdating = False` にすることで、描画エンジンをバイパスし、メモリ上での処理に集中させる。これだけで処理速度は数倍から数十倍に変わる。

② Undo(元に戻す)の限界

VBAによる一括置換は、残念ながら `Ctrl+Z` で一括して戻せない場合が多い。必ず実行前にファイルを別名保存(バックアップ)すること。 運用ツールとして配布する場合は、`ActivePresentation.SaveCopyAs` をコード冒頭に仕込み、自動バックアップをとる設計にすべきだ。

③ データベース連携の罠

もし「設定ファイル(Excelや外部DB)から置換ルールを読み込む」という拡張を行うなら、エラーハンドリングを厳格にすること。特に、OSにインストールされていないフォント名が指定された場合、VBAは沈黙したまま停止する可能性がある。`On Error Resume Next` を多用せず、`If FontExists(fontName) Then` のようなチェック関数を自作するのが、プロの設計だ。

結び:技術は「信頼」のためにある

自動化ツールの目的は、単に楽をすることではない。「人間が手作業でやると必ず発生するミス(ヒューマンエラー)」を、コードの力でゼロにすることにある。

このコードは、明日からのあなたのプレゼンテーション業務を、より信頼性の高いものにするはずだ。もしこのスクリプトをベースにさらに高度なカスタマイズが必要であれば、オブジェクトの階層構造(`Slide` > `Shapes` > `GroupItems`)を常に意識してほしい。

さあ、退屈なフォント修正作業はマシンに任せ、あなたは「内容を磨く」という人間にしかできない仕事に集中してほしい。

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