Excel業務では「条件に一致する行を複数抽出して処理したい」というニーズが非常に多くあります。
たとえば次のようなケースです。
- 売上が 100以上の行をすべて取得したい
- 商品名が「りんご」の 行をまとめて抽出したい
- 複数条件(例:売上が100以上かつ担当者がAさん)の行を処理したい
この記事では「vba 条件に一致する行を取得 複数」をテーマに、基本から応用までを詳しく解説します。
✅ 条件に一致する複数行を取得する基本の考え方
✅ For Each+If で行を判定する方法
✅ AutoFilter を使って条件一致行を抽出する方法
✅ Find+ループで複数行を検索する方法
✅ 抽出した行を処理する実務サンプル(コピー・削除・色付けなど)
✅ 注意点とエラー対策
目次
✅ 基本の考え方
ExcelVBAで「条件に一致する複数行」を取得する方法は、大きく3つに分けられます。
- For Each+If:全行をループして条件判定(シンプルで応用しやすい)
- AutoFilter:フィルターをかけて一致行をまとめて扱う(効率的)
- Find+FindNext:特定の値を検索して一致行をループ(高速)
それぞれの特徴を理解して使い分けるのがポイントです。
✅ For Each+Ifで複数行を判定する
最も直感的な方法は、対象範囲をループし、条件に合うかどうかを If で判定する方法です。
参考:【VBA】For Each ステートメントの使い方と活用例
・ 基本構文
Dim i As Long
For i = 2 To 100
If Cells(i, 2).Value >= 100 Then
Debug.Print "一致行:" & i & " 行目"
End If
Next i
・ 例:商品名が「りんご」の行を取得
Sub GetAppleRows()
Dim i As Long
For i = 2 To 100
If Cells(i, 1).Value = "りんご" Then
Debug.Print "ヒット:" & i & " 行目"
End If
Next i
End Sub
✅ AutoFilterで条件一致行をまとめて取得する
Excel標準のオートフィルター機能をVBAから利用する方法です。大量データでも効率的に処理できます。
参考:【VBA】複数列にフィルターをかける方法|応用例・エラー対策も解説
・ 基本構文
Range("A1:B100").AutoFilter Field:=2, Criteria1:=">=100"
この場合、B列(2列目)が100以上の行だけが表示されます。
・ 例:条件一致行を別シートにコピー
Sub CopyFilteredRows()
Dim ws As Worksheet
Set ws = ThisWorkbook.Sheets("データ")
ws.Range("A1:B100").AutoFilter Field:=2, Criteria1:=">=100"
ws.Range("A1:B100").SpecialCells(xlCellTypeVisible).Copy _
ThisWorkbook.Sheets("抽出結果").Range("A1")
ws.AutoFilterMode = False
End Sub
- フィルター後に
SpecialCells(xlCellTypeVisible)を使うことで一致行だけコピー可能 - 最後に
AutoFilterMode = Falseでフィルター解除
✅ Find+FindNextで複数行を検索
特定の文字列や値を複数回検索する場合は、Find+FindNext を利用します。
参考:【VBA】条件に一致するセルを取得する方法|Find・For Each・SpecialCells
・ 例:列Aから「りんご」を検索して複数行を取得
Sub FindMultiple()
Dim rng As Range
Dim firstAddress As String
With Range("A2:A100")
Set rng = .Find(What:="りんご", LookAt:=xlWhole)
If Not rng Is Nothing Then
firstAddress = rng.Address
Do
Debug.Print "一致行:" & rng.Row
Set rng = .FindNext(rng)
Loop While Not rng Is Nothing And rng.Address <> firstAddress
End If
End With
End Sub
✅ 抽出した行を処理する実務サンプル
・ 条件一致行を色付けする
Sub HighlightRows()
Dim i As Long
For i = 2 To 100
If Cells(i, 2).Value >= 200 Then
Rows(i).Interior.Color = vbYellow
End If
Next i
End Sub
・ 条件一致行を別シートへコピー
Sub CopyRows()
Dim i As Long, rowOut As Long
rowOut = 1
For i = 2 To 100
If Cells(i, 1).Value = "重要" Then
Rows(i).Copy Destination:=Sheets("抽出結果").Rows(rowOut)
rowOut = rowOut + 1
End If
Next i
End Sub
・ 条件一致行を削除
Sub DeleteRows()
Dim i As Long
For i = 100 To 2 Step -1
If Cells(i, 2).Value < 50 Then
Rows(i).Delete
End If
Next i
End Sub
※削除は後ろからループするのがポイント(前から削除すると行番号がずれて正しく動作しない)
✅ 注意点とエラー対策
- FindメソッドはNothing判定が必須
→ 見つからなかった場合にNothingが返るので判定が必要。 - AutoFilterは見えないだけでデータが残る
→ 処理後はAutoFilterMode = Falseで解除。 - 削除処理は逆ループで行う
→ 前から削除すると行番号が変動して意図しない行が消える。 - 複数条件はIf文やCriteria配列で対応
→If Cells(i,1)="りんご" And Cells(i,2)>=100 Then ...
→AutoFilter Field:=2, Criteria1:=">=100", Operator:=xlAnd, Criteria2:="<=200"
■ まとめ
ExcelVBAで「条件に一致する複数行を取得」する方法は大きく3つに分けられます。
- For Each+If … 柔軟でわかりやすい、複雑条件向け
- AutoFilter … 大量データを効率的に抽出可能
- Find+FindNext … 高速な検索処理に最適
さらに「色付け」「コピー」「削除」などと組み合わせれば、実務に直結する自動化マクロを構築できます。
CSVデータの取り込み後の加工や、レポート作成時の条件抽出などにぜひ活用してください。