こんにちは!Wordマクロ(VBA)の世界へようこそ。
マクロの記録ボタンを押して「自動でコードが書けた!」と喜んでいた時期を抜け出し、「自分の手で、実務で使える堅牢なツールを作りたい」と感じているあなたへ。
今回は、Word VBAの中級者へのステップアップとして避けて通れない「段落のフォントとドキュメントテーマの同期・監査」という、一歩進んだテーマを解説します。
「あちこちからコピペしたせいで、フォントサイズや種類がバラバラになった文書をキレイに整えたい」
「会社の規定フォントから外れている怪しい箇所を自動で炙り出したい」
そんな現場の絶望的な悩みを、美しいコードで鮮やかに解決する方法を一緒に見ていきましょう。ここをクリアすれば、あなたのWord VBAスキルは間違いなく本物のエンジニア領域に到達しますよ!
—
1. なぜ「テーマの乖離」が現場の地獄を生むのか?
Wordには「テーマ(Theme)」という素晴らしい仕組みがあります。文書全体の見出しや本文のフォント、配色を一括で管理するためのマスター設定です。
しかし、実務の現場ではこんなことが日常茶飯事に起きます。
- WebやPDFからテキストを「書式を保持したまま」貼り付けた
- 前任者が「ここだけ目立たせよう」と、個別にフォント名やサイズをベタ打ちした
結果どうなるか? 文書全体でテーマを変更しても、手動でフォントを設定した「頑固な段落」だけが取り残され、デザインが崩壊するのです。
これを人力でチェックするのは、数百ページの文書の前では発狂モノの作業。だからこそ、VBAに「テーマの基準から外れている反逆者」を見つけてもらい、正しい姿にリセットしてもらう自動化ツールが必要になります。
—
2. Word VBAの「フォント継承」という深い闇を知る
コードを書く前に、Wordのオブジェクトモデルにおける「最大の罠」をお伝えしておきます。ここを知らないと、永遠にバグと戦うことになります。
Wordでは、文字の書式は以下の3階層で決まります。
1. 文字(Range / Character)レベルの直接設定
2. 段落(Paragraph)レベルの設定
3. スタイル(Style) / テーマ(Theme)の規定値
厄介なことに、VBAで `Paragraph.Range.Font` を覗き見ると、ユーザーが特に何も指定していなくても、親スタイルから継承した値が「あたかも自分で設定された値」のように返ってくることがあります。
今回の監査ツールでは、「テーマ(または標準スタイル)が意図する規定値」と「段落が持っている実際の書式」を厳密に比較し、意図的なローカル上書きが行われている箇所を特定するというアプローチを取ります。
—
3. 実装コード:テーマ乖離の検出と同期ツール
お待たせしました。実務の現場でそのままコピー&ペーストして使える、プロ仕様の監査&修正マクロの全貌です。
このコードは、文書内のすべての段落を走査し、本文用テーマフォント(例: 游明朝 やメイリオなど、現在の標準スタイルに紐づくフォント)から外れている段落を検知して、標準スタイルに強制同期(リセット)させます。
Option Explicit
‘ =====================================================================
‘ 担当:シニア・オートメーション・エンジニア
‘ 概要:段落のフォントがテーマ(標準スタイル)から乖離しているかを監査し、
‘ 意図しないローカル上書きを検知・同期するプロフェッショナルマクロ
‘ =====================================================================
Sub AuditAndSyncParagraphFonts()
Dim targetDoc As Document
Set targetDoc = ActiveDocument
Dim p As Paragraph
Dim normalFontName As String
Dim normalFontSize As Single
Dim modifiedCount As Long
modifiedCount = 0
‘ 1. 基準となる「標準スタイル(Normal)」のフォント名とサイズを取得
‘ ※これが実質的な文書のベーステーマ基準となります
normalFontName = targetDoc.Styles(wdStyleNormal).Font.Name
normalFontSize = targetDoc.Styles(wdStyleNormal).Font.Size
‘ ユーザーへの事前確認
Dim msg As String
msg = “【文書テーマ監査ツール】” & vbCrLf & _
“基準フォント: ” & normalFontName & ” / ” & normalFontSize & “pt” & vbCrLf & _
“基準から外れた段落を検知し、標準スタイルに同期しますか?”
If MsgBox(msg, vbYesNo + vbQuestion, “実行確認”) = vbNo Then Exit Sub
‘ 2. 文書内の全段落をループ処理
‘ ※セクションや表の中も含めて安全に巡回します
For Each p in targetDoc.Paragraphs
‘ 空行(改行のみの段落)はノイズになるため監査対象外とする
If Len(Trim(p.Range.Text)) > 1 Then
‘ 段落全体のフォント情報をチェック
‘ ※今回は「フォント名」または「サイズ」が標準と異なるものを「乖離」と定義
With p.Range.Font
If .Name <> normalFontName Or .Size <> normalFontSize Then
‘ — デバッグ用イミディエイト出力 —
Debug.Print “乖離検知 -> 該当テキスト: ” & Left(p.Range.Text, 20) & “…”
Debug.Print ” 現状: ” & .Name & ” (” & .Size & “pt)”
‘ 3. 乖離箇所の修復(標準スタイルの書式にリセット)
‘ ※直接代入するのではなく、スタイルを再適用するのが最も安全でモダンな手法
p.Style = wdStyleNormal
‘ カウントアップ
modifiedCount = modifiedCount + 1
End If
End With
End If
Next p
‘ 4. 実行結果のレポート
MsgBox “監査と同期が完了しました。” & vbCrLf & _
“修正した段落数: ” & modifiedCount & ” 箇所”, _
vbInformation, “処理完了”
End Sub
—
4. コードの深掘り解説:ここがエンジニアのこだわりポイント!
初心者から一歩抜け出すために、このコードに込めた「プロの技」をいくつか解説させてください。
① `Option Explicit` の常時使用
コードの最上部に書いたこの宣言。変数の宣言漏れを強制的にエラーにしてくれるため、タイプミスによる「動かない…なぜ!?」という泥沼を防ぐ必須の作法です。プロは例外なくこれを入れています。
② 空行(ノイズ)の華麗なスルー
文書のレイアウト調整のために `Enter` だけが押された空行(`Len(Trim(p.Range.Text)) > 1` で判定)を監査対象から外しています。これがないと、意図しない改行スペースまでフォント変更の判定に巻き込まれてしまい、予期せぬレイアウト崩壊を起こします。細部への配慮が実用ツールの命です。
③ 直接プロパティをイジらず、スタイルを再適用する
`p.Range.Font.Name = …` と直接書き換えることもできますが、Wordの構造上、文字単位の装飾(太字や色など)まで消えてしまう副作用があります。
今回は「テーマへの同期(リセット)」が目的なので、`p.Style = wdStyleNormal` と思い切って段落スタイル自体を標準に戻すことで、文書全体の整合性を美しく保っています。
—
5. 陥りやすいエラーと対策
- エラー:「インデックスが有効ではありません」
- 原因: 保护された文書(フォーム保護など)や、特殊なテンプレート構造を持つWordファイルで実行すると、標準スタイルの取得に失敗することがあります。
- 対策: 実行前に「校閲」タブから「編集の制限」が有効になっていないか確認してください。
- 「動いているけど、何も修正されない…」
- 原因: すでに文書の全段落が「標準スタイル」の規定値通りに書かれている場合、乖離はゼロになります。VBEの「イミディエイトウィンドウ(Ctrl + G)」を開いて、`Debug.Print` の出力がないか確認してみましょう。
—
まとめ:あなたの手でWord VBAを飼いならそう
今回は、段落のフォント設定とテーマの乖離を監査し、同期させる中級者向けのVBAテクニックを解説しました。
「マクロに仕事をさせる」のではなく、「Wordのオブジェクトの挙動を理解し、VBAを意図通りにコントロールする」という感覚が掴めましたか?
このレベルのコードが書けるようになれば、どんなに絶望的なボリュームの文書整形依頼が来ても、コーヒーを一杯飲んでいる間に終わらせることができます。
ここをクリアしたあなたなら、もうWord VBAの基礎はバッチリです!ぜひ明日の実務でこのコードを試して、周りの同僚をアッと言わせてくださいね。それでは、また次の極限の知見でお会いしましょう!
