こんにちは!Word VBAの世界へようこそ。
これまで「マクロの記録」ボタンを押して生成されたコードを眺めては、「なんだかよく分からないけれど動くからいいか…」と放置していませんでしたか?あるいは、人から引き継いだ膨大な仕様書を見るたびに、フォントのサイズや行間がバラバラで頭を抱えた経験はないでしょうか。
今回は、そんな地獄のような書式の揺れを完璧に検知し、一網打尽にする「段落プロパティ監査エンジン」の作り方を解説します。
ここをクリアすれば、単なるVBAの初学者から、Wordのオブジェクトモデルを自在に操る「真の自動化エンジニア」へとステップアップできます。優しく、そして本質的なところまでしっかりと紐解いていきますので、ついてきてくださいね!
—
1. なぜWordの「書式の揺れ」は厄介なのか?
Excelであれば、セルごとのフォントや背景色はグリッド(表形式)で管理されているため、比較や監査が比較的容易です。しかし、Wordの文書(Document)は「段落(Paragraph)」という流体的なブロックの連続であり、その内部には文字単位の装飾(Font)や、スタイル(Style)、さらには直接上書きされたローカル書式が複雑に絡み合っています。
「見た目は同じに見えるのに、なぜか箇条書きのインデントだけずれる」
「一部だけフォント名がMS明朝に混ざっている」
こうした現象は、人間が目視でチェックしようとすると発狂しかねない労力がかかります。だからこそ、VBAにルールを教え込み、機械に監査させることが唯一にして最強の解決策なのです。
—
2. 開発の全体像:監査エンジンはどう動くのか?
今回構築する監査エンジンは、以下のステップで動作します。
1. ターゲット文書の全段落をスキャン(`For Each` ループの極意)
2. 段落およびフォントのプロパティを細かくチェック(フォント名、サイズ、行間、インデントなど)
3. 「意図した基準値」と照らし合わせ、差異があればログに蓄積
4. 結果を新しいWord文書に「監査レポート」として出力
まずは、Word VBAの基本構造と、プロパティにアクセスするための作法を整理しましょう。
—
3. 実装コード:文書監査エンジンの全貌
以下のコードを、WordのVBAエディタ(Alt + F11)の標準モジュールに貼り付けてください。実務ですぐに使えるよう、実用的なコメントをみっちり書き込んでいます。
Option Explicit
‘ ==============================================================================
‘ 処理名: 総合段落監査エンジン (Paragraph Audit Engine)
‘ 概要 : 文書内の全段落を走査し、規定のフォント・段落設定からの乖離を検出する
‘ ==============================================================================
Sub RunParagraphAuditEngine()
Dim targetDoc As Document
Dim auditDoc As Document
Dim para As Paragraph
Dim reportText As String
Dim anomalyCount As Long
‘ 監査対象は現在アクティブな文書
Set targetDoc = ActiveDocument
anomalyCount = 0
‘ 監査結果を出力するための新規ドキュメントを作成
Set auditDoc = Documents.Add
reportText = “=== Word 文書 総合書式監査レポート ===” & vbCrLf & _
“監査日時: ” & Now & vbCrLf & _
“対象ファイル: ” & targetDoc.Name & vbCrLf & _
“————————————————–” & vbCrLf & vbCrLf
‘ 画面描画を停止してパフォーマンスを爆発的に向上させる(極意その1)
Application.ScreenUpdating = False
Application.Calculation = wdCalculationManual
Dim i As Long
i = 1
‘ 段落コレクションを上から順に舐め尽くす
For Each para In targetDoc.Paragraphs
‘ 【重要】空行(段落記号だけの行)はノイズになるため監査対象外とする
If Len(Trim(para.Range.Text)) > 1 Then
‘ 1. フォント名の監査(例: 「游明朝」以外が使われていたら警告)
If para.Range.Font.Name <> “游明朝” Then
reportText = reportText & “[警告] 段落 ” & i & ” : フォント名が不正です (” & para.Range.Font.Name & “)” & vbCrLf
anomalyCount = anomalyCount + 1
End If
IF para.Range.Font.Size <> 10.5 Then
‘ 2. フォントサイズの監査(例: 10.5pt以外を検知)
reportText = reportText & “[警告] 段落 ” & i & ” : フォントサイズが不正です (” & para.Range.Font.Size & “pt)” & vbCrLf
anomalyCount = anomalyCount + 1
End If
‘ 3. 行間の監査(例: 行間が「1行」以外に設定されている場合)
If para.LineSpacingRule <> wdLineSpaceSingle Then
reportText = reportText & “[警告] 段落 ” & i & ” : 行間設定が標準(1行)ではありません。” & vbCrLf
anomalyCount = anomalyCount + 1
End If
End If
i = i + 1
Next para
‘ レポートのまとめ
reportText = reportText & vbCrLf & “————————————————–” & vbCrLf
reportText = reportText & “監査完了。検出された異常値の総数: ” & anomalyCount & ” 件”
‘ 結果をレポート用ドキュメントに書き込む
auditDoc.Content.Text = reportText
‘ 画面描画の復元
Application.ScreenUpdating = True
Application.Calculation = wdCalculationAutomatic
‘ 完了通知
MsgBox “監査が完了しました!検出件数: ” & anomalyCount & “件”, vbInformation, “監査エンジン”
End Sub
—
4. コードの深掘り:プロフェッショナルが仕込んだ3つの技術的ポイント
ここからは、ただ動くだけのコードから脱却し、大規模文書でもフリーズしない「プロの技」を解説します。
① 画面描画の停止 (`ScreenUpdating = False`)
何百ページもあるWord文書に対して `For Each para In targetDoc.Paragraphs` を回すと、Wordは一文字一文字、段落が変わるたびに画面の表示を更新しようとします。これが処理を劇的に重くする原因です。
処理の最初に `ScreenUpdating = False` を宣言し、最後に `True` に戻す。これだけで実行速度が数十倍〜数百倍に跳ね上がります。これは業務自動化の鉄則です。
② 「空行」のスマートな除外 (`Len(Trim(…)) > 1`)
WordでEnterキーを連打して作られた空行には、実質的なテキストデータがありません。これらをすべて監査対象にしてしまうと、「フォント名が違います」という無意味なエラーがレポートを埋め尽くしてしまいます。
`Len(Trim(para.Range.Text)) > 1` という条件式で、文字が実質的に入力されている段落だけにフィルターをかけているのが、このコードのスマートなポイントです。
③ プロパティの定数活用 (`wdLineSpaceSingle`)
行間の判定に `wdLineSpaceSingle` という「定数」を使っています。マジックナンバー(意味不明な数字)をコードに直書きせず、Wordがあらかじめ用意してくれている組み込み定数を使うことで、コードの保守性と可読性が圧倒的に高まります。
—
5. 陥りやすいエラーと回避策
罠:`Error 424: オブジェクトが必要です` が出る
原因: `ActiveDocument` が開かれていない状態でマクロを実行したか、オブジェクト変数の `Set` を忘れてしまっている場合に発生します。
対策: 必ず何かしらのWord文書を開いた状態でマクロを走らせてください。また、オブジェクト型変数(`Document` や `Range` など)に代入する際は、必ず `Set` キーワードを使うことを忘れないようにしましょう。
罠:日本語フォントと英語フォントの罠
Wordのフォントプロパティには、日本語用の `Name`(または `NameFarEast`)と、英数字用の `NameAscii` が別々に存在する場合があります。「游明朝を指定したはずなのに、英数字の部分だけArialになっていて検知される」という現象にぶつかったときは、`para.Range.Font.NameFarEast` をターゲットにするなど、文書の作り込みに合わせて監査基準を調整してみてください。
—
6. おわりに:ここをクリアすれば、Word VBAは怖くない!
お疲れ様でした!今回は段落プロパティを総ざらいしてレポート化する「監査エンジン」の概念と実装に触れました。
一見難しそうに見えるWordのオブジェクトモデルも、「文書(Document)の中に段落(Paragraph)があり、その中にテキストとフォント(Font)がぶら下がっている」という階層構造(ツリー構造)さえ頭に入ってしまえば、もう恐れるものは何もありません。
このコードをベースに、「特定のキーワードが含まれる段落だけ色を変える」「見出しスタイルのインデントを自動修正する」など、ご自身の業務に合わせてカスタマイズしてみてください。
あなたのデスクワークが、少しでも優雅で快適なものになりますように。それでは、また次のエンジニアリングでお会いしましょう!
