【実務・中級編】【中級者向け】文書内の全段落のフォントを、指定したフォントファミリーに置換する – Word VBA解析バイブル

スポンサーリンク

Word VBAの深淵:全段落のフォントを「ブランド規定」へ強制適合させる極意

Wordの自動化において、最も頻繁に遭遇し、かつ最も多くのエンジニアが「泥沼」にはまるのがフォントの一括置換だ。

「`ActiveDocument.Range.Font.Name = “游明朝”`」

もし君がこの一行で済ませようとしているなら、今すぐその手を止めてほしい。Wordのフォント設定は、UI上ではシンプルに見えるが、内部オブジェクトモデルにおいては「日本語用」と「英数字用」という二つの異なるレイヤーが複雑に絡み合っているからだ。

今日は、実務レベルで「確実に」「爆速で」「保守可能に」ブランド規定を適用するための、プロフェッショナルな設計思想を伝授する。

1. なぜ「単純なループ」は地雷なのか

初心者が書くコードは、往々にして`Paragraphs`コレクションをループさせ、一つずつプロパティを書き換えるというものだ。これには二つの致命的な欠陥がある。

1. パフォーマンスの死: Wordのオブジェクトモデルは、プロパティへのアクセスが発生するたびにCOMのオーバーヘッドが生じる。文書が長大になればなるほど、このループは実行時間を指数関数的に増大させる。
2. 「日本語と英語の乖離」: Wordの`Font.Name`プロパティは、言語設定を無視して強引に上書きすることがある。結果、本来適用されるべき日本語フォントが英数字にも適用され、見た目が崩壊する。

我々が目指すべきは、`Find/Replace`オブジェクトを駆使した「一括置換」である。これはWordの検索・置換エンジンを直接叩くため、純粋なループよりも数桁高速に動作する。

2. 実装:プロフェッショナルなフォント一括置換コード

以下のコードは、日本語と英数字を分離して制御し、かつ「スタイル」による上書きを考慮した堅牢な設計だ。

Option Explicit

”’

”’ 文書全体のフォントをブランド規定に合わせて一括置換する
”’

Public Sub ApplyBrandFonts()
‘ 設定値:ここを環境に合わせて変更する
Const JP_FONT As String = “游明朝”
Const EN_FONT As String = “Times New Roman”

Dim doc As Document
Set doc = ActiveDocument

‘ 画面更新を停止(高速化の鉄則)
Application.ScreenUpdating = False

On Error GoTo Cleanup

‘ 1. 日本語フォントの設定(wdFontNameFarEast)
Call ReplaceFont(doc, wdFontNameFarEast, JP_FONT)

‘ 2. 英数字フォントの設定(wdFontNameAscii)
Call ReplaceFont(doc, wdFontNameAscii, EN_FONT)

Cleanup:
Application.ScreenUpdating = True
If Err.Number <> 0 Then
MsgBox “エラー発生: ” & Err.Description, vbCritical
End If
End Sub

Private Sub ReplaceFont(doc As Document, fontType As WdFontType, fontName As String)
With doc.Range.Find
.ClearFormatting
.Replacement.ClearFormatting

‘ 検索対象は「すべてのテキスト」
.Text = “”
.Replacement.Text = “”

‘ 置換後のフォントを指定
.Replacement.Font.Name = fontName

‘ 特定のフォントタイプ(日本語/英数字)に対して置換を実行
‘ ここが極限の効率化ポイント
.Replacement.Font.NameFarEast = IIf(fontType = wdFontNameFarEast, fontName, “”)
.Replacement.Font.NameAscii = IIf(fontType = wdFontNameAscii, fontName, “”)

.Forward = True
.Wrap = wdFindContinue
.Format = True

‘ 一括置換を実行
.Execute Replace:=wdReplaceAll
End With
End Sub

3. なぜこの設計が「最強」なのか

① `Find/Replace`エンジンの活用

`Paragraphs`をループさせるのではなく、Wordの検索置換エンジンを呼び出すことで、内部的な再描画回数を劇的に減らしている。数千ページの文書でも、この手法なら数秒で完了する。

② 言語設定の分離(`wdFontNameFarEast` vs `wdFontNameAscii`)

Wordには「日本語用フォント」と「英数字用フォント」の二重構造がある。多くのエンジニアがここで躓くが、このコードでは明示的にプロパティを分離して割り当てている。これにより、ブランド規定にある「日本語は游明朝、英数字はTimes New Roman」という要求を完璧に満たせる。

③ 保守性と安全性

  • `ScreenUpdating = False`: 実行中の画面のチラつきを防ぎ、かつ描画コストをカットする。これがないコードは、プロの現場では「未完成」とみなされる。
  • `On Error GoTo`: 万が一の実行時エラー時も、画面更新を再開する安全策を講じている。

4. 現場のアーキテクトからのアドバイス

実務において、このコードを運用する際は「スタイル」の存在に注意してほしい。
もし文書内に「見出し1」などのスタイルが定義されており、かつそのスタイルにフォントが固定されている場合、このコードによる直接置換よりも、`Style`オブジェクトの定義を書き換えるアプローチの方が適切だ。

  • 直書きフォントを修正したい場合: 上記コードで十分。
  • 文書全体の構造を管理したい場合: スタイル定義の`Style.Font`を修正する設計に切り替える。

「何を自動化するか」よりも「どのような構造を維持したいか」を優先すること。それが、君が作るツールを「使い捨てのスクリプト」から「組織の資産」へと昇華させるための鍵となる。

さあ、このコードを武器に、手作業という名の無駄を徹底的に排除してくれ。期待している。

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