【入門編】【中級者向け】段落の「フォント」設定がWordの「テーマ」と乖離している箇所を特定し、テーマに同期させる監査マクロ – Word VBA解析バイブル

スポンサーリンク

Wordの「書式地獄」を終わらせる。テーマ同期監査マクロでドキュメント品質を極める

こんにちは。日々のドキュメント作成、お疲れ様です。
「マクロの記録」で生成されたコードを眺めて、「なぜか思い通りに動かない」「設定したはずのフォントが反映されない」といった壁にぶつかっていませんか?

Wordの書式設定は、実は非常に複雑なレイヤー構造をしています。今回扱う「テーマの乖離」は、多くの現場でドキュメントの統一感を破壊する最大の要因です。

今回は、手作業による地獄のような修正作業から解放される、「テーマ同期監査マクロ」の設計思想と実装を伝授します。ここを理解すれば、Word VBAの「オブジェクト構造」の本質が見えてきます。

なぜ「テーマ」との乖離が起きるのか?

Wordには「テーマ」という概念があります。本来、フォントや配色はテーマに依存しているべきなのですが、ユーザーが「直接フォント設定」を上書きすると、Wordはその部分を「テーマの管理外」として扱います。

これを放置すると、後からテーマを切り替えても、そこだけ色が残ったり、フォントが意図せず変わったりします。これを「直接書式の汚染」と呼びます。

本日のミッション:乖離の特定と自動同期

今回は、以下のステップでマクロを構築します。

1. 全段落を走査する: `Paragraphs` オブジェクトをループする。
2. 監査する: その段落のフォントが「テーマ」の設定と一致しているか確認する。
3. 同期する: 乖離があれば、`ClearFormatting` メソッド(または明示的な再適用)でテーマの標準設定に戻す。

【実装コード】テーマ同期監査マクロ

以下のコードをVBAエディタ(Alt + F11)に貼り付けてください。

Option Explicit

‘ ==========================================================
‘ 機能:ドキュメント内の段落フォントをテーマ設定に同期させる
‘ ==========================================================
Sub AuditAndSyncFontToTheme()
Dim para As Paragraph
Dim count As Long
count = 0

‘ 画面更新を停止して高速化(地味ですが重要なエンジニアの作法です)
Application.ScreenUpdating = False

‘ ドキュメント内の全段落をループ
For Each para In ActiveDocument.Paragraphs
‘ 【重要】ここがポイント
‘ .Font.Name が空の場合、それはテーマの既定値に従っている証拠です。
‘ 何らかの値が入っている場合、それは「直接書式」で固定されています。
If para.Range.Font.Name <> “” Then
‘ 今回は「テーマフォントに戻す」処理として書式をクリアします
‘ これにより、スタイルやテーマの定義が自動的に適用されます
para.Range.Font.Reset
count = count + 1
End If
Next para

Application.ScreenUpdating = True

MsgBox count & ” 箇所の直接書式を解除し、テーマに同期しました。”, vbInformation
End Sub

コードの解説:ここが「プロ」への入り口

1. `.Font.Name` の判定ロジック

多くの初心者が陥る罠は、「現在のフォント名を取得して比較しようとする」ことです。しかし、Wordのオブジェクトにおいて、「テーマに従っている」状態のプロパティは `Empty`(空)を返します。
「何もしない」という状態が、実は「テーマに委ねる」という強力な設定値であることを知っておいてください。

2. `Range.Font.Reset` の威力

`Reset` メソッドは、その名の通り「直接適用された書式を削除し、親のスタイルやテーマの定義に戻す」魔法のコマンドです。これを使うことで、マクロでいちいち色やサイズを指定し直す必要がなくなります。

3. `Application.ScreenUpdating`

何万文字もあるドキュメントでループを回す際、画面の更新を止めないとPCがフリーズしたように重くなります。業務自動化では、こうした「リソースへの配慮」が信頼性に直結します。

陥りやすいエラーと対策

  • 「実行時エラー5941」が出る場合

テーブル(表)の中に段落がある場合、構造が複雑で正しく参照できないことがあります。その場合は、`For Each para In ActiveDocument.Paragraphs` を `ActiveDocument.Range.Paragraphs` とすることで、文書の全範囲をフラットに走査できます。

  • スタイルが意図せず変わってしまう場合

`Font.Reset` は文字単位の書式をクリアします。段落全体にスタイルを適用している場合は、`para.Style = wdStyleNormal` のように明示的にスタイルを再適用する処理を組み合わせるのが、より堅牢なエンジニアリングです。

まとめ:自動化の先にあるもの

今回紹介したマクロは、単なる「書式直し」ではありません。「ドキュメントの構造を正しく管理する」という品質管理のプロセスそのものです。

マクロが書けるようになると、Wordは「文字を入力する場所」から「データが正しく構造化されたデータベース」に見えてくるはずです。

「ここをクリアすれば、Word VBAの基本はバッチリですよ」。
まずはこのマクロで、手元の文書の「隠れた直接書式」をクリーンアップしてみてください。そのスッキリとした感覚こそが、自動化の醍醐味です。

質問があれば、いつでも聞いてくださいね。一緒に最高峰の自動化ライフを楽しみましょう!

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