【Word VBA】「書式の砂嵐」を鎮圧せよ:テーマ乖離を自動検知・同期する品質管理アーキテクチャ
Wordファイルを数人で回していると、必ず発生するのが「書式の崩壊」だ。誰かがコピペしたテキストのフォント情報が、本来定義されている「テーマ」のフォント設定を上書きし、レイアウトが静かに蝕まれていく。
これを放置すれば、文書の信頼性は地に落ちる。今回は、Wordの「テーマ(Theme)」と「直接適用されたフォント(Local Formatting)」の乖離を暴き、強制的に同期させるプロフェッショナル向け監査マクロを伝授する。
—
なぜ「手作業」や「全選択→書式クリア」ではダメなのか?
現場のエンジニアが陥りがちな罠が、「全選択してクリア」という乱暴な解決策だ。これでは、強調のために意図的に設定したボールドやイタリックまで全て吹き飛ぶ。
我々が求めるのは、「テーマで定義されたフォント設定と一致していない箇所だけをピンポイントで特定し、テーマの基準値に引き戻す」という外科手術のようなアプローチだ。
堅牢な設計のための3つの鉄則
1. Rangeオブジェクトの再利用を避ける:
Wordのオブジェクトモデルは「Range」が動的に変化するため、ループ処理中の`Collapse`や`Move`には細心の注意が必要だ。今回は`Paragraph`単位でイテレーションを行い、`Font.Name`がテーマのフォントと一致するかを比較する。
2. プロパティの「初期値」を疑う:
VBAにおいて「未設定(Default)」は`wdUndefined`を返す。この判定を怠ると、予期せぬ挙動で文書全体が崩壊する。
3. Undo(元に戻す)のコストを計算に入れる:
大量の置換処理はUndoスタックを圧迫する。大規模文書では、処理前に必ず`Application.ScreenUpdating = False`を忘れずに行うこと。
—
実装コード:Theme Synchronizer Pro
以下のコードは、文書内の全段落をスキャンし、テーマ設定(本文フォント)から逸脱している箇所をログ出力しつつ、必要に応じて同期を行うための雛形だ。
Option Explicit
‘ ———————————————————
‘ Wordテーマ同期監査マクロ
‘ 目的:現在のテーマフォントと一致しない段落を特定・修正する
‘ ———————————————————
Public Sub AuditAndSyncThemeFonts()
Dim para As Paragraph
Dim targetFontName As String
Dim count As Long
‘ 文書のテーマフォント(本文用)を取得
‘ ※環境依存を避けるため、ActiveDocumentのプロパティから直接参照
targetFontName = ActiveDocument.Styles(wdStyleNormal).Font.Name
Application.ScreenUpdating = False
For Each para In ActiveDocument.Paragraphs
‘ 直接適用されたフォントがテーマと異なるかチェック
‘ wdUndefinedの場合はテーマに従っているとみなす
If para.Range.Font.Name <> wdUndefined Then
If para.Range.Font.Name <> targetFontName Then
‘ ここで監査ログを出すか、自動修復を行う
Debug.Print “乖離検知: ” & Left(para.Range.Text, 20) & “…”
‘ 【自動修復を実行する場合】
‘ para.Range.Font.Name = targetFontName
count = count + 1
End If
End If
Next para
Application.ScreenUpdating = True
MsgBox “監査完了: ” & count & ” 箇所の乖離を検出しました。”, vbInformation
End Sub
—
運用上の注意点とさらなる最適化
1. スタイルとの階層構造を理解する
Wordには「スタイル」と「直接書式」の二重構造がある。上記コードは`Range.Font`を見ているため、スタイルが適用されているか、直接書式が適用されているかを問わず、「結果的に表示されているフォント」を強制的に同期させる。
もし「スタイルは無視して直接書式だけを消したい」という要件であれば、`para.Range.Font.Reset`を検討すべきだが、これは全書式をクリアするため慎重に行うこと。
2. DBや外部ファイルとの連携
もし、この監査結果をExcel等の管理表に出力したい場合は、`FileSystemObject`を利用してログファイルを生成するか、`Late Binding`でExcelインスタンスを生成して転記することをお勧めする。
- 注意: ネットワークドライブ上のファイルを直接処理する場合、I/Oのボトルネックでフリーズすることがある。必ず一度ローカルにコピーしてから処理するアーキテクチャにすること。
3. 保守性を高めるために
このコードをそのまま配布せず、`Configuration`モジュールを別途作成し、`TargetFont`を定数ではなくJSONや設定ファイルから読み込む構造にリファクタリングせよ。そうすることで、企業のブランドガイドラインが変更された際も、コードを一行も修正せずに対応可能になる。
—
エンジニア諸君へ
「自動化」とは、単に手作業をコードに置き換えることではない。「文書の品質をシステム的に担保する仕組みを構築すること」である。
このマクロを使って、あなたのチームから「手作業のフォント修正」という非生産的な時間を撲滅してほしい。それができるのは、ツールを使いこなす我々エンジニアだけなのだから。
