文書の「闇」を可視化せよ:Word VBAで段落の書式逸脱をExcelへ叩き出す「監査エンジン」の構築
こんにちは。自動化の深淵へようこそ。
Wordで文書を作成していると、なぜか「特定の場所だけフォントサイズが微妙に違う」「行間が勝手にズレる」といった現象に悩まされたことはありませんか? 手作業で一つずつ確認するのは、まさに地獄の苦しみです。
今日は、Wordの段落プロパティを再帰的に分解し、標準スタイルから逸脱した箇所をExcelのレポートとして出力する「書式監査エンジン」を構築します。マクロの記録から卒業し、Wordのオブジェクトモデルを支配するエンジニアへの第一歩を踏み出しましょう。
—
1. なぜ「書式監査」が必要なのか?
Wordの文書は、目に見える姿の下に「プロパティの層」が重なっています。
- スタイル定義(文書の設計図)
- 直接書式(ユーザーが後から上書きした「闇」の痕跡)
この「直接書式」が蓄積されると、文書はメンテナンス不能な状態に陥ります。我々エンジニアの仕事は、その「崩壊の予兆」をコードで検知することです。
—
2. 実装の設計図
今回は以下のステップで進めます。
1. Wordの段落を走査する: 全ての `Paragraph` オブジェクトをループします。
2. プロパティの比較: `Paragraph.Format` プロパティと `Paragraph.Style` の定義値を比較します。
3. Excelへの書き出し: `CreateObject` でExcelを呼び出し、レポートを生成します。
—
3. 実践コード:書式監査エンジン
このコードは、標準スタイルと現在の段落の「フォントサイズ」や「行間」が異なれば、Excelに書き出す仕組みです。
Sub AuditParagraphStyles()
Dim wdApp As Object, xlApp As Object, xlWB As Object
Dim para As Paragraph
Dim rowIdx As Long
‘ Excelを裏側で起動
Set xlApp = CreateObject(“Excel.Application”)
Set xlWB = xlApp.Workbooks.Add
xlApp.Visible = True
‘ ヘッダーの作成
xlWB.Sheets(1).Range(“A1:C1”).Value = Array(“段落番号”, “差異箇所”, “詳細内容”)
rowIdx = 2
‘ 段落を巡回
For Each para In ActiveDocument.Paragraphs
‘ 「標準スタイル」との乖離をチェック(例:フォントサイズ)
If para.Range.Font.Size <> para.Style.Font.Size Then
xlWB.Sheets(1).Cells(rowIdx, 1).Value = para.Range.Information(wdActiveEndAdjustedPageNumber)
xlWB.Sheets(1).Cells(rowIdx, 2).Value = “フォントサイズ”
xlWB.Sheets(1).Cells(rowIdx, 3).Value = “規定:” & para.Style.Font.Size & ” -> 実測:” & para.Range.Font.Size
rowIdx = rowIdx + 1
End If
‘ ここにさらに「行間」などの条件を追加可能です
Next para
MsgBox “監査完了!Excelを確認してください。”, vbInformation
End Sub
—
4. プロの視点:陥りやすい罠と対策
① 「直接書式」という名の迷宮
`para.Range.Font` には、スタイル設定だけでなく、ユーザーが個別に設定したフォント情報が含まれます。もし `wdUndefined` という値が返ってきたら、それは「段落内でフォント設定が混在している」サインです。ここを検知できるようになると、一気に視界が開けます。
② パフォーマンスの重み
`For Each` ループは便利ですが、文書が数千ページある場合、画面描画(`ScreenUpdating`)を止めないとPCがフリーズします。実務では必ず以下の制御を加えてください。
Application.ScreenUpdating = False
‘ … 処理 …
Application.ScreenUpdating = True
③ オブジェクトの解放
Excelを呼び出した際、`Set xlApp = Nothing` を忘れるとメモリリークの原因となります。伝説のエンジニアは、たとえエラーで落ちても確実にメモリを解放する「エラーハンドリング」を必ず組み込みます。
—
5. 次のステップへ
今回のコードは「入り口」です。ここから先は、以下のような高度な実装が可能です。
- 自動修正機能: 差異が見つかったら `para.Range.Style = para.Style` で強制的にスタイルを適用し直す。
- JSON出力: レポートをJSON化して、CI/CDパイプラインに組み込む。
Word VBAは「古い」と思われがちですが、文書の構造をここまで詳細に操作できる言語は他にありません。まずはこのコードを動かし、自分の書いた文書がどれほど「散らかっているか」を確認することから始めてみてください。
「綺麗に整った文書」は、コードが書くものです。応援していますよ。
