【入門編】【中級者向け】検索結果の「Range」を保持し、置換後に特定のスタイルを適用する一連の処理 – Word VBA解析バイブル

スポンサーリンク

Word VBAの真髄:検索と置換の「その先」を自在に操るRangeオブジェクトの極意

こんにちは。業務自動化の世界へようこそ。

「マクロの記録」ボタンを押して、生成されたコードの多さに絶望したことはありませんか? `Selection`をあちこち動かして画面をチラつかせるようなコードは、もう卒業しましょう。

今日は、Word VBAの「心臓部」とも言える`Range`オブジェクトをマスターし、検索した文字列に対して「置換」だけでなく「スタイル適用」までを一気通貫で行う、プロの技術を伝授します。

—

1. なぜ「Selection」ではなく「Range」なのか

Word VBAで最も多い間違いが、`Selection`(現在のカーソル位置)を動かして処理することです。これは非常に低速で、かつ文書の表示状態に依存するためエラーも起きやすい。「プロ」は、見えない場所で高速に処理を行う`Range`オブジェクトを使います。

  • Selection: 「今、どこを見ているか」に依存する。画面描画を伴うため遅い。
  • Range: 文書内の「場所(起点と終点)」そのものを指す。画面を動かさず、メモリ上で計算するため爆速。

—

2. 検索と置換を極める:Rangeのライフサイクル

検索の基本は、`Find`オブジェクトを呼び出し、`Execute`メソッドを叩くことです。しかし、置換した瞬間に「その場所」を見失ってしまうのが初心者の壁。

ここで重要なのは、「検索にヒットした瞬間、そのRangeは『置換後の文字列』を指し示している」という事実です。この特性を活かせば、置換と装飾はシームレスに繋がります。

—

3. 実践コード:検索・置換・スタイル適用を一撃で

以下のコードは、文書内の特定のキーワードを検索し、置換した上で「赤字・太字・特定のスタイル」を適用する汎用的なプロシージャです。

Sub AdvancedSearchAndStyle()
Dim rng As Range
Set rng = ActiveDocument.Content ‘ 文書全体をRangeとして取得

‘ 検索条件の設定
With rng.Find
.ClearFormatting ‘ 検索条件の書式をクリア
.Text = “【重要】” ‘ 検索したい文字列
.Replacement.Text = “重要事項:” ‘ 置換後の文字列
.Forward = True
.Wrap = wdFindContinue ‘ 文末まで行ったら先頭に戻る

‘ 一括置換を実行(ReplaceAll)しつつ、処理をループさせる準備
Do While .Execute(Replace:=wdReplaceOne)
‘ ここで重要なのは「rng」が今まさに置換した場所を指していること!

‘ 1. フォント装飾を適用
With rng.Font
.Color = wdColorRed
.Bold = True
.Size = 12
End With

‘ 2. 段落スタイルを適用(例:見出し2スタイル)
rng.Style = ActiveDocument.Styles(wdStyleHeading2)

‘ 3. 検索範囲を「置換後の後ろ」に移動させてループ継続
rng.Collapse Direction:=wdCollapseEnd
Loop
End With

MsgBox “置換と装飾処理が完了しました。”, vbInformation
End Sub

—

4. プロの視点:陥りやすい罠と対策

このコードを書く上で、初心者が必ずと言っていいほどハマるポイントが3つあります。

① `.Collapse` を忘れる(無限ループの恐怖)

`rng.Find` がヒットしたとき、`rng` はヒットした範囲全体を指しています。そのまま次の検索に進むと、同じ場所を何度も検知して無限ループに陥ります。`rng.Collapse Direction:=wdCollapseEnd` を入れることで、「今見つけた場所の直後」から次の検索を開始するという、極めて重要な制御を行っています。

② `ClearFormatting` の重要性

`Find` オブジェクトには「直前に手動で検索した条件」が残っています。これをリセットしないと、予期せぬ書式設定が検索条件に含まれ、「ヒットしない!」という事態が発生します。必ずループの前に書きましょう。

③ スタイルの存在確認

コード内で `ActiveDocument.Styles(wdStyleHeading2)` と指定していますが、もし文書内にそのスタイルが存在しない場合、エラーになります。実運用では `On Error Resume Next` で囲うか、スタイルが存在するかを事前にチェックする関数を噛ませるのが、より堅牢な設計です。

—

5. まとめ:ここをクリアすれば「自動化の達人」

今回学んだのは、単なる「置換」ではなく、「Rangeオブジェクトを制御し、文書の構造をプログラムから操る」という概念です。

  • `Range`で場所を特定する。
  • `Find`で範囲を絞り込む。
  • `Collapse`で次の処理地点へ送り出す。

この一連のサイクルさえ体に染み込ませれば、Wordの文書整形作業は驚くほど短縮されます。最初は難しく感じるかもしれませんが、この「Rangeを操る感覚」こそが、Excel VBAから一歩進んだ、Word VBAエンジニアとしての第一歩です。

さあ、あなたの手元にある「退屈な定型作業」を、このコードで鮮やかに解決してやってください。応援しています。

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