Home > 即効テクニック > Excel VBA > セル操作関連のテクニック > 条件に当てはまるセルを検索する(Find/FindNext/FindPreviousメソッド)

即効テクニック

セル操作関連のテクニック

条件に当てはまるセルを検索する(Find/FindNext/FindPreviousメソッド)

(Excel 2000)
セル範囲の中から指定した条件に当てはまるセルを検索します。条件に当てはまるセルが複数ある場合に、見つかったセルの次のセルを検索するのにFindNextメソッドとFindPreviousメソッドを使用します。引数がたくさんありますが、[編集]-[検索]でセルを検索するときに指定する内容とほぼ同じです。なお、条件に当てはまるセルが存在しない場合には、Nothingを返します。

 構文  Object.Find(What, After, LookIn, LookAt, SearchOrder, 
                    SearchDirection, MatchCase, MatchByte)
        Object.FindNext(After)
        Object.FindPrevious(After)

設定項目        内容
Object          Rangeオブジェクト
What           検索するデータを指定 [省略不可]
After          検索を開始する単一のセルを指定 [省略可能]
LookIn          検索の対象を指定 数式(xlFormulas)、値(xlValues)、
                コメント(xlComments) [省略可能]
LookAt         完全に同一なセルだけを検索(xlWhole)、
                一部分でも一致するセルの検索(xlPart) [省略可能]
SeachOrder     検索方向を指定します。列方向に検索する(xlByColumns)、
                行方向に検索する(xlByRows) [省略可能]
SearchDirection 前方に検索(xlNext:規定値)、後方に検索(xlPrevious)[省略可能]
MatchCase      大文字と小文字を区別する(True)、区別しない(False) [省略可能]
MatchByte      半角と全角を区別する(True)、区別しない(True) [省略可能]

次のサンプルは、Lookat:=xlPartと指定することであいまい検索を行い、指定したキーワードを含むレコードをデータベースから検索し、その結果を別シートに転記するものです。
●サンプル●
Sub FindSamp1()

 Dim c As Range
 Dim firstAddress As String

 With Worksheets("DataBase").UsedRange.Columns(1)  '---DataBaseの1列目が対象
     Set c = .Find(What:=Range("B1").Value, LookIn:=xlValues, _
         LookAt:=xlPart)       '---cに検索結果を格納
     If Not c Is Nothing Then    '---条件に当てはまるセルがあれば
        firstAddress = c.Address   '---最初のセルのアドレスを覚える
        Do                     '---do...Loopステートメント
            c.Resize(, 3).Copy Destination:= _
               Range("A65536").End(xlUp).Offset(1)  '---情報のコピー
            Set c = .FindNext(c)   '---今見つけたセルから次のセルを検索
        Loop While Not c Is Nothing And _
               c.Address <> firstAddress  '----条件に当てはまる全てを検索
      End If
 End With

End Sub
この場合、検索の条件は「アクティブシートのセルB1の値と同じ値を一部でも含むセル」ということになります。このようにWithステートメント、Setステートメント、FindNextメソッド、Do...Loopステートメントをうまく使い、条件を満たすセルを全て見つけた時点で検索処理を終了させることが、Findメソッドを使用して検索を繰り替えすコードを書く際のポイントです。
また、あいまい検索の方法として、引数Whatに「*, ?」といったワイルドカードを使用することも可能です。

●注意●
引数のうち、LookIn、LookAt、SearchOrder、MatchByte、MatchCaseは、指定を省略した場合には前回処理で使用された値を使用します。つまり、マクロ実行前に行われた検索処理の条件を引き継いでしまいますので、省略時の規定値が保証されていないということになります。前回の検索処理には手動作による検索も含まれます。引数で指定する条件によって検索結果が異なることが懸念される場合には、引数は省略せずに記述するようにしてください。