Word表内の特定文字列を検索し、該当セルを太字にする自動化の極意
業務自動化エンジニアの私から言わせてもらえば、Word文書の表整形ほど、手作業でやると無駄な時間を消耗する作業はない。
「この見積書や報告書のなかにある『未確定』という文字の入ったセルを、すべて太字にして目立たせてくれ」
こんな依頼を受けたとき、君ならどうする?まさか、ドキュメントを目視でスクロールしながら、マウスでセルをクリックしてCtrl + Bを連打するまいな。ページ数が数十ページ、表が何十個もある文書だったら、それだけで半日が溶ける。そして必ず見落としが発生する。
今回は、Word VBA(Visual Basic for Applications)を駆使し、「文書内のすべての表を走査し、指定したキーワードが含まれるセルを瞬時に太字化する」極めて実用的かつ堅牢な自動化ソリューションを伝授しよう。
単に動くだけのコードではない。実務の現場で「想定外のエラー」を踏まないためのプロの設計思想を叩き込む。
—
なぜ素人のコードはバグるのか?(Word VBAの罠)
ネットを検索すれば、「Word 表 セル 検索 VBA」といったキーワードで、似たようなコードがいくつかヒットするだろう。しかし、その多くは実務の巨大なドキュメントを放り込んだ途端にエラーを起こす、あるいは無限ループに陥る「爆弾」を抱えている。
プロのアーキテクトが避けるべきポイントは主に以下の2点だ。
1. 画面描画の抑制をしていない(パフォーマンスの絶望的な低下)
WordはVBAからセルやレンジを操作するたびに、画面の描画を更新しようとする。表が大きければ大きいほど、処理が重くなり、画面がフリーズしたような状態になる。
2. セルの「末尾の特殊文字(セルマーカー)」の考慮漏れ
Wordの表の各セルには、必ず「セル終了マーカー(`Cell.Range`の末尾にある制御文字)」が含まれている。これを無視してテキスト操作を行うと、予期せぬ文字列の置換や書式崩壊を引き起こす。
これらを完全にクリアした、プロダクション品質のコードをこれから公開する。
—
プロダクションコード:表内キーワード検索・太字化マクロ
以下のコードを、WordのVBAエディタ(`Alt + F11`で起動)の標準モジュールに貼り付けてほしい。
Option Explicit
‘ ==============================================================================
‘ 処理名 : HighlightKeywordInTables
‘ 概要 : アクティブ文書内のすべての表を走査し、指定キーワードが含まれる
‘ セルを太字にフォーマットする
‘ ==============================================================================
Public Sub HighlightKeywordInTables()
‘ 検索キーワード(必要に応じて変更してください)
Const TARGET_KEYWORD As String = “未確定”
Dim targetDoc As Document
Set targetDoc = ActiveDocument
‘ 表が存在するかチェック
If targetDoc.Tables.Count = 0 Then
MsgBox “文書内に表が見つかりません。”, vbExclamation, “処理中断”
Exit Sub
End If
‘ — 1. パフォーマンス最適化の極意 —
‘ 画面描画とバックグラウンド再計算を停止し、処理速度を爆発的に向上させる
With Application
.ScreenUpdating = False
.DisplayAlerts = wdAlertsNone
End With
Dim startTime As Double
startTime = Timer
On Error GoTo ErrorHandler
Dim tbl As Table
Dim cel As Cell
Dim matchedCount As Long
matchedCount = 0
‘ — 2. 表・行・セルの階層構造を完全に網羅する走査 —
For Each tbl In targetDoc.Tables
For Each cel In tbl.Range.Cells
‘ セルのテキストから末尾のセルマーカー(Chr(13) + Chr(7)等)を除去して比較
Dim cellText As String
cellText = cel.Range.Text
‘ Wordのセル終端文字(Chr(13) & Chr(7))をトリム
If Len(cellText) >= 2 Then
cellText = Left(cellText, Len(cellText) – 2)
End If
‘ キーワードが含まれているか判定
If InStr(1, cellText, TARGET_KEYWORD, vbTextCompare) > 0 Then
‘ 該当セルのレンジ全体を太字に設定
cel.Range.Bold = True
matchedCount = matchedCount + 1
End If
Next cel
Next tbl
‘ 正常終了処理
Application.ScreenUpdating = True
Application.DisplayAlerts = wdAlertsAll
MsgBox “処理が完了しました。” & vbCrLf & _
“キーワード: 「” & TARGET_KEYWORD & “」” & vbCrLf & _
“該当セル数: ” & matchedCount & ” 箇所” & vbCrLf & _
“処理時間: ” & Format(Timer – startTime, “0.00”) & ” 秒”, _
vbInformation, “実行完了”
Exit Sub
ErrorHandler:
‘ — 3. 堅牢なエラーハンドリング —
‘ 予期せぬエラーが発生した場合でも、画面描画設定を必ず復元する
Application.ScreenUpdating = True
Application.DisplayAlerts = wdAlertsAll
MsgBox “エラーが発生しました。” & vbCrLf & _
“エラー番号: ” & Err.Number & vbCrLf & _
“エラー内容: ” & Err.Description, _
vbCritical, “致命的なエラー”
End Sub
—
コードの核心:なぜこの設計なのか?
1. `Application.ScreenUpdating = False` による高速化
ループ内でWordのオブジェクトを操作すると、OS側で描画の負荷がかかる。これをオフにすることで、処理速度が最大で10倍以上変わる。実務において「遅いプログラムはバグと同じ」だ。数千行ある巨大なマニュアルでも一瞬で処理を終わらせるための必須テクニックである。
2. Word特有の「セルマーカー」の排除
Wordの `Cell.Range.Text` をそのまま取得すると、文字列の最後に必ず制御文字(セル自体の終わりを示す特殊コード)が付いてくる。これを考慮せずに完全一致検索などをかけると、「一致するはずの文字列が一致しない」という不可解なバグに悩まされることになる。
コード内にある `Left(cellText, Len(cellText) – 2)` という処理は、そのゴミを取り除くためのプロの定石だ。
3. エラー時の「状態復元(State Restoration)」
VBA開発で最もやってはいけないのが、エラー時に `ScreenUpdating = False` の状態のままプログラムが停止し、Wordの画面が固まったままユーザーを絶望させることだ。
`ErrorHandler:` ラベルを必ず用意し、万が一の例外発生時でも確実に画面描画とアラート設定を元の状態に戻す(`Clean up` する)。これがプロとアマの決定的な差である。
—
実務でさらに応用・拡張させるためには?
このコードをベースにすれば、現場のあらゆる要求にアジャストできる。
- 外部ファイル(ExcelやCSV)からのキーワード読み込み
`TARGET_KEYWORD` を定数にするのではなく、Excelファイルから動的に読み込ませることで、「今週の重点チェックワードリスト」に連動した高度な文書監査ツールへと進化させられる。
- 太字化だけでなく、背景色(セルの網掛け)の変更を追加する
目立たせるだけでなく、`cel.Shading.BackgroundPatternColor = wdColorLightYellow` のようなプロパティを追加すれば、該当セルを黄色くハイライトすることも容易だ。
最後に
業務自動化の本質は、「人がやるべきではない単純作業を、コードに正確に代行させること」にある。
今回提供したコードは、単なるスニペットではない。どんなに大きな文書を放り込んでも音を上げない、実戦で鍛え抜かれた堅牢性を持っている。
自分の手作業の時間を奪い返し、より創造的な開発や設計の仕事にリソースを集中させろ。君のプロジェクトの成功を祈る。
