Excelで大量データを扱っているときに「複数の条件を満たすセルを探したい」というニーズは非常に多いです。例えば「商品コードがA1001 かつ ステータスが完了」「氏名が山田 かつ 部署が営業」といったように、1つの条件だけではなく2つ以上の条件でデータを探すケースは実務で日常的に発生します。
手作業でフィルターを使えば可能ですが、繰り返し行う処理ならVBAで自動化した方が効率的です。Findメソッドは基本的に「1つの検索条件」に対してセルを返しますが、複数条件を扱うには工夫が必要です。
この記事では「vba find 複数条件」をテーマに、基本の仕組みから実務で使える応用例までを徹底解説します。初心者でも理解できるように、手順を丁寧に説明しながらコード例を紹介します。
目次
✅ Findで複数条件検索を行う基本的な考え方
・Findは1条件しか直接指定できない
Findの構文にはWhat:="検索文字列"を1つだけ指定できます。そのため、複数条件を直接書くことはできません。
・複数条件を実現する方法
- ループ+If文で条件を追加
→ Findでまず大枠を絞り、その後If文で2つ目以降の条件を判定する。
参考:【VBA】For文:特定の条件の場合 次のループへ進む(スキップ)方法 - InStrなど他の関数と組み合わせる
→ Findで大まかに抽出し、部分一致や含有判定を追加。
参考:【VBA】InStr関数で文字列のうしろから特定の文字を検索する方法 - 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
手順
- A列を対象に「山田」を検索。
- 見つかった行に対して、B列の値が「営業」かをIf文で判定。
- 両方の条件を満たした行だけを処理する。
理由
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
実務例
- 商品名に「りんご」を含み、かつ売上数量が100以上。
- コメント欄に「確認要」と含まれ、かつステータスが未完了。
✅ 複数条件で一致セルを処理する実務サンプル
・一致行を別シートにコピー
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 EachやAutoFilterを選ぶ方が効率的なこともある。
✅ 実務での使い分け
- 1条件の高速検索 →
Find - 複数条件+絞り込み →
Find+If - 大量データの複数条件抽出 →
AutoFilter - セル内の詳細位置も必要 →
InStrや正規表現
■ まとめ:Findで複数条件検索を自在に使いこなそう
Findは1条件しか直接指定できないが、If文を組み合わせれば複数条件を判定可能。- 部分一致と条件式を組み合わせることで柔軟な検索ができる。
- 実務では「一致行コピー」「色付け」「件数カウント」といった処理に応用可能。
- 大量データや複雑条件では
AutoFilterの方が効率的。 - 戻り値の
Nothing判定や条件の明示指定を徹底することで安定した処理が可能。
ExcelVBAで複数条件を扱えるようになれば、大量データの中から必要な情報を瞬時に抽出でき、業務効率化が飛躍的に進みます。ぜひ本記事のサンプルを応用し、自分の業務に合った自動化を実現してください。