VBA開発

指定条件のセルを全て抽出する(FindNext/FindPreviousメソッド)【VBA入門】

FindNextメソッド、FindPreviousメソッドは指定した範囲且つ、指定した条件のセルを全て抽出します。
条件に当てはまるセルを、最初の一つだけ抽出する場合はFindメソッドを使用します。

メソッド説明

FindNextメソッド、FindPreviousメソッドの構文は、それぞれ以下のように記載します。

   '■FindNext
    object.FindNext(After)
  
    '■FindPrevious
    object.FindNext(After)
   

引数の一覧は以下です。

引数定数説明省略可否
After検索開始位置可能

注意点

  • FindNextメソッド、FindPreviousメソッド含め、単独で使用できずFindメソッドと併用します。
  • Findメソッドは検索開始セルは一番左上のセルの2つ目からです。1つ目のセルは一番最後に検索します。
    例)検索範囲がA1:A100ならA2から順番に検索し、A100まで検索し終えた後、A1を計算します。
    詳細はこちら
  • 検索結果が0件の場合、「Nothing」が返る為、エラー回避処理は必須
  • Findメソッドを使用すると、エクセル検索ダイアログの設定が書き換えられます。

使い方サンプル

FindNextメソッドサンプル(あいまい検索)

商品名や顧客名などのあいまい検索をするケースが主な使い方です。
(カナ検索など文字を特定しきれないに使用します)

    Dim rng As Range
    Dim target As Range
    Dim firstAddress As String
    Dim msg As String
    
    Set rng = Range("A1:A20")
    Set target = rng.Find(what:="あいうえお", LookAt:=xlWhole, LookIn:=xlValues, MatchCase:=True, MatchByte:=True)

    If target Is Nothing Then
        MsgBox "指定した文字ではヒットしません"
    Else
        '■最初の一致したセルアドレスを覚えておく
        firstAddress = target.Address
           '■DoLoopで繰返し、条件を満たす全てのセルを抽出する
           '■rng.Address = firstAddressとなれば最後まで検索したので抜ける
           Do
                msg = msg & target.Row & "行目" & target.Column  "列目" & vbCrLf
                Set target = rng.FindNext(target)
                If target Is Nothing Then Exit Do
           Loop Until target.Address = firstAddress
        
        MsgBox msg
    End If

FindPreviousメソッドサンプル(あいまい検索)

    Dim rng As Range
    Dim target As Range
    Dim firstAddress As String
    Dim msg As String
    
    Set rng = Range("A1:A20")
    Set target = rng.Find(what:="あいうえお", LookAt:=xlWhole, LookIn:=xlValues, MatchCase:=True, MatchByte:=True)

    If target Is Nothing Then
        MsgBox "指定した文字ではヒットしません"
    Else
        '■最初の一致したセルアドレスを覚えておく
        firstAddress = target.Address
           '■DoLoopで繰返し、条件を満たす全てのセルを抽出する
           '■rng.Address = firstAddressとなれば最後まで検索したので抜ける
           Do
                msg = msg & target.Row & "行目" & target.Column & "列目" & vbCrLf
                Set target = rng.FindPrevious(target)
                If target Is Nothing Then Exit Do
           Loop Until target.Address = firstAddress
        
        MsgBox msg
    End If

結果サンプル

Findメソッドの癖に注意

上記、FindNextとFindPreviousでコード記載の違いは、ほとんどありません。
「次に検索」もしくは「前に検索」の順番が違うだけです。

業務システムで上記処理をする場合はFindNextが多いです。(昇順でやりとりするため)

またFindの引数Afterの設定によっては思い通りの順番に並ばないかもしれません。
その癖に注意しながらプログラムを組む必要があります。

 

 

コメント

タイトルとURLをコピーしました