こんにちは。業務自動化の世界へようこそ。
「マクロの記録」ボタンを押しても何も起きないPowerPointの世界で、絶望を感じたことはありませんか?Excelと違い、PowerPointは「どこに何があるか」という階層構造が非常に複雑です。
しかし、一度その構造を理解してしまえば、数百枚のプレゼン資料を一瞬で整える「魔法」が手に入ります。今回は、多くのエンジニアが一度は挫折する「フォントの一括置換」という難題を、プロのアーキテクトの視点で攻略してみましょう。
—
1. なぜ「手作業」や「置換機能」ではダメなのか?
PowerPointの標準機能「フォントの置換」は便利ですが、グループ化された図形の中、テキストボックスの中、スライドマスタの中という「深い階層」に潜むフォントを完全に取りこぼすことがあります。
真の自動化エンジニアは、「目に見えるもの」だけでなく、「オブジェクトの背後にある構造」を操作します。これから書くコードは、スライドの表層からマスタの深淵まで、すべてのテキストを網羅的に探索する再帰的アプローチを採用します。
—
2. 攻略の要:オブジェクトモデルの階層構造
PowerPoint VBAを操るには、この階層をイメージしてください。
- Application: PowerPointそのもの
- Presentation: 開いているファイル
- Slide / SlideMaster: スライドそのもの、あるいは雛形
- Shape: テキストボックスや画像などの「入れ物」
- TextFrame / TextRange: その中にある「文字」
この階層を、上から順に、あるいは再帰的に潜っていくのがVBAの作法です。
—
3. 実装:フォント一括置換マクロ
それでは、現場で即戦力となるコードを提示します。これを標準モジュールに貼り付けてください。
Option Explicit
‘ 実行用メインプロシージャ
Sub ReplaceAllFonts()
Dim targetFont As String, newFont As String
targetFont = “MS ゴシック” ‘ 置換元のフォント
newFont = “BIZ UDPゴシック” ‘ 置換先のフォント
‘ 1. スライドマスタを置換
Dim m As Master
For Each m In ActivePresentation.SlideMaster.CustomLayouts
ProcessShapes m.Shapes, targetFont, newFont
Next m
‘ 2. 通常スライドを置換
Dim sld As Slide
For Each sld In ActivePresentation.Slides
ProcessShapes sld.Shapes, targetFont, newFont
Next sld
MsgBox “フォントの置換が完了しました!”, vbInformation
End Sub
‘ シェイプを再帰的に探索する関数
Sub ProcessShapes(shapes As shapes, target As String, replacement As String)
Dim shp As Shape
For Each shp In shapes
‘ グループ化されている場合は中身を再帰的に探索
If shp.Type = msoGroup Then
ProcessShapes shp.GroupItems, target, replacement
End If
‘ テキストを持っている場合のみ処理
If shp.HasTextFrame Then
If shp.TextFrame.HasText Then
‘ フォント名が一致したら置換
If shp.TextFrame.TextRange.Font.Name = target Then
shp.TextFrame.TextRange.Font.Name = replacement
End If
End If
End If
Next shp
End Sub
—
4. コードの解説:ここが「プロのこだわり」
① なぜ再帰(Recursion)を使うのか?
`ProcessShapes` という関数の中で、自分自身を呼び出しています。これは「グループの中にグループが入っている」という複雑な構造に対応するためです。力技でループを回すだけでは、深い階層にあるテキストは無視されてしまいます。再帰こそが、複雑なプレゼン資料を掌握する鍵なのです。
② HasTextFrame の重要性
PowerPointのシェイプには「テキストを持たないもの(画像や線など)」も含まれます。これに対して無理やりテキスト操作を行うと、VBAはエラーで停止します。`HasTextFrame` で「この箱には文字が入る余地があるか?」を確認する、これが安全なコードを書くための作法です。
③ 陥りやすい罠:フォントの「日本語」と「英数」
PowerPointには「日本語用フォント」と「英数字用フォント」の概念があります。今回のコードは `Font.Name` を使用していますが、もし置換がうまくいかない場合は `Font.NameFarEast` を使用してみてください。これが実務で最もハマりやすいポイントです。
—
最後に:自動化は「効率」ではなく「余裕」を作る
このスクリプトを走らせれば、手作業でフォントを探してクリックし続ける30分が、わずか0.1秒に短縮されます。
浮いた時間は、資料の構成案を練ったり、少しだけ早く帰ってリフレッシュしたりするために使ってください。「VBAを書くことは、自分の時間を守ること」です。
ここをクリアできれば、あなたはもう初心者ではありません。次のステップでは、プレゼン資料の「色」の一括置換や、画像サイズの自動最適化など、さらに深い領域へと進んでいきましょう。
応援していますよ。困ったことがあれば、またいつでも聞きに来てください。
