【Excel VBA】FindNextで複数の検索結果をすべて取得する方法|無限ループを防ぐ書き方

みなさんこんにちは。

Excel VBAのFindを使ってセルを検索すると、同じ値が複数あっても最初の1件しか取得できず、困った経験をしたことがある方も多いかと思います。

そんなときに便利なのがFindNextです。ただし、終了条件を設定しないと同じセルを繰り返し検索してしまいます。

今回は、FindNextで全件検索し、無限ループを防ぐ方法をご紹介します。

この記事はこんな人におすすめ

この記事はこんな人におすすめです!

  • Findで一致するセルを複数取得したい人
  • FindNextの使い方を知りたい人
  • 無限ループを防ぐ終了条件を設定したい人

今回使用するExcelデータ

「Sheet1」のA列に、以下の商品コードを入力してください。「A001」を検索します。

セル商品コード
A1商品コード
A2A001
A3A002
A4A001
A5A003
A6A001
A7A004
A8A002
A9A001
Excel VBAのFindNextで検索するために同じ商品コード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
Excel VBAのFindNextで最初のセルアドレスを比較して無限ループを防止するコード

無限ループを防ぐポイント

FindNextは検索範囲の最後まで進むと、先頭に戻って検索を続けます。そのため、単純なDo~Loopでは処理が終わりません。

最初に見つかったセルのAddressをfirstAddressへ保存しておき、次の検索結果が同じ番地に戻った時点でループを終了します。

また、最初のFindで見つからない場合はNothingを確認して終了します。LookInやLookAtなどの検索条件も明示しておくと安心です。

実行結果

実行するとC列に行番号、D列に商品コードが出力され、A2・A4・A6・A9の4件が取得されます。

Excel VBAのFindNextを使用して商品コードA001に一致する4件の検索結果を取得した画面

過去の記事のご紹介

Findで値が見つからない場合やLookAt・LookInの設定については、

でもご紹介しています。

最後に

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

今回は、FindNextを使用して複数の検索結果をすべて取得する方法についてご紹介しました。

最初のセル番地を保存しておき、同じ場所に戻ったら終了することが重要となります。実務でのデータ検索にも活用してみてください。

少しでも参考になれば幸いです。

開発依頼について

ココナラでWebスクレイピング開発サービスを出品しております。

自分で開発をしようと思ったけど、VBAでのネット記事が少なく困っている方も多いかと思います。

そんな方はいつでもお気軽にご相談ください。

また、本ブログからご依頼いただいた方については割引特典がございますので、

ご不明点と合わせてメッセージをいただけると幸いです。

業務の流れをまるごと自動化します Excel・Web・Teams・SaaSで業務全体を自動化

Webスクレイピング以外にもWebアプリの開発サービスも出品しております。

こちらについても、本ブログからご依頼いただいた方については割引特典がございますので、

お気軽にご相談ください。

スモールスケールのWebアプリ開発します 先ずはスモールスケールのWebアプリから始めませんか?

ご興味がある方はこちら!!

コメントを残す

メールアドレスが公開されることはありません。 ※ が付いている欄は必須項目です

CAPTCHA