【Excel VBA】FindNextで順番通りに検索結果を表示する方法
こんばんは。
nanana-blog管理人のナナナです。
ブログを訪問し記事を読んでいただきありがとうございます。
ExcelのFindNextメソッドをご存知でしょうか。
Findメソッドは検索範囲の1番最初しか検索できませんが、FindNextメソッドを使用すると、検索条件に一致するセルを全て検索することができます。
本日はExcelVBAのFindNextメソッドをサンプルを使って紹介します。
FindNextの構文
Range.FindNext(After)
「Range」は検索範囲のRangeオブジェクトを指定します。
ここで指定された検索範囲を検索していきます。
名前 | 内容 |
---|---|
After | 指定したセルの下方 (行のときは右、列のときは下) のセルから検索を開始します。 検索は指定したセルの次のセルから始まるので、指定したセル自体は、範囲全体が一度検索されるまで検索されません。 この引数を省略すると、検索はセル範囲の左上隅のセルの後から開始します。 |
FindNextのサンプル
この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の実行結果は以下のようになります。
この処理だと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の実行結果は以下のようになります。
FindNextメソッドはFind関数とセットで使用
Find関数を継続して検索するのがFindNext関数なので、FindNext関数だけで使用すると、戻り値がNothingとなり検索結果が取得できません。
そのためFindNext関数とFind関数はセットで使うことになります。
最後に
いかがだったでしょうか。
本日はExcelVBAのFindNextについて紹介しました。
指定した検索範囲で全ての検索条件を探したい場合は、Find関数だけでなくFindNextを使用します。
目的によって使い分けてみてください。