【Excel VBA】FindNextで複数の検索結果をすべて取得する方法|無限ループを防ぐ書き方
みなさんこんにちは。
Excel VBAのFindを使ってセルを検索すると、同じ値が複数あっても最初の1件しか取得できず、困った経験をしたことがある方も多いかと思います。
そんなときに便利なのがFindNextです。ただし、終了条件を設定しないと同じセルを繰り返し検索してしまいます。
今回は、FindNextで全件検索し、無限ループを防ぐ方法をご紹介します。
この記事はこんな人におすすめ
この記事はこんな人におすすめです!
- Findで一致するセルを複数取得したい人
- FindNextの使い方を知りたい人
- 無限ループを防ぐ終了条件を設定したい人
今回使用するExcelデータ
「Sheet1」のA列に、以下の商品コードを入力してください。「A001」を検索します。
| セル | 商品コード |
|---|---|
| A1 | 商品コード |
| A2 | A001 |
| A3 | A002 |
| A4 | A001 |
| A5 | A003 |
| A6 | A001 |
| A7 | A004 |
| A8 | A002 |
| A9 | A001 |

FindNextで一致するデータをすべて取得する
以下のコードでは、Findで最初のセルを取得し、FindNextで次の一致セルを順番に探します。結果はC列とD列へ出力します。
Sub FindNextAll()
Dim ws As Worksheet
Dim targetRange As Range
Dim foundCell As Range
Dim firstAddress As String
Dim outputRow As Long
' 検索範囲と出力先を設定する
Set ws = ThisWorkbook.Worksheets("Sheet1")
Set targetRange = ws.Range("A2:A9")
ws.Range("C1:D10").ClearContents
ws.Range("C1").Value = "行番号"
ws.Range("D1").Value = "商品コード"
outputRow = 2
' Findで最初の一致セルを取得する
Set foundCell = targetRange.Find( _
What:="A001", _
After:=targetRange.Cells(targetRange.Count), _
LookIn:=xlValues, _
LookAt:=xlWhole, _
SearchOrder:=xlByRows, _
SearchDirection:=xlNext, _
MatchCase:=False, _
MatchByte:=False, _
SearchFormat:=False)
'見つからない場合は処理を終了する
If foundCell Is Nothing Then
MsgBox "該当するデータがありません。"
Exit Sub
End If
' 最初のセル番地を保存して全件検索する
firstAddress = foundCell.Address
Do
'一致したセルの行番号と値を出力する
ws.Cells(outputRow, "C").Value = foundCell.Row
ws.Cells(outputRow, "D").Value = foundCell.Value
outputRow = outputRow + 1
'同じ条件で次の一致セルを取得する
Set foundCell = targetRange.FindNext(After:=foundCell)
'次のセルが取得できない場合は終了する
If foundCell Is Nothing Then Exit Do
'最初のセルに戻ったら終了する
Loop While foundCell.Address <> firstAddress
MsgBox outputRow - 2 & "件見つかりました。", vbInformation
End Sub

無限ループを防ぐポイント
FindNextは検索範囲の最後まで進むと、先頭に戻って検索を続けます。そのため、単純なDo~Loopでは処理が終わりません。
最初に見つかったセルのAddressをfirstAddressへ保存しておき、次の検索結果が同じ番地に戻った時点でループを終了します。
また、最初のFindで見つからない場合はNothingを確認して終了します。LookInやLookAtなどの検索条件も明示しておくと安心です。
実行結果
実行するとC列に行番号、D列に商品コードが出力され、A2・A4・A6・A9の4件が取得されます。

過去の記事のご紹介
Findで値が見つからない場合やLookAt・LookInの設定については、
でもご紹介しています。
最後に
いかがでしたでしょうか。
今回は、FindNextを使用して複数の検索結果をすべて取得する方法についてご紹介しました。
最初のセル番地を保存しておき、同じ場所に戻ったら終了することが重要となります。実務でのデータ検索にも活用してみてください。
少しでも参考になれば幸いです。
開発依頼について
ココナラでWebスクレイピング開発サービスを出品しております。
自分で開発をしようと思ったけど、VBAでのネット記事が少なく困っている方も多いかと思います。
そんな方はいつでもお気軽にご相談ください。
また、本ブログからご依頼いただいた方については割引特典がございますので、
ご不明点と合わせてメッセージをいただけると幸いです。
業務の流れをまるごと自動化します Excel・Web・Teams・SaaSで業務全体を自動化Webスクレイピング以外にもWebアプリの開発サービスも出品しております。
こちらについても、本ブログからご依頼いただいた方については割引特典がございますので、
お気軽にご相談ください。
スモールスケールのWebアプリ開発します 先ずはスモールスケールのWebアプリから始めませんか?
