【実務・中級編】【中級者】スライド内のすべてのテキストボックスからフォント名をスキャンし、社内標準フォントに一括置換してから別名保存するフォントマネージャーマクロ – PowerPoint VBA解析バイブル

スポンサーリンク

序文:その「手作業」が、組織のブランドを毀損している

諸君、今日もスライドのフォントを一つずつ修正して回るような「単純作業の奴隷」になってはいないだろうか。

外部ベンダーから納品された資料、あるいは部署内で継ぎ足しで作られた秘伝のタレのようなプレゼン資料。それらを開いた時に目にする、MSゴシックと游ゴシック、さらにはメイリオが入り混じったカオスは、単に見栄えが悪いだけではない。それは「細部へのこだわりの欠如」をステークホルダーに露呈する、致命的なブランド毀損だ。

だが、全スライドを一枚ずつチェックするなど、エンジニアの仕事ではない。我々がすべきは、「オブジェクトの階層構造を解剖し、一撃で標準化するロジック」を実装することだ。

今回は、PowerPoint VBAの深淵に触れ、再帰処理と例外処理を完璧に使いこなした「フォントマネージャーマクロ」を伝授する。

—

1. 設計の鉄則:なぜあなたのマクロは「抜け漏れ」が出るのか

初級者が書くマクロは、`ActivePresentation.Slides(i).Shapes(j)` をループして終わる。しかし、実務の世界はそんなに甘くない。以下の「三重の壁」を突破しなければ、プロ用のツールとは呼べない。

1. グループ化の壁: シェイプの中にシェイプがある。再帰構造(Recursive Call)でなければ深層まで届かない。
2. 表(Table)の壁: 表の中のテキストは `TextFrame` ではなく `Cell.Shape.TextFrame` に存在する。
3. 言語設定の壁: 日本語(FarEast)と英数字(Ascii)でフォント指定プロパティが異なる。

これらを網羅し、かつ「実行速度」と「堅牢性」を両立させる設計が求められる。

—

2. 実践:プロダクション・グレードのフォント置換コード

このコードは、単にフォントを変えるだけではない。実行中に画面を固めず、エラーをトラップし、処理結果をログとして残すための骨組みを備えている。

Option Explicit

‘ — 設定定数:社内標準フォントをここで定義 —
Private Const TARGET_FONT_JAPANESE As String = “BIZ UDPゴシック”
Private Const TARGET_FONT_ASCII As String = “Segoe UI”
Private Const SAVE_SUFFIX As String = “_Formatted”

‘ — メインルーチン —
Public Sub ExecuteFontStandardization()
Dim targetPres As Presentation
Set targetPres = ActivePresentation

‘ 1. パフォーマンス最適化:再描画の抑制はPowerPointには直接ないが、
‘ ウィンドウを最小化するか、バックグラウンド処理を行うのがチーフアーキテクト流だ。

On Error GoTo ErrorHandler
Debug.Print “— 処理開始: ” & Now & ” —”

Dim sld As Slide
Dim shp As Shape

‘ 全スライドを走査
For Each sld In targetPres.Slides
For Each shp In sld.Shapes
‘ 形状ごとの再帰的処理の呼び出し
ProcessShape shp
Next shp
Next sld

‘ 2. 別名保存(元のファイルを破壊しないのが鉄則)
Dim originalPath As String
Dim newPath As String
originalPath = targetPres.FullName

If InStr(originalPath, “.”) > 0 Then
newPath = Left(originalPath, InStrRev(originalPath, “.”) – 1) & _
SAVE_SUFFIX & Mid(originalPath, InStrRev(originalPath, “.”))
targetPres.SaveAs newPath
MsgBox “フォント置換が完了しました。” & vbCrLf & “保存先: ” & newPath, vbInformation
Else
MsgBox “ファイルを一度保存してから実行してください。”, vbExclamation
End If

Exit Sub

ErrorHandler:
MsgBox “エラーが発生しました: ” & Err.Description, vbCritical
End Sub

