VBAで自動化 VBA一覧 抽出・検索処理 検索・Findメソッド

【VBA】Findを使って複数条件で検索する方法|実務で役立つ応用サンプル

Excelで大量データを扱っているときに「複数の条件を満たすセルを探したい」というニーズは非常に多いです。例えば「商品コードがA1001 かつ ステータスが完了」「氏名が山田 かつ 部署が営業」といったように、1つの条件だけではなく2つ以上の条件でデータを探すケースは実務で日常的に発生します。

手作業でフィルターを使えば可能ですが、繰り返し行う処理ならVBAで自動化した方が効率的です。Findメソッドは基本的に「1つの検索条件」に対してセルを返しますが、複数条件を扱うには工夫が必要です。

この記事では「vba find 複数条件」をテーマに、基本の仕組みから実務で使える応用例までを徹底解説します。初心者でも理解できるように、手順を丁寧に説明しながらコード例を紹介します。

✅ Findで複数条件検索を行う基本的な考え方

・Findは1条件しか直接指定できない

Findの構文にはWhat:="検索文字列"を1つだけ指定できます。そのため、複数条件を直接書くことはできません。

・複数条件を実現する方法

  1. ループ+If文で条件を追加
    → Findでまず大枠を絞り、その後If文で2つ目以降の条件を判定する。
    参考:【VBA】For文:特定の条件の場合 次のループへ進む(スキップ)方法
  2. InStrなど他の関数と組み合わせる
    → Findで大まかに抽出し、部分一致や含有判定を追加。
    参考:【VBA】InStr関数で文字列のうしろから特定の文字を検索する方法
  3. AutoFilterやループで代替する
    → Findにこだわらず、行全体のチェックを行う。
    参考:【VBA】オートフィルターに複数条件を設定する方法|業務効率を劇的に上げるフィルター自動化

✅ FindとIf文を組み合わせる方法

・基本コード例

Sub FindWithMultipleConditions()
    Dim rng As Range
    Dim firstAddress As String
    
    With Range("A1:C100")
        Set rng = .Find(What:="山田", LookAt:=xlWhole)
        If Not rng Is Nothing Then
            firstAddress = rng.Address
            Do
                ' 2つ目の条件:B列の値が「営業」
                If rng.Offset(0, 1).Value = "営業" Then
                    Debug.Print "一致行:" & rng.EntireRow.Address
                End If
                Set rng = .FindNext(rng)
            Loop While Not rng Is Nothing And rng.Address <> firstAddress
        End If
    End With
End Sub

手順

  1. A列を対象に「山田」を検索。
  2. 見つかった行に対して、B列の値が「営業」かをIf文で判定。
  3. 両方の条件を満たした行だけを処理する。

理由

Find自体は1条件しか指定できませんが、If文を組み合わせることで実質的に複数条件を判定できます。
参考:【VBA】IF文での複数条件の考え方と書き方のコツ


✅ 部分一致+複数条件の例

・コード例

Sub FindPartialMultipleConditions()
    Dim rng As Range
    Dim firstAddress As String
    
    With Range("A1:D100")
        Set rng = .Find(What:="りんご", LookAt:=xlPart)
        If Not rng Is Nothing Then
            firstAddress = rng.Address
            Do
                ' C列の値が100以上かどうかをチェック
                If rng.Offset(0, 2).Value >= 100 Then
                    Debug.Print "ヒット:" & rng.Address & " 値=" & rng.Value
                End If
                Set rng = .FindNext(rng)
            Loop While Not rng Is Nothing And rng.Address <> firstAddress
        End If
    End With
End Sub

実務例


✅ 複数条件で一致セルを処理する実務サンプル

・一致行を別シートにコピー

Sub CopyRowsMultipleConditions()
    Dim rng As Range, wsOut As Worksheet
    Dim firstAddress As String, r As Long
    
    Set wsOut = Sheets("抽出結果")
    r = 1
    
    With Range("A1:C100")
        Set rng = .Find("山田", LookAt:=xlWhole)
        If Not rng Is Nothing Then
            firstAddress = rng.Address
            Do
                If rng.Offset(0, 1).Value = "営業" And rng.Offset(0, 2).Value >= 100 Then
                    rng.EntireRow.Copy wsOut.Rows(r)
                    r = r + 1
                End If
                Set rng = .FindNext(rng)
            Loop While Not rng Is Nothing And rng.Address <> firstAddress
        End If
    End With
End Sub

・一致セルを色付け

Sub HighlightMultipleConditions()
    Dim rng As Range, firstAddress As String
    With Range("A1:C100")
        Set rng = .Find("完了", LookAt:=xlWhole)
        If Not rng Is Nothing Then
            firstAddress = rng.Address
            Do
                If rng.Offset(0, 1).Value = "優先" Then
                    rng.Interior.Color = vbYellow
                End If
                Set rng = .FindNext(rng)
            Loop While Not rng Is Nothing And rng.Address <> firstAddress
        End If
    End With
End Sub

✅ FindではなくAutoFilterを使う選択肢

Findで複数条件を扱うのが複雑な場合、AutoFilterを使うとシンプルに記述できます。

Sub FilterMultipleConditions()
    Range("A1:C100").AutoFilter Field:=1, Criteria1:="山田"
    Range("A1:C100").AutoFilter Field:=2, Criteria1:="営業"
    
    Range("A1:C100").SpecialCells(xlCellTypeVisible).Copy Sheets("抽出結果").Range("A1")
    ActiveSheet.AutoFilterMode = False
End Sub

大量データを扱う場合はこちらの方が高速です。


✅ よくあるトラブルと解決法

・Nothingが返る

検索範囲に値が存在しない、スペースが含まれている、型が違うなどの可能性。
→ Trimや型変換を活用。
参考:【VBA】シート全体のスペースを削除する方法:Trim 関数・Replace 関数

・前回の検索条件が引き継がれる

Findは条件を保持するため、毎回引数を明示的に指定する。

・処理速度が遅い

複雑条件ではFor EachAutoFilterを選ぶ方が効率的なこともある。


✅ 実務での使い分け

  • 1条件の高速検索Find
  • 複数条件+絞り込みFindIf
  • 大量データの複数条件抽出AutoFilter
  • セル内の詳細位置も必要InStrや正規表現

■ まとめ:Findで複数条件検索を自在に使いこなそう

  • Findは1条件しか直接指定できないが、If文を組み合わせれば複数条件を判定可能。
  • 部分一致と条件式を組み合わせることで柔軟な検索ができる。
  • 実務では「一致行コピー」「色付け」「件数カウント」といった処理に応用可能。
  • 大量データや複雑条件ではAutoFilterの方が効率的。
  • 戻り値のNothing判定や条件の明示指定を徹底することで安定した処理が可能。

ExcelVBAで複数条件を扱えるようになれば、大量データの中から必要な情報を瞬時に抽出でき、業務効率化が飛躍的に進みます。ぜひ本記事のサンプルを応用し、自分の業務に合った自動化を実現してください。

    -VBAで自動化, VBA一覧, 抽出・検索処理, 検索・Findメソッド