Word VBAで検索の方向を変更する方法と文書全体を検索する方法


forward

photo credit: Hindrik S Right Direction #1 via photopin (license)

みなさん、こんにちは!
タカハシ(@ntakahashi0505)です。

Word VBAでいろいろな検索や置換をする方法についてお伝えしています。

前回の記事はコチラ!

Word VBAで検索オプションを設定して検索をする方法とそのプロパティ一覧
Word VBAで色々な検索や置換をする方法についてお伝えしています。今回はWord VBAで検索オプションを設定して検索をする方法をお伝えしつつ、その設定をするプロパティ一覧ををまとめています。

Word VBAで検索オプションを設定する方法と、そのプロパティ一覧についてお伝えしました。

さて、Selection.Findですと、カーソル位置より前は検索してくれなかったりします。

ですが、カーソル位置より前も検索したいときあるじゃないですか…?

これにはいくつか方法があるのですが、今回はFindオブジェクトのForwardプロパティを使う方法とWrapプロパティを使う方法の二つの方法についてお伝えします。

では、Word VBAでカーソル位置の前の文書も検索する方法です。

行ってみましょう!

スポンサーリンク

前回のおさらいと今回のお題

では、前回のおさらいもかねて、今回のお題を確認しておきましょう。

まず、Word文書が以下のようなカーソル位置にあるとします。

Word文書のカーソル位置

この状態で以下のプロシージャを実行するとどうなるか、わかりますか?

Sub replaceText()

With Selection.Find
    .Text = "Word"
    .Replacement.Text = "ワード"
    .Execute Replace:=wdReplaceAll
End With

End Sub

このプロシージャは本シリーズ連載ではおなじみですが、「Word」という単語を検索して「ワード」に置換するものです。

実行をすると、以下のようにカーソル位置より前は置換がなされません。

Word VBAの置換でカーソル位置以降は置換されない

Selectionオブジェクトに対するFindメソッドは、デフォルトではカーソル位置以降のみが検索&置換対象になるのです。

Forwardプロパティで検索の方向を変える

カーソル位置より前の範囲を検索対象とする方法はいくつかあります。

最も単純な方法は、FindオブジェクトについてのForwardプロパティの値を変更して検索の方向を逆にすることです。

Wordの検索オプションでいう、「検索方向」に対応をしています。

Wordの検索オプションの検索方向

検索方向 説明
True 下へ 文書に対して末尾の方向(順方向)に検索
False 上へ 文書に対して先頭の方向(逆方向)に検索

既定値ではTrueに設定、つまり順方向ですから、これをFalseに設定すればよいですね。

Findオブジェクト.Forward = False

プログラムとしてはこうですね。

Sub replaceText()

With Selection.Find
    .Text = "Word"
    .Forward = False
    .Replacement.Text = "ワード"
    .Execute Replace:=wdReplaceAll
End With

End Sub

これを先ほどと同じ条件で実行すると、以下のようにカーソル位置の前だけが置換されるようになります。

Word VBAで逆方向に検索して置換した

Wrapプロパティの設定で先頭から再検索する

もう一つの方法が、FindオブジェクトのWrapプロパティを使う方法です。

Wrapプロパティは検索が文書の末尾(または先頭)に到達したときの挙動を設定するプロパティで、以下WdFindWrap定数のいずれかを指定します。

Findオブジェクト.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

同様の条件で実行すると、以下のようにカーソルの位置に関わらず、全てが置換されます。

Word VBAで文書全体を置換した

ちなみに、このWrapプロパティをwdFindContinueに設定した状態が、検索オプションの「文書全体」に対応しているということになりますね。

戻って検索をするかメッセージ確認をする

今度はWrapプロパティにwdFindAskを設定して、戻って検索をするかメッセージを表示させてみましょう。

Sub replaceText()

With Selection.Find
    .Text = "Word"
    .Wrap = wdFindAsk
    .Replacement.Text = "ワード"
    .Execute Replace:=wdReplaceAll
End With

End Sub

実行しますと以下のような「先頭から検索を続けますか?」というメッセージが表示されます。

Word VBAで末尾まで検索したときのメッセージ

ちなみに、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で先頭まで検索したときのメッセージ

そんなに実用的ではないですけどね。

まとめ

Word VBAで検索の方向を変更する方法、また最後まで検索したときに先頭に戻るかどうかを設定する方法についてお伝えしました。

ちなみに、ForwardプロパティもWrapプロパティも他のFindオブジェクトのプロパティと同様、「重ね掛け」になります。

Wordアプリケーションを再起動しないと、前のプロシージャ実行での設定が引き継がれますので、その影響がありそうなときは、都度設定をし直すようにすべきでしょう。

次回は、検索にワイルドカードを使う方法についてお伝えします。

Word VBAでワイルドカードを使ったパターン検索をする方法
Word VBAでいろいろな検索と置換をする方法についてお伝えしています。今回はWord VBAでワイルドカードを使ってパターン検索をする方法についてです。ワイルドカード一覧もありますのでご活用ください。

どうぞお楽しみに!

連載目次:Word VBAで色々な検索&置換をする方法

Word VBAのFindオブジェクトを使えば色々な条件で目的を探し当てて置換、書式設定、その他、いろいろな処理を施すことができます。Word VBAの検索の最初の一歩から順番にお伝えしていきます!
  1. Word VBAで文字列を検索するFindオブジェクトを使った最も基本のプログラム
  2. Word VBAでカーソル位置から連続で検索をして蛍光ペンでハイライトをする
  3. Word VBAで選択範囲のフォント設定を変更する方法とそのプロパティまとめ
  4. Word VBAで文字列を置換する方法!いくつかの基本パターンを徹底解説
  5. Word VBAで検索オプションを設定して検索をする方法とそのプロパティ一覧
  6. Word VBAで検索の方向を変更する方向と文書全体を検索する方法
  7. Word VBAでワイルドカードを使ったパターン検索をする方法
  8. Word VBAでワイルドカードを使ってパターンで超便利な置換をする方法

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