Excel

【Excel VBA】FindNextで順番通りに検索結果を表示する方法

こんばんは。

nanana-blog管理人のナナナです。

ブログを訪問し記事を読んでいただきありがとうございます。

ExcelのFindNextメソッドをご存知でしょうか。

Findメソッドは検索範囲の1番最初しか検索できませんが、FindNextメソッドを使用すると、検索条件に一致するセルを全て検索することができます。

本日はExcelVBAのFindNextメソッドをサンプルを使って紹介します。

FindNextの構文

Range.FindNext(After)

「Range」は検索範囲のRangeオブジェクトを指定します。

ここで指定された検索範囲を検索していきます。

名前 内容
After 指定したセルの下方 (行のときは右、列のときは下) のセルから検索を開始します。

検索は指定したセルの次のセルから始まるので、指定したセル自体は、範囲全体が一度検索されるまで検索されません。 この引数を省略すると、検索はセル範囲の左上隅のセルの後から開始します。

FindNextのサンプル

Excelシート

このExcelシートから「鈴木」という文字が何行目にあるかをイミディエイトウィンドウに出力するVBAサンプルです。

サンプル1 シンプルなFindNextのサンプル

    Sub ボタン1_Click()
Dim myRange As Range
Dim Result As Range
Dim First As Range
Set myRange = ThisWorkbook.Worksheets("sheet1").Range("A1:A12")
Set Result = myRange.Find("鈴木", , , xlPart)
If Not Result Is Nothing Then
Set First = Result
End If
Do
Set Result = myRange.FindNext(Result)
Debug.Print (Result.Row)
Loop While Result.Address <> First.Address
End Sub

サンプル1の解説

Set myRange = ThisWorkbook.Worksheets("sheet1").Range("A1:A12")

myRangeというRangeオブジェクトに検索範囲を設定しています。

Set Result = myRange.Find("鈴木", , , xlPart)

ResultというRangeオブジェクトにFind関数の結果を格納しています。

    If Not Result Is Nothing Then
Set First = Result
End If

Find関数の検索結果をRangeオブジェクト関数Firstへ格納します。

このFirstがループを抜ける判断基準になります。

    Do
Set Result = myRange.FindNext(Result)
Debug.Print (Result.Row)
Loop While Result.Address <> First.Address

Whileの状態が続くまで処理を繰り返します。

変数ResultにFindNextの検索結果を格納します。

1回目のFindNextのパラメータであるResultにはFind関数結果が格納されていて、2回目のFindNextのパラメータには1回目のFindNextの処理結果が格納されているというように、FindNExtのパラメータには前回の処理結果が格納されています。

このVBAの実行結果は以下のようになります。

VBA記述画面

この処理だとFind関数の戻り値である「2」が最後に出力されています。

上から順に処理結果を表示させたい場合は、次のようにします。

サンプル2 上から順番に検索結果を表示するサンプル

    Sub ボタン1_Click()
Dim Target As Range
Dim FirstResult As Range
Dim CheckResult As Range
Set Target = ThisWorkbook.Worksheets("sheet1").Range("A1:A12")
Set FirstResult = Target.Find("鈴木", , , xlPart)
Debug.Print FirstResult.Row
Set CheckResult = Target.FindNext(FirstResult)
Do While CheckResult.Address <> FirstResult.Address
Debug.Print (CheckResult.Row)
Set CheckResult = Target.FindNext(CheckResult)
Loop
End Sub

サンプル2の解説

サンプル1との違いですが、まずFind関数実行後に検索結果をDebugで出力します。

さらにサンプル1では「Loop」の後ろにあったWhileステートメントを「Do」の後ろへ変更しています。

「Do」の後ろにWhileステートメントを持ってくることで、Find関数で出力した結果を2回出力するのを防ぎます。

繰り返し処理の前に一度FindNext関数を実行しているので、繰り返し処理でFindNext関数を実行する前にDebugをしています。

VBAの実行結果は以下のようになります。

Excel VBA画面

FindNextメソッドはFind関数とセットで使用

 Find関数を継続して検索するのがFindNext関数なので、FindNext関数だけで使用すると、戻り値がNothingとなり検索結果が取得できません。

そのためFindNext関数とFind関数はセットで使うことになります。

最後に

いかがだったでしょうか。

本日はExcelVBAのFindNextについて紹介しました。

指定した検索範囲で全ての検索条件を探したい場合は、Find関数だけでなくFindNextを使用します。

目的によって使い分けてみてください。

www.nanana-blog.com

www.nanana-blog.com

www.nanana-blog.com

www.nanana-blog.com