PowerPoint VBAの深淵:フォントの「迷宮」を制するアーキテクトの流儀
プレゼンテーション作成において、最も生産性を阻害する「見えない敵」をご存知だろうか。それは、他部署から送られてくる、フォントがバラバラに混在したスライドファイルだ。
手動でフォントを置換しても、マスターページ、表の中、あるいはグループ化された図形の奥底に潜む「残党」がデザインを破壊する。多くのエンジニアはここで「置換機能」を使い、そして崩れたレイアウトの修正に追われて時間を浪費する。
今日は、その泥沼から脱却し、「フォントの正規化」を完全自動化するプロダクションコードを授ける。ただ動くコードではない。大規模なプレゼン資料でも耐えうる、堅牢で再利用可能なアーキテクチャだ。
—
1. なぜ「置換機能」では不十分なのか
PowerPointの標準的な置換機能には、致命的な欠陥が二つある。
1. 探索範囲の限定: グループ化されたオブジェクトや、特定のテーブルセル内のフォントを正確に拾いきれないケースがある。
2. メタデータの喪失: フォント置換に伴う字間の詰めや行間の崩れをケアできず、結果として「手直し」という工数が発生する。
我々が目指すべきは、スライド全体を俯瞰し、再帰的にオブジェクトを走査する「クローラー型」の設計だ。
—
2. 堅牢なフォントマネージャー・アーキテクチャ
このスクリプトは、単なる置換器ではない。「抽出・検証・置換・保存」という一連のライフサイクルを管理するツールである。
実装のポイント
- 再帰処理の採用: `Shapes`の中に潜む`GroupItems`を再帰的に叩くことで、複雑な図形構造も漏らさない。
- エラーハンドリング: プレースホルダーの未設定や、テキストを持たないオブジェクトへのアクセスによるクラッシュを防ぐ。
- 別名保存による保全: 原本を破壊せず、必ず新規ファイルとして書き出す安全設計。
プロダクションコード:FontStandardizer.vba
Option Explicit
‘ —————————————————————————–
‘ フォント統一マネージャー
‘ 役割: 指定プレゼンテーション内の全テキストを特定フォントに統一し別名保存する
‘ —————————————————————————–
Public Sub StandardizePresentationFonts()
Dim targetPath As String
Dim savePath As String
Dim targetFont As String
‘ 設定値:本番環境では定数やダイアログで指定すること
targetFont = “游ゴシック”
targetPath = ActivePresentation.FullName
savePath = Left(targetPath, InStrRev(targetPath, “.”) – 1) & “_Formatted.pptx”
Dim sld As Slide
Dim shp As Shape
‘ 処理開始のログ(イミディエイトウィンドウに表示)
Debug.Print “— フォント置換処理を開始します —”
For Each sld In ActivePresentation.Slides
For Each shp In sld.Shapes
Call RecursiveProcessShapes(shp, targetFont)
Next shp
Next sld
‘ 名前を付けて保存(ppSaveAsOpenXMLPresentation = 24)
ActivePresentation.SaveAs savePath, ppSaveAsOpenXMLPresentation
MsgBox “フォントの統一が完了しました。” & vbCrLf & “保存先: ” & savePath, vbInformation
End Sub
‘ 再帰的にシェイプを走査する関数
Private Sub RecursiveProcessShapes(shp As Shape, fontName As String)
On Error Resume Next ‘ 予期せぬオブジェクトによるエラーを回避
‘ テキストフレームがある場合のみ処理
If shp.HasTextFrame Then
If shp.TextFrame.HasText Then
With shp.TextFrame.TextRange.Font
.Name = fontName
End With
End If
End If
‘ グループ化されている場合は再帰的に掘り下げる
If shp.Type = msoGroup Then
Dim subShp As Shape
For Each subShp In shp.GroupItems
Call RecursiveProcessShapes(subShp, fontName)
Next subShp
End If
On Error GoTo 0
End Sub
—
3. 実務で「事故」を起こさないための鉄則
このコードをそのまま導入する際、以下の3点に注意してほしい。
1. テーブル内フォントの罠:
上記のコードはテキストフレームを持つオブジェクトを対象としているが、`Table`オブジェクトは独自の構造を持つ。もし表が多い資料を扱うなら、`shp.Table.Cell(i, j).Shape.TextFrame` を走査するロジックを分岐に追加する必要がある。
2. フォントの存在確認:
`targetFont`に指定したフォントがシステムにインストールされていない場合、PowerPointは自動的に代替フォントを選択する。実行前にインストールチェック関数を噛ませるのが、プロのエンジニアの流儀だ。
3. パフォーマンスの最適化:
スライド数が数百枚を超える場合、`Application.ScreenUpdating = False` を利用して描画更新を止めることで、実行速度を劇的に向上させることができる。
最後に:自動化の真髄
「自動化」とは、ただコードを書くことではない。「何が起きれば崩れるのか」という境界条件を理解し、そのリスクを事前に潰し切ることだ。
このフォントマネージャーは、あなたの組織の資料品質を底上げするための「武器」になるはずだ。まずは手元の雑多な資料で試してみてほしい。もし動作しないオブジェクトがあれば、それはあなたが「まだ知らない構造」を持っているということだ。その発見こそが、エンジニアとしての成長である。
さあ、退屈なフォント修正作業に、今日で終止符を打とう。
