【入門編】【中級者向け】ワイルドカード検索で「特定の単語を含む段落全体」をハイライトする – Word VBA解析バイブル

スポンサーリンク

こんにちは!Word VBAの世界へようこそ。
マクロの記録ボタンを押すだけのステージから一歩進み、自分の手でドキュメントを自在に操る「エンジニア」の扉を開いたあなたへ、今日はとても実用的で、かつWord VBAの核心に迫るテクニックをお伝えします。

「特定のキーワードが含まれる段落全体を、まとめてハイライトしたい」

実務の現場では、レビュー指摘の抽出や、特定の法律用語・NGワードを含む行のあぶり出しなど、非常によくある要件です。
しかし、ここがWord VBAの初学者が最初にハマる「深淵」でもあります。

今回は、単なる検索に留まらず、Wordの文書構造の命である「Range(範囲)の拡張」という概念を武器にして、この難題をエレガントに解決してみましょう。ここをクリアすれば、あなたのWord VBAスキルは間違いなく中級者の領域に到達しますよ!

1. なぜ「段落全体」の選択は難しいのか?

普通の「置換」機能や、単純な`Find`メソッドを使えば、キーワードそのものを赤くしたり、背景色を塗ったりすることは簡単です。

しかし、「キーワードが含まれている段落(Paragraph)そのもの」をハイライトしようとした途端、次のような疑問が湧いてきませんか?

  • 「ヒットした文字の場所から、どうやって段落全体の先頭と末尾を特定するの?」
  • 「1つの段落の中に、同じキーワードが複数あったらどうなっちゃうの?」

ここで登場するのが、Word VBAにおける最大のキーオブジェクト、`Range`(レンジ)です。

秘訣:Word VBAの「Range」は伸び縮みする粘土だ

Wordの`Range`オブジェクトは、固定された文字の選択範囲ではありません。それはまるで「自由に形を変えられる粘土」のようなものです。
`Find`でキーワードのヒット位置を捉えたあと、そのRangeの「アンカー(錨)」を段落全体にガバッと広げてやる。これが、今回の自動化を成功させるための唯一にして最大の極意です。

2. 実装コード:一瞬で段落をハイライトするマクロ

それでは、実際のコードを見てみましょう。
今回は、ワイルドカード(特殊文字)を使って柔軟に検索を行い、ヒットした瞬間にその段落のRangeをごそっと拡張して、蛍光ペン(HighlightColorIndex)で彩るプロシージャを作成しました。

開発タブのVBE(Visual Basic Editor)を開き、標準モジュールに貼り付けて実行してみてください。

Sub HighlightParagraphsWithKeyword()
‘ =====================================================================
‘ 目的: 指定したキーワードを含む「段落全体」をハイライトする
‘ 著者: シーフアーキテクトからの挑戦状
‘ =====================================================================

Dim rngTarget As Range
Dim searchKeyword As String

‘ 1. 検索するキーワード(今回はワイルドカードの例として「第?条」を指定)
‘ ※普通の単語(例: “重要” など)でもOKです
searchKeyword = “第?条”

‘ 2. 検索用Rangeオブジェクトの初期化(文書全体を対象にする)
Set rngTarget = ActiveDocument.Content

‘ 3. 画面の更新を停止して処理速度を爆発的に上げる(お約束のプロ作法)
Application.ScreenUpdating = False

With rngTarget.Find
.ClearFormatting
.Replacement.ClearFormatting
.Text = searchKeyword
.MatchWildcards = True ‘ ワイルドカードを使用する
.Forward = True
.Wrap = wdFindStop ‘ 文書の最後まで来たら終了

‘ 4. ループを回してヒットし続ける限り処理を行う
Do While .Execute

‘ 【超重要】ヒットした瞬間のRangeを「段落全体(wdParagraph)」に拡張する!
rngTarget.Expand Unit:=wdParagraph

‘ 拡張した段落に対してハイライトを適用(例: 黄色)
rngTarget.HighlightColorIndex = wdYellow

‘ 5. 【無限ループ防止の魔法】
‘ Range.Expandを行うと、rngTargetの末尾が次の段落の始まりなどに食い込むことがある。
‘ 次の検索を「ヒットした段落の末尾」から開始するようにRangeを縮小・移動させる。
rngTarget.Collapse Direction:=wdCollapseEnd

Loop
End With

‘ 6. 画面描画を復元
Application.ScreenUpdating = True

‘ 完了メッセージ
MsgBox “キーワードを含む段落のハイライトが完了しました!”, vbInformation

End Sub

3. コードの急所を徹底解説!

このコードの美しさは、プログラミング初学者が必ず陥る「ある罠」をスマートに回避している点にあります。重要なポイントを3つに分けて解説します。

① `rngTarget.Expand Unit:=wdParagraph` の破壊力

`Find.Execute`が成功すると、`rngTarget`は「ヒットしたキーワード(例:第1条の文字)」の場所だけに縮まります。
そこで `Expand Unit:=wdParagraph` を実行すると、Wordは自動的にその前後の境界線(改行マーク)を探しに行き、レンジの始点を段落の頭に、終点を段落のケツに一瞬で引き伸ばします。 これにより、段落全体を一つのオブジェクトとして掴むことができるのです。

② 無限ループ地獄を防ぐ `Collapse`

ここが一番の落とし穴です。
段落全体をハイライトした後、そのまま次の `.Execute` を呼ぶとどうなるでしょうか?
Wordは「さっきハイライトした段落の中」をもう一度検索してしまい、同じ場所で永遠にループ(無限ループ)してしまいます。

これを防ぐのが、ループの最後にあるこのコードです。

rngTarget.Collapse Direction:=wdCollapseEnd

これにより、レンジを「ヒットした段落の終わりの1点」に畳み込み、検索のスタート位置を「次の段落」へと強制的に押し進めているのです。この挙動を理解できれば、あなたもうWord VBAの中級者です。

③ `Application.ScreenUpdating = False` による高速化

段落の数だけ画面の描画を書き換えていると、Wordがフリーズしたようなノロノロ運転になります。処理の最初に画面描画を止め、最後に復元するおまじないを入れることで、数百ページの文書であっても一瞬で処理が完了します。

4. 現場で使えるアレンジのヒント

このコードをベースに、実務では次のようなカスタマイズが可能です。

  • ハイライトの色を変える

`wdYellow` の部分を `wdBrightGreen`(鮮やかな緑)や `wdPink`(ピンク)などに変更できます。

  • 検索ワードを変数やインプットボックスにする

`searchKeyword = InputBox(“検索するキーワードを入力してください”)` とすれば、毎回ダイアログで指定できるようになり、ツールとしての汎用性が爆発的に上がります。

  • ハイライトのクリア機能をつける

処理の最初に `ActiveDocument.Content.HighlightColorIndex = wdNoHighlight` を仕込んでおけば、マクロを実行するたびに「古いハイライトを綺麗に消して、最新の状態だけを再ハイライトする」という神仕様になります。

まとめ

今回は、ワイルドカード検索と組み合わせた「特定の単語を含む段落全体のハイライト」について解説しました。

  • 単なる文字検索から、`Range`の拡張(Expand)へ発想を切り替えること
  • `Collapse`を使って無限ループを華麗にかわすこと

この2つさえ押さえておけば、Wordの構造を完全に手中に収めたも同然です。ぜひ、日々の業務効率化にこの知見を役立ててください。
ここをクリアしたあなたなら、どんな複雑なWord自動化も怖くありませんよ。それでは、次のステップでお会いしましょう!

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