こんにちは。Word VBAの世界へようこそ。
マクロの記録を卒業し、「自分の思い通りにWordを操りたい」と考え始めたあなたへ。今日は、Word VBAのなかでも最も奥が深く、かつ習得すると劇的に世界が変わる「Find(検索)とRange(範囲)の操作」についてお話しします。
単に特定の言葉を見つけるだけなら簡単です。しかし、実務では「見つけた言葉の前後に何が書いてあるかを確認して、処理を変えたい」という場面が多々あります。
例えば、「リンゴ」という言葉を見つけたとき、その前が「赤い」ならそのまま、もし「青い」なら「未熟なリンゴ」に書き換える……といった「文脈(コンテキスト)の判定」です。
ここをマスターすれば、あなたのマクロは単なる「置換マシン」から、文脈を理解する「インテリジェントな自動化ツール」へと進化します。さあ、一緒に扉を開きましょう。
—
1. 検索の基本:Findは見つけた場所を「Range」で教えてくれる
Word VBAで検索を行う際、最も大切な考え方は「Findオブジェクトは見つけた場所の『Range(範囲)』を掴んでいる」ということです。
マクロの記録では `Selection`(選択範囲)が使われますが、プロの現場では `Range` オブジェクトを使います。`Range` は画面を動かさずに裏側でこっそり処理できるため、高速でエラーが少ないのが特徴です。
Dim rng As Range
Set rng = ActiveDocument.Content ‘ 文書全体を対象にする
With rng.Find
.Text = “ターゲット” ‘ 探したい文字列
.Forward = True
.Wrap = wdFindContinue
If .Execute Then
‘ ヒットした場合、rng は「ターゲット」という文字そのものの範囲に変わる
MsgBox “見つかりました!現在の範囲は: ” & rng.Text
End If
End With
このとき、変数 `rng` は「ターゲット」という文字の場所を指し示しています。ここからが本題。この rng の「端っこ」を少しだけ広げて、前後の文字を覗き見してみましょう。
—
2. 魔法のメソッド:MoveStart と MoveEnd
検索にヒットした箇所から、範囲を前後へ動かすために使うのが `MoveStart` と `MoveEnd` です。
- MoveStart: 範囲の開始位置を動かす
- MoveEnd: 範囲の終了位置を動かす
これらは「どれくらい動かすか」を数値で指定します。
- 負の数(-1, -2…): 文頭方向(左)へ広げる
- 正の数(1, 2…): 文末方向(右)へ広げる
図解イメージ
「[ターゲット]」という状態から、
- `rng.MoveStart wdCharacter, -2` とすると…
- 「[前後の]ターゲット]」のように、左側に2文字分、範囲が伸びます。
—
3. 実践コード:検索結果の「前の2文字」を取得する
では、実際に使えるコードを見てみましょう。
検索で見つけた文字の「直前」を確認して、条件に合うときだけ処理をするロジックです。
Sub CheckContextSearch()
Dim rng As Range
Dim prefixText As String
Set rng = ActiveDocument.Content
With rng.Find
.Text = “システム” ‘ 検索するキーワード
.Forward = True
Do While .Execute
‘ 【重要】rngを直接操作すると検索ループが壊れるため、
‘ 別の変数(チェック用Range)にコピーして操作するのがプロの技
Dim chkRng As Range
Set chkRng = rng.Duplicate
‘ 前の3文字分、開始位置を左にずらす
‘ wdCharacter = 文字単位
chkRng.MoveStart Unit:=wdCharacter, Count:=-3
‘ chkRngのテキストは「〇〇〇システム」になっている
‘ ここから「システム」を除いた「前の文字」だけを取り出す
prefixText = Left(chkRng.Text, 3)
‘ 文脈を判定
If prefixText = “OSの” Then
MsgBox “「OSのシステム」が見つかりました。これは重要です!”
Else
Debug.Print “スキップ: ” & prefixText & “システム”
End If
‘ 次の検索のために、rngをヒットした箇所の後ろへ移動させる
rng.Collapse wdCollapseEnd
Loop
End With
End Sub
ここがポイント!
1. `.Duplicate` を使う:
`rng` 自体を `MoveStart` で動かしてしまうと、次回の検索(`.Execute`)がどこから始まるか分からなくなり、無限ループや検索漏れの原因になります。必ず「分身」を作ってから操作しましょう。
2. `Left` 関数や `Right` 関数と組み合わせる:
範囲を広げた後、そこから特定の文字数を抜き出すことで、正確に「前の文字」「後ろの文字」を特定できます。
—
4. 初心者が陥りやすいエラーと回避策
① 文頭・文末でエラーになる
文書の先頭で `MoveStart … -5`(5文字戻る)を実行しようとすると、戻る場所がないため意図しない挙動になることがあります。
Word VBAは賢いので、基本的には「行けるところまで」戻って止まりますが、取得した文字数が想定より短くなることを念頭に置いておきましょう。
② 「単語(wdWord)」の罠
`MoveStart Unit:=wdWord` とすると、単語単位で動けます。しかし、Wordにおける「単語」の定義には後ろの空白が含まれることが多いです。
日本語の場合は句読点や文字の種類(漢字、ひらがな)の切れ目で判定されますが、意図した通りの文字数が取れない場合は、おとなしく `wdCharacter`(文字単位)を使うのが確実です。
—
5. まとめ:ここをクリアすればWord VBAの基本はバッチリ
「検索して、その周辺を調べる」というテクニックは、Word自動化における「目」を手に入れるようなものです。
1. Find でターゲットを見つける
2. Duplicate で範囲をコピーする
3. MoveStart / MoveEnd で視界を広げる
4. If文 で文脈を判断する
この4ステップができるようになれば、マクロの記録では絶対に作れない「賢いツール」が作れるようになります。
最初は、メッセージボックスで `chkRng.Text` を表示させるだけの練習から始めてみてください。「お、ちゃんと前の文字が取れてるな」と実感できれば、もうあなたは初心者脱出です。
Word VBAは、触れば触るほど応えてくれる面白い道具です。ぜひ、恐れずに色々な「範囲(Range)」を広げてみてくださいね。応援しています!
