現場の「見えない爆弾」を検知せよ:Word VBAによるフォントサイズ異常検知のアーキテクチャ
現場でWordファイルを扱っていると、必ず遭遇する「フォントサイズが極端に小さい箇所」。コピペを繰り返した結果、意図せず「0.5pt」や「1pt」といった読めない文字が紛れ込み、校閲や印刷で致命的な不備を招く。これらは肉眼での発見が極めて困難な「見えない爆弾」だ。
今日は、これをVBAで一掃する。ただ動くコードを書くのではない。大規模文書でもフリーズせず、かつ保守性が高い、プロダクション品質の設計思想を伝授する。
—
なぜ「安易なループ」は危険なのか
初心者が書くコードの典型例は、`ActiveDocument.Paragraphs`を単純にループし、全文字を一文字ずつ`Characters`オブジェクトで走査する手法だ。
断言する。これは大規模文書では「死」を意味する。
Wordの`Characters`オブジェクトへのアクセスは非常に低速だ。数千ページの文書でこれを行うと、VBAの実行スレッドは数分間固まり、OSからは「応答なし」と判定される。我々エンジニアが目指すべきは、「Rangeオブジェクトの最適化」と「検索エンジンの利用」である。
—
プロダクションコード:異常サイズ検知エンジン
このコードは、全範囲を走査するのではなく、Wordの「検索機能(Find)」を擬似的に利用して高速化を図る設計としている。
Option Explicit
‘ ———————————————————
‘ 機能:指定サイズ以下のフォントをハイライトする
‘ 設計方針:パフォーマンスを考慮し、Charactersループを回避する
‘ ———————————————————
Public Sub HighlightTinyFonts()
Dim targetRange As Range
Dim thresholdSize As Single
‘ 閾値を設定(例:8pt未満を異常とする)
thresholdSize = 8.0
‘ スクリーン更新を停止し、処理速度を劇的に向上させる
Application.ScreenUpdating = False
Set targetRange = ActiveDocument.Content
With targetRange.Find
.ClearFormatting
.Replacement.ClearFormatting
‘ 検索対象の範囲を初期化
.Text = “”
.Forward = True
.Wrap = wdFindContinue
.Format = True
‘ 検索ループの実行
Do While .Execute
‘ 取得した範囲のフォントサイズを判定
‘ Note: undefined(wdUndefined)の場合は複数のサイズが混在しているため除外
If Not IsNull(targetRange.Font.Size) Then
If targetRange.Font.Size < thresholdSize Then
' 異常箇所を蛍光色(黄色)でマーク
targetRange.HighlightColorIndex = wdYellow
End If
End If
' 検索位置を次の文字へ進める
targetRange.Collapse wdCollapseEnd
Loop
End With
Application.ScreenUpdating = True
MsgBox "検査が完了しました。", vbInformation
End Sub
---
コードの心臓部を読み解く:エンジニアの視点
1. `Application.ScreenUpdating = False`
- これを忘れるエンジニアは二流だ。Wordの描画エンジンは、処理ごとに画面を書き換えようとする。大規模文書において、これを無効化するだけで実行速度は10倍変わる。
2. `targetRange.Collapse wdCollapseEnd`
- Findメソッド実行後、検索結果がRangeとして残る。そのまま次の検索に進むと、同じ箇所で無限ループする可能性がある。必ず`Collapse`で終了点へカーソルを移動させよ。
3. `IsNull(targetRange.Font.Size)`の罠
- Wordの`Font.Size`プロパティは、範囲内に異なるサイズが混在している場合、`Null`を返す。これをチェックせずに比較演算を行うと、実行時エラーが発生する。このガード句こそが、堅牢なシステムの証だ。
—
運用上の注意点とデータベース連携への展望
このツールを個人のPCで動かすならこれで十分だ。しかし、組織の標準ツールにするなら以下の「先」を考える必要がある。
- スタイル依存の考慮:
もし組織内で「スタイル」が厳格に運用されているなら、`Font.Size`で見るのではなく、`Paragraph.Style`の属性をチェックすべきだ。直接書式(Direct Formatting)の汚染を検出する方が、本質的な校閲になる。
- ログの出力:
ハイライトするだけでなく、どのページに何件異常があったかをCSVやExcelに書き出すロジックを追加せよ。それが「自動化」から「管理」へのステップアップだ。
最後に:自動化は「設計」で決まる
VBAは古臭い言語だと言われる。だが、Wordの内部オブジェクトモデルを深く理解し、メモリ効率と実行速度を計算しながら設計されたVBAコードは、現代のどのスクリプト言語よりも強力な武器になる。
まずはこのコードをコピーし、自分の環境で走らせてみてほしい。そして、動いたことに満足せず、「なぜこのコードが速いのか」を咀嚼してほしい。それが、君を「コードを書く人」から「エンジニア」へと変える第一歩だ。
