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

【VBA】条件に一致する複数行を取得する方法|検索・抽出・処理の実務活用例

Excel業務では「条件に一致する行を複数抽出して処理したい」というニーズが非常に多くあります。
たとえば次のようなケースです。

  • 売上が 100以上の行をすべて取得したい
  • 商品名が「りんご」の 行をまとめて抽出したい
  • 複数条件(例:売上が100以上かつ担当者がAさん)の行を処理したい

この記事では「vba 条件に一致する行を取得 複数」をテーマに、基本から応用までを詳しく解説します。

✅ 条件に一致する複数行を取得する基本の考え方
For EachIf で行を判定する方法
AutoFilter を使って条件一致行を抽出する方法
Find+ループで複数行を検索する方法
✅ 抽出した行を処理する実務サンプル(コピー・削除・色付けなど)
✅ 注意点とエラー対策

✅ 基本の考え方

ExcelVBAで「条件に一致する複数行」を取得する方法は、大きく3つに分けられます。

  1. For Each+If:全行をループして条件判定(シンプルで応用しやすい)
  2. AutoFilter:フィルターをかけて一致行をまとめて扱う(効率的)
  3. 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で複数行を検索

特定の文字列や値を複数回検索する場合は、FindFindNext を利用します。

参考:【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

※削除は後ろからループするのがポイント(前から削除すると行番号がずれて正しく動作しない)


✅ 注意点とエラー対策

  1. FindメソッドはNothing判定が必須
    → 見つからなかった場合に Nothing が返るので判定が必要。
  2. AutoFilterは見えないだけでデータが残る
    → 処理後は AutoFilterMode = False で解除。
  3. 削除処理は逆ループで行う
    → 前から削除すると行番号が変動して意図しない行が消える。
  4. 複数条件は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データの取り込み後の加工や、レポート作成時の条件抽出などにぜひ活用してください。

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