【Word VBA】フォントサイズの乱れを許さない。規定外を自動検知して黄色ハイライトする「校閲補助ツール」の設計と実装
開発現場で仕様書や契約書を取り扱っていて、最もフラストレーションが溜まる瞬間の一つが「フォントサイズの混在」だ。
コピペを繰り返すうちに、本来10.5ptであるべき本文の中に、なぜか9ptや11ptが混ざり込む。人間が目視でこれをすべて発見するのは、苦行であり、完全なリソースの無駄遣いである。
今回は、Word VBAを駆使して「指定された規定値以外のフォントサイズを持つ段落を自動検知し、黄色でハイライトする実用的な校閲補助ツール」の全貌を解説する。
単に動くだけのコードではない。Wordのオブジェクトモデルの重みを知り尽くしたエンジニアが構築する、「バグを踏まない堅牢な設計」と「実務で即座に使えるプロダクションコード」を伝授しよう。
—
1. なぜ初心者はWord VBAで躓くのか?(非効率な設計の排除)
初心者が書くWordマクロの多くは、次のようなアンチパターンに陥っている。
- `Selection`オブジェクトを乱用し、画面のチラつき(スクロール)と劇的なパフォーマンス低下を招く。
- 「文字(Character)」単位でループを回し、数万字のドキュメントでフリーズを引き起こす。
- フォントサイズが混在している段落(1つの段落内に複数のサイズがあるケース)の判定を無視してエラーになる。
プロが実践する3つの鉄則
1. `Selection`を使わず、`Range`または直接オブジェクトを操作する(描画更新を抑制し、処理速度を数十倍にする)。
2. 「文字」ではなく「段落(Paragraph)」単位で走査し、必要に応じてフォントを検査する。
3. ハイライト(蛍光ペン)のクリア処理を最初に必ず実行し、二重ハイライトを防ぐ。
—
2. 堅牢な設計とアルゴリズムの解説
今回作成するツールは、以下のロジックで動作する。
1. 前処理: 文書全体の既存の蛍光ペン(黄色)を一度リセットする(前回の校閲跡を残さないため)。
2. 走査: 文書内の全段落をループ処理する。
3. 判定: 段落内の先頭文字のフォントサイズ(または指定サイズ)をチェックし、許容値(例: 10.5pt)から外れているかを判定する。
4. アクション: 規定外であれば、その段落の範囲(`Paragraph.Range`)の蛍光ペンを黄色(`wdYellow`)に設定する。
> 実務上の注意点:
> Wordのフォントサイズは「ポイント(pt)」で保持されるが、VBA内部では `10.5` のような浮動小数点数として扱われる。また、1つの段落に複数のフォントサイズが混在している場合、`Paragraph.Range.Font.Size` は `9999999`(wdUndefined)を返す特性がある。
> この仕様を逆手に取り、「規定値と一致しない、または混在している段落」を一網打尽に検知するのが、最も堅牢なアプローチとなる。
—
3. コピペで使えるプロダクションコード
以下のコードをWordのVBAエディタ(`Alt + F11` → `挿入` → `標準モジュール`)に貼り付けて実行してほしい。
Option Explicit
‘ ==============================================================================
‘ 処理名: 規定外フォントサイズ検知・ハイライトツール
‘ 概要 : アクティブ文書内の段落をスキャンし、指定サイズ以外の箇所を黄色ハイライトする
‘ ==============================================================================
Public Sub HighlightInvalidFontSize()
‘ 1. 定数の定義(プロジェクトの要件に合わせて変更してください)
Const TARGET_FONT_SIZE As Single = 10.5 ‘ 許可する基準フォントサイズ(pt)
Dim targetDoc As Document
Set targetDoc = ActiveDocument
‘ 2. 予期せぬ画面描画やイベントを抑制し、圧倒的なパフォーマンス向上を図る
With Application
.ScreenUpdating = False
.EnableEvents = False
End With
On Error GoTo ErrorHandler
‘ 3. 実行前のクレンジング:前回処理の黄色ハイライトを全クリア
‘ ※文書内の他の黄色ハイライトも消えるため、必要に応じてRangeを限定してください
targetDoc.Range.HighlightColorIndex = wdNoHighlight
Dim para As Paragraph
Dim targetRange As Range
Dim detectedCount As Long
detectedCount = 0
‘ 4. 段落単位での高速ループ走査
For Each para in targetDoc.Paragraphs
‘ 空行(段落マークのみ)は判定対象外とする
If Len(para.Range.Text) > 1 Then
Set targetRange = para.Range
‘ 【重要】
‘ Font.Size が wdUndefined(9999999)の場合、同一段落内に複数のサイズが混在している。
‘ また、指定サイズと異なる場合も検知対象とする。
If targetRange.Font.Size <> TARGET_FONT_SIZE Then
targetRange.HighlightColorIndex = wdYellow
detectedCount = detectedCount + 1
End If
End If
Next para
‘ 5. 完了メッセージ
Application.ScreenUpdating = True
Application.EnableEvents = True
MsgBox “校閲スキャンが完了しました。” & vbCrLf & _
“規定外(またはサイズ混在)の段落を ” & detectedCount & ” 箇所検出し、ハイライトしました。”, _
vbInformation, “校閲補助ツール”
Exit Sub
ErrorHandler:
‘ 異常終了時の安全装置(画面描画の復元を確実に行う)
Application.ScreenUpdating = True
Application.EnableEvents = True
MsgBox “予期せぬエラーが発生しました: ” & Err.Description, vbCritical, “エラー”
End Sub
—
4. コードのキーストーン(エンジニアのこだわり)
- `ScreenUpdating = False` の徹底:
Word VBAで最も重い処理は「GUIの再描画」だ。これを切ることで、数百ページのドキュメントであっても一瞬で処理が完了する。
- エラーハンドリングと状態の復元:
万が一マクロ実行中にエラーが発生しても、`ErrorHandler`を通ることで画面が固まったままになる事故を防ぐ。プロダクションコードにおいて、クリーンアップ処理の保証は絶対条件だ。
- 空行の除外:
`Len(para.Range.Text) > 1` により、単なる改行のみの段落をスキャン対象外にしている。これにより、無駄なハイライトや誤検知を防ぐ実用的なチューニングを施している。
—
5. 発展:データベースや外部ファイル連携への布石
今回はアクティブ文書を直接処理する完結型のスクリプトだが、実務の現場ではこれを拡張し、「どのファイルに、何箇所の規定外フォントがあったか」をExcelやCSV、あるいはデータベース(SQL Server等)にログとして出力するトランスフォームが求められる。
その場合、`ActiveDocument` を開く処理を `Documents.Open` に置き換え、FileSystemObject (FSO) を組み合わせてフォルダ内の全Wordファイルをバッチ処理するアーキテクチャに拡張すればよい。
仕様の揺らぎを許さない厳格なドキュメント管理が求められるプロジェクトにおいて、このツールは確実にあなたの右腕となるはずだ。
今すぐ自社のテンプレートに組み込み、無駄な目視確認からエンジニアを解放してほしい。
