Word VBAの「検索」で迷子にならないために。Rangeオブジェクトを掌握する極意
Word VBAで「マクロの記録」を卒業し、少し複雑な処理を書こうとした瞬間に、多くの人が壁にぶつかります。そう、「検索(Find)」が意図した通りに動かない問題です。
「カーソルの位置によって結果が変わる」「途中で検索が止まってしまう」……これらは、あなたが悪いのではありません。Wordの検索機能が、デフォルトで「現在の選択範囲」に依存しているからです。
今日は、プロの現場でも必ず使う「文書の先頭から確実に検索をかけるための鉄則」を伝授します。ここをクリアすれば、Word VBAの制御がグッと自由になりますよ。
—
なぜ「検索」は思い通りにならないのか?
Wordの検索機能(`Selection.Find`)は、人間が手作業で「Ctrl + F」を押したときと同じ動きをします。つまり、「今カーソルがある場所から後ろに向かって」という制約を常に背負っているのです。
プログラムは人間と違って、文書のどこにカーソルがあるか常に把握するのは困難です。だからこそ、私たちは「Selection(選択範囲)」を直接いじるのをやめ、「Range(範囲オブジェクト)」を使う必要があります。
Rangeオブジェクトとは?
Rangeとは、文書内の特定の「範囲」を指し示す目に見えない付箋のようなものです。これを使えば、カーソル位置を一切気にせず、「文書全体」や「特定の段落」という広さを自由に指定できます。
—
【実践】文書全体を確実に検索するためのコード
以下のコードは、文書の先頭から末尾まで、特定の文字列(今回は「重要」という文字)をすべて検索し、太字に書き換えるという処理のテンプレートです。
Sub SearchAndReplaceAll()
‘ 1. 文書全体をカバーするRangeオブジェクトを作成
Dim rng As Range
Set rng = ActiveDocument.Content ‘ 文書全体を範囲に設定
‘ 2. Findオブジェクトの設定(ここが心臓部です)
With rng.Find
.ClearFormatting ‘ 検索条件の書式をクリア
.Replacement.ClearFormatting ‘ 置換後の書式をクリア
.Text = “重要” ‘ 検索したい文字列
.Replacement.Text = “【重要】” ‘ 置換後の文字列
.Forward = True ‘ 前方へ検索(基本)
.Wrap = wdFindContinue ‘ 文末まで行ったら先頭に戻って繰り返す
.Format = False ‘ 書式を含まない
.MatchCase = False ‘ 大文字小文字を区別しない
.MatchWholeWord = False ‘ 単語単位で探さない
‘ 3. 置換を実行(wdReplaceAllで一気に処理)
.Execute Replace:=wdReplaceAll
End With
MsgBox “検索と置換が完了しました。”, vbInformation
End Sub
コードのポイント解説
- `ActiveDocument.Content`: これを指定することで、文書全体を一つの巨大な「Range」として確保します。これでカーソル位置から解放されます。
- `.Wrap = wdFindContinue`: これが「検索方向」を制御する魔法の呪文です。文書の末尾に達しても、先頭から再開して文書全体を一周してくれます。
- `.Execute Replace:=wdReplaceAll`: ひとつずつ確認しながら置換するのではなく、一括置換させることで処理速度を劇的に向上させています。
—
現場で役立つエラー回避の知恵
初心者が陥りやすいミスとして、「範囲が広すぎて予期せぬ場所まで書き換えてしまう」ということがあります。
例えば、「特定の章の中だけで検索したい」という場合は、`ActiveDocument.Content`ではなく、以下のように範囲を絞り込みます。
‘ 特定の段落(第2段落)だけを検索対象にする場合
Set rng = ActiveDocument.Paragraphs(2).Range
このように、「どこを検索対象にするか」を明確に定義(Set)してから検索を開始する。 この習慣こそが、マクロを「気まぐれなツール」から「信頼できる自動化プログラム」へと進化させる鍵です。
—
まとめ:ここをクリアすれば世界が変わる
Word VBAにおける検索は、「Selection(カーソル位置)」を捨て、「Range(論理的な範囲)」を使いこなすことから始まります。
1. Selectionは使わない: カーソル移動は遅く、エラーの元です。
2. Rangeを定義する: 文書全体なのか、一部なのかを明確にします。
3. Wrapプロパティを設定する: 検索の始点と終点を制御します。
この3ステップを意識するだけで、あなたの書くマクロの安定感は見違えるほど向上するはずです。
もしコードが期待通りに動かないときは、「今、どのRangeを触っているのか?」を立ち止まって考えてみてください。その問いかけができるようになれば、あなたはもう初心者ではありません。
さあ、次の自動化の扉を開きましょう!応援しています。
