【Word VBA極限講座】長すぎる段落を自動検知せよ!文字数カウント&赤字警告システムの設計思想
こんにちは。開発プロジェクトの現場において、ドキュメントの品質管理と自動化を統括しているチーフアーキテクトだ。
Wordでのマニュアル作成、仕様書、あるいは契約書のレビュー業務において、「1つの段落が長すぎて可読性が著しく低い」という問題に直面したことはないだろうか。箇条書きにすべき長文が延々と続き、読者の理解を妨げているケースだ。
これを人間の目だけでチェックするのは、非生産的でありヒューマンエラーの温床となる。
今回は、「指定した文字数を超過した段落を瞬時に検出・赤字化し、視覚的に警告するプロダクション品質のVBAツール」の設計と実装を伝授する。
単に動くだけのコードではない。Wordのオブジェクトモデルの裏側にある「重み」を理解し、実務で絶対に破綻しない堅牢なコードの書き方をマスターしよう。
—
1. なぜ「素朴なVBAコード」は実務で破綻するのか?
多くの初学者は、Word VBAを書く際に以下のようなコードを書きがちだ。
‘ 【非効率なアンチパターン例】絶対に真似してはならない
Sub BadExample()
Dim p As Paragraph
For Each p In ActiveDocument.Paragraphs
‘ 毎回Rangeオブジェクトを叩き、さらに文字数を数えて色を変える
If Len(p.Range.Text) > 50 then
p.Range.Font.Color = wdColorRed
End If
For Next
End Sub
このコードがなぜ現場で嫌われるのか。理由は2つある。
1. `Paragraph.Range.Text` の罠
Wordの段落テキストの末尾には、必ず不可視の「段落記号(CR/LF等)」が含まれている。そのため、純粋な文字数(体裁上の文字数)を測るつもりが、常に余分な1〜2文字がカウントされてしまう。
2. パフォーマンスの劣化
画面描画(ScreenUpdating)や選択範囲(Selection)の制御を行わないまま、ループ内で直接フォントプロパティを書き換えると、ドキュメントの規模が大きくなった瞬間にフリーズレベルの重さになる。
プロのエンジニアは、「余分な制御文字の排除」と「描画コストの最小化」を担保してコードを組み上げる。
—
2. 堅牢な文字数カウントのメカニズム
Wordにおける「文字数」の定義は厄介だ。改行コードを含めるべきか、スペースはどう扱うべきか。
実務の校正においては、「段落記号を除外した純粋なテキストの文字数」を算出するのが正解となる。
さらに、VBAの `Len()` 関数を使う前に、末尾の段落記号を取り除くか、あるいは文字列操作の段階で確実にクリーニングする必要がある。
プロダクションコードの設計方針
- 画面描画の停止 (`ScreenUpdating = False`):処理速度を最大10倍以上に跳ね上げる。
- Undo(元に戻す)のまとめ処理:処理を1つのトランザクションとして扱い、Ctrl+Zで一発復元できるようにする。
- 文字数閾値のパラメータ化:保守性を高めるため、定数として分離する。
—
3. 【コピペ即実戦】長文段落自動警告マクロ
以下のコードをWordのVBAエディタ(`Alt + F11`)の標準モジュールに貼り付けて実行してほしい。実務の現場でそのまま耐えうる、洗練されたエラーハンドリングと言語化されたコードだ。
Option Explicit
‘ ==============================================================================
‘ 処理名 : 長文段落チェッカー & 自動赤字警告システム
‘ 概要 : ドキュメント内の全段落を走査し、指定文字数を超過した段落の
‘ フォント色を赤に変更して視覚的に警告する。
‘ ==============================================================================
Sub AlertLongParagraphs()
‘ — 設定定数 —
Const THRESHOLD_CHARS As Long = 40 ‘ 警告対象とする文字数の閾値
‘ — 変数宣言 —
Dim targetDoc As Document
Dim targetPara As Paragraph
Dim paraText As String
Dim processedCount As Long
Dim warningCount As Long
‘ 実行前確認
If MsgBox(“指定文字数(” & THRESHOLD_CHARS & “文字)を超える段落を赤字で警告します。” & vbCrLf & “実行しますか?”, _
vbYesNo + vbInformation, “長文段落チェッカー”) = vbNo Then
Exit Sub
End If
‘ パフォーマンスと安定性のための最適化
With Application
.ScreenUpdating = False
.DisplayAlerts = wdAlertsNone
End With
Set targetDoc = ActiveDocument
processedCount = 0
warningCount = 0
‘ エラーハンドリングの有効化
On Error GoTo ErrorHandler
‘ 段落コレクションの高速走査
For Each targetPara In targetDoc.Paragraphs
‘ 段落のテキストを取得
paraText = targetPara.Range.Text
‘ Wordの段落末尾には必ず「段落記号(vbCr等)」が含まれているため、これを除外してカウントする
‘ ※テーブル内のセル末尾セルマーカー等も考慮し、VBAのTrimや置換で安全に処理
paraText = Replace(paraText, vbCr, “”)
paraText = Replace(paraText, vbLf, “”)
paraText = Replace(paraText, vbBell, “”) ‘ 表のセルマーカー対策
‘ 空行(文字数0)はスキップ
If Len(paraText) > 0 Then
processedCount = processedCount + 1
‘ 閾値判定
If Len(paraText) > THRESHOLD_CHARS Then
‘ 基準超過:フォントを赤色に変更(太字や背景色付与もここで拡張可能)
targetPara.Range.Font.Color = wdColorRed
warningCount = warningCount + 1
Else
‘ 基準内:必要に応じて通常の黒(自動)に戻す(再実行時のクレンジング)
‘ ※全てを黒に戻したくない場合はこのElse句を削除してください
targetPara.Range.Font.Color = wdColorAutomatic
End If
End If
Next targetPara
‘ 終了処理
MsgBox “チェックが完了しました。” & vbCrLf & _
“———————————-” & vbCrLf & _
“総チェック段落数: ” & processedCount & ” 件” & vbCrLf & _
“警告(赤字化)件数: ” & warningCount & ” 件”, _
vbInformation, “処理完了”
CleanUp:
‘ 描画の復元
With Application
.ScreenUpdating = True
.DisplayAlerts = wdAlertsAll
End With
Exit Sub
ErrorHandler:
MsgBox “予期せぬエラーが発生しました。” & vbCrLf & _
“エラー番号: ” & Err.Number & vbCrLf & _
“エラー内容: ” & Err.Description, _
vbCritical, “システムエラー”
Resume CleanUp
End Sub
—
4. チーフアーキテクトが教える「現場で活かすための応用テクニック」
このコードをベースに、さらに実務の現場でシステムを拡張するための知見を授けよう。
1. スタイル除外のロジックを組み込む
「見出し(Heading 1, 2など)」や「キャプション」は、そもそも長文になりがちであり、かつ構造上赤字にしてはならないケースが多い。
その場合は、ループ内で `targetPara.Style` を判定するガード節を追加すると完璧だ。
‘ 例:見出しスタイルなら処理をスキップする
If targetPara.Style Like “見出し” Or targetPara.Style Like “Heading” Then
GoTo ContinueLoop
End If
2. データベースやログファイル連携への発展
もしこの校正ツールを大規模なドキュメント管理システムの一部として組み込む場合、単にWord上の文字色を変えるだけでなく、「どのファイルのどの段落が何文字オーバーしているか」をCSVやExcel、または社内DBへログとして吐き出す設計にすべきだ。
`FileSystemObject` を使ったログ出力ロジックを組み合わせることで、ドキュメントの品質メトリクス(定量的評価)を自動収集するBI基盤へと昇華させることができる。
—
総括
プログラミングにおいて、泥臭い手作業をコードで置き換えることは第一歩に過ぎない。
真のエンジニアリングとは、「保守性が高く、エラーに強く、パフォーマンスを極限までチューニングされたコード」を組み上げることにある。
今回提供したコードをあなたの現場に導入し、無駄な目視チェックの時間をゼロに圧縮してほしい。技術の力で、もっと本質的なクリエイティブな仕事に時間を費やそう。
