タカハシ(@ntakahashi0505)です。
Word VBAでいろいろな検索や置換をする方法についてお伝えしています。
前回の記事はコチラ!
Word VBAで検索オプションを設定する方法と、そのプロパティ一覧についてお伝えしました。
さて、Selection.Findですと、カーソル位置より前は検索してくれなかったりします。
ですが、カーソル位置より前も検索したいときあるじゃないですか…?
これにはいくつか方法があるのですが、今回はFindオブジェクトのForwardプロパティを使う方法とWrapプロパティを使う方法の二つの方法についてお伝えします。
では、Word VBAでカーソル位置の前の文書も検索する方法です。
行ってみましょう!
前回のおさらいと今回のお題
では、前回のおさらいもかねて、今回のお題を確認しておきましょう。
まず、Word文書が以下のようなカーソル位置にあるとします。
この状態で以下のプロシージャを実行するとどうなるか、わかりますか?
Sub replaceText()
With Selection.Find
.Text = "Word"
.Replacement.Text = "ワード"
.Execute Replace:=wdReplaceAll
End With
End Sub
このプロシージャは本シリーズ連載ではおなじみですが、「Word」という単語を検索して「ワード」に置換するものです。
実行をすると、以下のようにカーソル位置より前は置換がなされません。
Selectionオブジェクトに対するFindメソッドは、デフォルトではカーソル位置以降のみが検索&置換対象になるのです。
Forwardプロパティで検索の方向を変える
カーソル位置より前の範囲を検索対象とする方法はいくつかあります。
最も単純な方法は、FindオブジェクトについてのForwardプロパティの値を変更して検索の方向を逆にすることです。
Wordの検索オプションでいう、「検索方向」に対応をしています。
値 | 検索方向 | 説明 |
---|---|---|
True | 下へ | 文書に対して末尾の方向(順方向)に検索 |
False | 上へ | 文書に対して先頭の方向(逆方向)に検索 |
既定値ではTrueに設定、つまり順方向ですから、これをFalseに設定すればよいですね。
プログラムとしてはこうですね。
Sub replaceText()
With Selection.Find
.Text = "Word"
.Forward = False
.Replacement.Text = "ワード"
.Execute Replace:=wdReplaceAll
End With
End Sub
これを先ほどと同じ条件で実行すると、以下のようにカーソル位置の前だけが置換されるようになります。
Wrapプロパティの設定で先頭から再検索する
もう一つの方法が、FindオブジェクトのWrapプロパティを使う方法です。
Wrapプロパティは検索が文書の末尾(または先頭)に到達したときの挙動を設定するプロパティで、以下WdFindWrap定数のいずれかを指定します。
定数 | 末尾(または先頭)に到達したときの挙動 |
---|---|
wdFindStop | 検索を終了する |
wdFindContinue | 先頭(または末尾)に戻って検索をする |
wdFindAsk | 先頭(または末尾)に戻って検索をするかメッセージで確認をする |
既定値はwdFindStopなので、最後まで検索すると止まっちゃうんですね。
先頭に戻って検索をする
では、WrapプロパティにwdFindContinueを設定する、つまり文書全体の検索としてみましょう。
プロシージャはこうなりますね。
Sub replaceText()
With Selection.Find
.Text = "Word"
.Wrap = wdFindContinue
.Replacement.Text = "ワード"
.Execute Replace:=wdReplaceAll
End With
End Sub
同様の条件で実行すると、以下のようにカーソルの位置に関わらず、全てが置換されます。
ちなみに、このWrapプロパティをwdFindContinueに設定した状態が、検索オプションの「文書全体」に対応しているということになりますね。
戻って検索をするかメッセージ確認をする
今度はWrapプロパティにwdFindAskを設定して、戻って検索をするかメッセージを表示させてみましょう。
Sub replaceText()
With Selection.Find
.Text = "Word"
.Wrap = wdFindAsk
.Replacement.Text = "ワード"
.Execute Replace:=wdReplaceAll
End With
End Sub
実行しますと以下のような「先頭から検索を続けますか?」というメッセージが表示されます。
ちなみに、ForwardプロパティをFalseに設定つまり検索の方向を逆方向にした場合に、WrapプロパティをwdFindAskに設定したらどうなるのでしょうか。
プロシージャは以下のようになりますね。
Sub replaceText()
With Selection.Find
.Text = "Word"
.Forward = False
.Wrap = wdFindAsk
.Replacement.Text = "ワード"
.Execute Replace:=wdReplaceAll
End With
End Sub
実行して表示されるメッセージは「最後から検索を続けますか?」になります。
そんなに実用的ではないですけどね。
まとめ
Word VBAで検索の方向を変更する方法、また最後まで検索したときに先頭に戻るかどうかを設定する方法についてお伝えしました。
ちなみに、ForwardプロパティもWrapプロパティも他のFindオブジェクトのプロパティと同様、「重ね掛け」になります。
Wordアプリケーションを再起動しないと、前のプロシージャ実行での設定が引き継がれますので、その影響がありそうなときは、都度設定をし直すようにすべきでしょう。
次回は、検索にワイルドカードを使う方法についてお伝えします。
どうぞお楽しみに!