【Excel VBA入門】指定範囲から複数セルを検索するFindNextの使い方

【Excel VBA入門】指定範囲から複数セルを検索するFindNextの使い方

こんにちは、業務自動化ツール開発担当の吉池(@valmore_myoshi)です。

Excel作業をVBAで自動化するなかで条件にあったセルを検索したい、と思うことはありませんか?検索対象が一つだけであればFindメソッドが使えますが、複数の場合はそうもいきません。

そんなときはFindNextメソッドの出番です。条件にあったセルを複数検索でき、まさに願ったり叶ったりのメソッドですが、使い方に癖があるのが難点です。

本記事では、FindNextメソッドによる検索方法と使う際の注意点を解説します。ぜひ複数検索するときの参考にしてください。

FindNextメソッドの書き方

FindNextメソッドはFindメソッドで指定した条件で検索を継続するメソッドです。検索範囲をRangeオブジェクトで指定し、引数にはセルを指定します。ここで指定したセルの次から検索を継続します。

Set rng = Rangeオブジェクト.FindNext(Findメソッドで検索にヒットしたセル)

FindとFindNextの違い

一言では説明がわかりづらいので、下記の図をご覧ください。品名を検索範囲としてFindメソッドとFindNextメソッドの違いを図解してます。

FindとFindNextメソッドの違い

Findメソッドは検索範囲のなかで最初に見つけたセルを返します。一方、FindNextメソッドは、Findメソッドで見つけたセルの次から検索します。指定範囲をすべて検索し終えたら最初に戻ることに注意してください。

FindNextの使い方

例として、品名のなかからりんごの行番号をすべて取得するプログラムは下記のようになります。

Dim rng As Range, tempRng As Range, searchRng As Range

Set searchRng = Range("B:B")

' 最初はFindで検索
Set rng = searchRng.Find("りんご")

' 検索結果を一時保存
Set tempRng = rng

' 条件にあったセルが見つからなければNothingが返るので何もしません
Do While Not rng Is Nothing
    Debug.Print rng.Row
    
    ' FindNextで検索を継続
    Set rng = searchRng.FindNext(rng)
    
    ' すべて検索し終えると最初に戻るので、Addressで確認!
    ' これを忘れると無限ループになるので注意!
    If rng.Address = tempRng.Address Then
        Exit Do
    End If
Loop

最初はFindで検索し、条件に一致したセルを変数rngとtempRngに格納しています。これはFindNextメソッドの特性、すべて検索し終えたら最初に戻るという特性を考慮して、最初に検索に合致したセルの位置と比較できるようにするためです。

つまり、FindNextメソッドで得られた検索結果がtempRngと同じであれば、すべて検索し終えて最初に戻っていると確認できるわけです。

ここがFindNextメソッドのわかりづらいポイントですが、コードを見てよく理解しましょう!

Findメソッドをおさらいしたい方はこちらの記事をご覧ください。
【Excel VBA入門】Findメソッドで条件に一致するセルを検索する方法

まとめ

FindNextメソッドの使い方を解説しました。複数セルを検索したいときにとても便利なメソッドですが、使い方が難しいので注意が必要です。

VBAを使っていても複数検索の要望は多々あるので、よく使うメソッドといえます。ぜひこの機会にマスターしてください!