【実務・中級編】【初心者向け】Findオブジェクトで特定の文字列を赤字・太字にする基本操作 – Word VBA解析バイブル

スポンサーリンク

Word VBAを掌握する極限の知見

【第1回】Findオブジェクトで特定の文字列を赤字・太字にする基本操作

業務自動化の現場において、Word文書の体裁統一や特定キーワードの強調(ハイライト)は、避けて通れない定番の要件だ。手作業で「検索と置換」ダイアログを叩くなどという前時代的なアプローチは、人為的ミスの温床であり、エンジニアの恥である。

今回は、Word VBAの `Find` オブジェクトを完全掌握し、文書内の特定キーワードを一括で「赤字・太字」に変換する、堅牢かつ実用的なプロダクションコードを伝授する。

なぜ、安易な `Find` 実装はバグを生むのか?

世の入門サイトに溢れるコードの多くは、次のような安易な実装になっている。

‘ 【アンチパターン】絶対に真似してはならないコード
Sub BadExample()
Selection.Find.Text = “重要”
Selection.Find.Replacement.Font.Color = wdColorRed
Selection.Find.Replacement.Font.Bold = True
Selection.Find.Execute Replace:=wdReplaceAll
End Sub

このコードがなぜプロの現場で嫌われるのか。理由は3つある。
1. `Selection`(選択範囲)に依存している:カーソルの位置によって処理結果が変わり、文書全体を確実に走査できない。
2. 前回の検索条件が残留する:Wordの `Find` は、アプリケーション全体で前回の検索条件(ワイルドカードの有無や書式設定)を保持する。初期化を怠ると、環境によって挙動が変わる「動かないバグ」の温床になる。
3. エラーハンドリングと巻き戻しがない:実行時の予期せぬロックや、置換対象が存在しない場合の挙動が考慮されていない。

実務で求められるのは、「どのような文書状態であっても、一意に、安全に、高速に処理を完遂するコード」だ。

プロダクション品質:堅牢な一括書式変更コード

以下のコードは、実務の現場でそのままデプロイ可能な、クリーンかつ堅牢な実装である。オブジェクトのライフサイクルを意識し、`ClearFormatting` による初期化を徹底している。

Option Explicit

‘ ==============================================================================
‘ 担当者名:チーフアーキテクト
‘ 概要  :指定したキーワードを文書内から検索し、赤字・太字に一括変換する
‘ 備考  :環境依存のバグを防ぐため、Find/Replacementプロパティの完全初期化を実装
‘ ==============================================================================
Public Sub HighlightKeywordToRedBold()

Dim targetDoc As Document
Set targetDoc = ActiveDocument ‘ 処理対象を明示的に定義(アクティブ文書)

‘ 検索キーワードの定義
Const SEARCH_KEYWORD As String = “重要”

‘ 1. スクリーン更新を停止し、処理速度を極限まで引き上げる
Application.ScreenUpdating = False

‘ 2. 検索・置換オブジェクトの完全初期化(前回のゴミ設定を持ち越さないための鉄則)
With targetDoc.Content.Find
.ClearFormatting
.Replacement.ClearFormatting

‘ 3. 検索条件の設定
.Text = SEARCH_KEYWORD
.Forward = True
.Wrap = wdFindStop ‘ 文書の端に達したら検索を終了する
.MatchCase = True ‘ 大文字・小文字を区別する場合はTrue
.MatchWholeWord = False

‘ 4. 置換後の書式設定
.Replacement.Font.Color = wdColorRed
.Replacement.Font.Bold = True

‘ 5. 一括置換の実行(wdReplaceAllによりループ処理を排除し高速化)
.Execute Replace:=wdReplaceAll
End With

‘ 6. スクリーン更新の復元
Application.ScreenUpdating = True

‘ 完了通知
MsgBox “キーワード「” & SEARCH_KEYWORD & “」の赤字・太字化が完了しました。”, vbInformation, “処理完了”

ErrorHandler_Exit:
‘ 異常終了時も画面描画がロックされないための保険
Application.ScreenUpdating = True
Exit Sub

End Sub

コードの急所:アーキテクトが解説する3つの技術的ポイント

1. `Selection` ではなく `Range` (`targetDoc.Content.Find`) を使え

UIを伴う `Selection` オブジェクトの操作は、Wordの画面描画(レンダリング)が発生するため極めて低速だ。文書全体を指す `Content` オブジェクトの `Find` を叩くことで、メモリ上で高速に文字列操作を完結させる。これがプロの速度だ。

2. `.ClearFormatting` による「状態のデトックス」

Wordの `Find` 機能は厄介なことに、ユーザーがWordの画面上で手動検索した際の設定(あいまい検索や書式条件など)をメモリ上に引きずる。コードの冒頭で `.ClearFormatting` と `.Replacement.ClearFormatting` を必ず呼び出し、「まっさらな状態」から処理を開始させること。これが保守性を高める最大の秘訣である。

3. `Application.ScreenUpdating = False` によるパフォーマンス最適化

数千ページある巨大な仕様書や契約書を処理する場合、画面が書き換わるたびにCPUとメモリが浪費される。描画を一時停止し、処理の最後に一気に画面を更新することで、実行時間を何分の一にも短縮できる。

実務展開における注意点とデータベース連携への布石

このコードをベースにして、実務でさらに自動化を進める際の知見を共有する。

  • 複数キーワードへの拡張

単一のキーワードではなく、Excelや外部データベース(Access / SQL Server等)から「強調すべきキーワードのリスト」を動的に取得し、配列やコレクションに格納して `For Each` ループで回す設計に拡張すると、真の業務効率化ツールとなる。

  • ログ記録の義務化

プロダクション環境では、「どのキーワードが何箇所ヒットし、置換されたのか」をテキストファイルや別シートにログとして吐き出す仕組みを組み込むべきである。

総括

Word VBAの `Find` オブジェクトは、作法さえ守れば極めて強力な武器となる。
「動けばいい」というアマチュアのコードを卒業し、環境に左右されず、高速かつ安全に動作するプロフェッショナルなコードをあなたの武器庫に加えなさい。

タイトルとURLをコピーしました