‘ — サブルーチン:シェイプの再帰処理 —
Private Sub ProcessShape(ByVal shp As Shape)
Dim i As Long

‘ A. グループ化された図形への対応(再帰)
If shp.Type = msoGroup Then
For i = 1 To shp.GroupItems.Count
ProcessShape shp.GroupItems(i)
Next i

‘ B. 表(Table)への対応
ElseIf shp.HasTable Then
Dim r As Long, c As Long
For r = 1 To shp.Table.Rows.Count
For c = 1 To shp.Table.Columns.Count
ApplyFontToTextFrame shp.Table.Rows(r).Cells(c).Shape.TextFrame
Next c
Next r

‘ C. 通常のテキストボックス / 図形内のテキスト
ElseIf shp.HasTextFrame Then
ApplyFontToTextFrame shp.TextFrame
End If

‘ D. SmartArtへの対応(必要に応じて拡張)
‘ SmartArtは非常に特殊なオブジェクトモデルを持つため、
‘ 業務要件に応じて Node オブジェクトを走査するロジックを追加する。
End Sub

‘ — サブルーチン:フォント適用 —
Private Sub ApplyFontToTextFrame(ByRef tf As TextFrame)
If tf.HasText Then
With tf.TextRange.Font
‘ 日本語フォントの設定
.NameFarEast = TARGET_FONT_JAPANESE
‘ 英数字フォントの設定
.Name = TARGET_FONT_ASCII
End With
End If
End Sub

—

3. 伝説のアーキテクトによる深淵解説

① `Name` と `NameFarEast` の分離

多くの開発者が `Font.Name` だけを書き換えて満足するが、それは素人の仕事だ。Microsoft Officeにおいて、日本語フォントは `NameFarEast` プロパティで管理されている。ここを明示的に指定しない限り、システム環境によって「英数字だけ変わって日本語が化ける」あるいは「その逆」という無様な結果を招く。

② 再帰(Recursion)の必然性

スライド上の図形は、ユーザーによって何重にもグループ化されている可能性がある。
`For Each shp In sld.Shapes` だけでは、グループの中に隠れたテキストボックスに到達できない。`ProcessShape` 関数が自分自身を呼び出す(再帰)構造にしているのは、階層がどれほど深くても、その最深部にある「テキストの魂」を逃さないためだ。

③ ファイル操作の作法

プロダクション環境で動かすコードにおいて、「原本を上書き保存する」という挙動は万死に値する。
必ず `SaveAs` で別名を生成するか、少なくともバックアップを取るロジックを組み込むべきだ。また、`InStrRev` を駆使して拡張子の前にサフィックスを挿入する処理は、地味だがユーザーの利便性を劇的に向上させる。

—

4. さらなる高みへ:一括変換とDB連携のヒント

もし君がこのマクロを「数百のファイル」に対して実行したいのであれば、以下の改修を検討せよ。

1. `Application.Presentations.Open` の引数: `WithWindow:=msoFalse` を指定せよ。画面にプレゼンを表示させずにメモリ上だけで処理することで、速度は数倍に跳ね上がる。
2. フォントマッピング・データベース: 外部のCSVやExcelシートから「置換前フォント」と「置換後フォント」のペアを読み込むようにせよ。コードを書き換えずに、あらゆるプロジェクトのレギュレーションに対応できる汎用ツールへと進化する。
3. エラーログの実装: 破損したスライドや、パスワード保護されたファイルにぶつかった際、マクロを止めずに「どのファイルのどのスライドで失敗したか」をテキストファイルに吐き出すロジックを加えよ。

結論:コードは「意志」を具現化する手段である

PowerPoint VBAは、Excelに比べて軽視されがちな領域だ。しかし、資料作成という「ホワイトカラーの最も高単価な時間」をハックすることによる投資対効果(ROI)は計り知れない。

今回提示したコードは、単なる自動化ではない。「組織の美意識を強制的に維持する」という、マネジメントの意志を具現化したシステムである。

この知見を武器に、カオスな資料群を美しき秩序へと導いてほしい。健闘を祈る。

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