こんにちは!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自動化も怖くありませんよ。それでは、次のステップでお会いしましょう!
