Word VBAの真髄:スタイルを汚染する「直接書式」を狩り出す監査ツール
こんにちは。Wordの自動化という荒野を旅する皆さん。
「マクロの記録」ボタンを押すだけの時間は、もう終わりにしましょう。今日は、Wordという巨大で複雑な文書管理システムの「品質」を担保するための、一歩踏み込んだテクニックを伝授します。
Wordのドキュメントが崩れる最大の要因、それは「直接書式(Direct Formatting)」の氾濫です。
スタイルで定義された秩序を無視し、ユーザーが気まぐれにフォントサイズや色を変える。この「場当たり的な装飾」を放置すると、大規模なドキュメントは数ヶ月後にメンテナンス不能な怪物へと変貌します。
今日は、そんな怪物たちをあぶり出す「監査ツール」を一緒に作っていきましょう。
—
1. なぜ「直接書式」が諸悪の根源なのか
Wordには「スタイル(Style)」という強力な設計図があります。しかし、ユーザーは往々にして、その上に「直接書式」というペンキを塗りたくります。
- スタイル: 見出し1(フォント:Meiryo, 16pt, 太字)
- 直接書式: その見出しの一部だけを「赤文字」にする
この「赤文字」という直接書式は、スタイルの定義を上書きしてしまいます。これを見つけるには、VBAで「スタイルが本来持っているはずの属性」と「現在の段落の属性」を、冷徹に突き合わせる必要があるのです。
—
2. 監査ツールのコード
以下のコードは、文書内の全段落を走査し、スタイル定義と一致しない「直接書式」が適用されている段落をイミディエイトウィンドウにリストアップするツールです。
Option Explicit
‘ ========================================================
‘ 文書内の直接書式(Direct Formatting)を監査するツール
‘ ========================================================
Public Sub AuditDirectFormatting()
Dim para As Paragraph
Dim isModified As Boolean
Debug.Print “— 監査開始: ” & Now & ” —”
‘ 文書内の全段落をループ
For Each para In ActiveDocument.Paragraphs
isModified = False
‘ 段落のフォントプロパティがスタイルと一致するか確認
‘ HasParagraphStyleOrFormatting は直接書式の有無を判定する強力なフラグです
With para.Range.Font
‘ ここでは例として「色」が自動(黒)以外、または「太字」がスタイルと違う場合を検知
‘ ※実際にはもっと細かく比較条件を追加します
If .Color <> wdColorAutomatic Or .Bold = wdToggle Then
isModified = True
End If
End With
‘ 直接書式が検知されたらイミディエイトウィンドウに報告
If isModified Then
Debug.Print “【警告】段落 ” & para.Range.Information(wdActiveEndAdjustedPageNumber) & ” ページ目”
Debug.Print “内容: ” & Left(para.Range.Text, 30) & “…”
End If
Next para
Debug.Print “— 監査終了 —”
End Sub
—
3. コードの解説:ここが「プロ」の視点
このコードのポイントは、`para.Range.Font` オブジェクトへのアクセスです。
1. ループの制御: `For Each` はWord VBAにおいて最も安全かつ高速なイテレーターです。
2. `wdColorAutomatic` とは何か: 直接書式を特定する際、最も厄介なのが「デフォルト値」です。自動設定なのか、意図的に黒にしているのか。`wdColorAutomatic` を使うことで、システムデフォルトの状態を正しく判定できます。
3. `Information` プロパティ: `para.Range.Information(wdActiveEndAdjustedPageNumber)` は、その段落が何ページ目にあるかを返す非常に便利なメソッドです。これを使えば、修正すべき箇所を即座に特定できます。
陥りやすいエラー:オブジェクトのスコープ
初心者がやりがちなのは、`Selection` オブジェクトを多用することです。
`Selection.Paragraphs` を使うと、マクロが動くたびに画面が激しくチラつき、処理速度も著しく低下します。常に `Document` や `Paragraph` オブジェクトを直接操作するように心がけてください。
—
4. 次のステップ:自動修復への道
このツールは、あくまで「監査」に特化しています。もし検知した直接書式を一括で削除したい場合は、以下の1行をループ内に追加します。
‘ 警告した段落の直接書式を強制解除する
para.Range.Font.Reset
ただし、「Reset」は諸刃の剣です。すべてをスタイル通りに戻してしまうため、意図的な強調まで消える可能性があります。まずは監査ツールとして運用し、人間がチェックするフローを挟むことを強く推奨します。
—
最後に:自動化は「設計」である
Word VBAをマスターするコツは、「Wordを人間と同じように操作させようとしないこと」です。人間は目で見て判断しますが、エンジニアは「データ構造」としてWordを捉えます。
「段落の中にどんなスタイルが潜んでいるか?」
「その書式は論理的に正しいか?」
この視点を持った瞬間から、あなたのVBAスキルは「作業の自動化」というレベルを超え、「文書品質のエンジニアリング」へと進化します。
ここをクリアしたあなたは、もう初心者ではありません。さあ、次はどんなドキュメントを「正しく」制御しましょうか?
