【入門編】【中級者向け】検索結果のRangeを配列に格納し、置換後に「ハイライト」を一括適用する手法 – Word VBA解析バイブル

スポンサーリンク

Word VBAで「検索と置換」を極める:Range配列を用いた爆速ハイライト術

こんにちは。業務自動化の深淵へようこそ。
「マクロの記録」で生成されたコードが、なぜあんなにも遅く、なぜあんなにも不安定なのか。疑問に思ったことはありませんか?

それは、Wordが裏側で「画面の描画」と「カーソルの移動」という、極めて重い処理を繰り返しているからです。特に、検索しては置換し、検索しては置換する……というループは、Wordのエンジンにとって拷問のようなもの。

今日は、中級者へのステップアップとして、「検索結果をメモリ上の配列に一時保存し、最後に一括で書式を適用する」という、プロのアーキテクチャを紹介します。

—

なぜ「一括処理」が正義なのか?

Word VBAにおいて、`Selection`オブジェクトを動かすのは「現場を走り回る」行為です。遅いし、画面がチラつきます。
一方、`Range`オブジェクトを操作するのは「デスクで書類を整理する」行為。画面を動かさず、内部データだけを高速に処理します。

今回の手法のメリットは以下の3点です。
1. 圧倒的なパフォーマンス: 画面更新を最小限に抑える。
2. 安定性: 検索途中でカーソルが迷子にならない。
3. 柔軟性: 検索した「場所」を保持しているため、置換だけでなく書式変更やコメント挿入も自在。

—

実装コード:Range配列による一括ハイライト

以下のコードは、文書内の特定の文字列をすべて検索し、その「場所」を配列に格納してから、最後に一括でハイライトを適用するエリートコードです。

Sub HighlightAllKeywords()
Dim doc As Document
Dim rngSearch As Range
Dim rngArray() As Range
Dim i As Long

Set doc = ActiveDocument
Set rngSearch = doc.Content

‘ 配列のカウンタ
i = 0

‘ 画面更新を停止して高速化
Application.ScreenUpdating = False

‘ 検索処理:見つからなくなるまで繰り返す
With rngSearch.Find
.Text = “重要キーワード” ‘ ここに検索したい文字列
.Forward = True
.Wrap = wdFindStop

Do While .Execute
‘ 見つかった場所(Range)を配列に保存
ReDim Preserve rngArray(i)
Set rngArray(i) = rngSearch.Duplicate
i = i + 1
Loop
End With

‘ 配列に格納されたRangeを一括でハイライト
Dim j As Long
For j = 0 To UBound(rngArray)
rngArray(j).HighlightColorIndex = wdYellow
Next j

‘ 画面更新を再開
Application.ScreenUpdating = True

MsgBox i & “箇所をハイライトしました。”, vbInformation
End Sub

—

コードの心臓部を解剖する

このコードが「ただのコピペ」と違うポイントを解説します。

  • `rngSearch.Duplicate` の魔法

ここが最大の肝です。`rngSearch` は検索が進むたびに範囲が移動しますが、`Duplicate` を使うことで、その時の「検索結果の座標」を独立したオブジェクトとして複製・保存できます。これを使わないと、配列の中身がすべて最後に見つかった場所に上書きされてしまうのです。

  • `ReDim Preserve`

配列のサイズを動的に拡張する命令です。「いくつ見つかるかわからない」という状況でも、メモリを無駄にせず柔軟に受け皿を作れます。

  • `Application.ScreenUpdating = False`

プロのエンジニアが必ず入れる「魔法の呪文」。Wordの描画エンジンを停止させることで、処理速度が数倍から数十倍に跳ね上がります。

—

陥りやすい罠:ここだけは注意!

1. `Selection`を使わない:
初心者はすぐに `Selection.Find` を使いたがりますが、`Selection`は「現在ユーザーが見ている場所」に依存するため、実行中にユーザーが別の場所をクリックするとエラーになります。常に `Range` オブジェクトを使いましょう。
2. メモリの解放:
今回の例のようにRangeを配列に大量に詰め込むと、非常に長い文書ではメモリを消費します。数千件を超える検索を行う場合は、配列ではなく、都度その場で書式変更する処理と使い分ける「知恵」が必要です。

—

次のステップへ

この「検索結果を配列に格納する」という考え方をマスターすれば、次は「正規表現」と組み合わせることで、さらに強力なツールが作れます。Word標準のFind機能ではできない、「文末が〇〇で終わる単語だけを抽出する」といった高度な自動化も夢ではありません。

まずはこのコードを、あなたの手元の文書で動かしてみてください。
「マクロの記録」にはない、軽快でスマートな動作にきっと感動するはずです。

ここをクリアすれば、Word VBAの基礎は完全にあなたのものです。次はどんな自動化に挑戦しましょうか?応援していますよ。

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