Excelでデータを扱っているときに「条件に一致するセルを一括で取得したい」という場面は非常に多いです。例えば「売上が100以上のセルをすべて探したい」「商品名に『りんご』を含むセルだけを抽出したい」といったケースです。手作業の検索やフィルターでも対応可能ですが、繰り返しの作業を自動化するならExcelVBAで条件一致セルをまとめて取得するのが効率的です。
この記事では「vba 条件に一致するセルを取得 複数」をテーマに、初心者でも分かりやすい基本の書き方から、実務で役立つ応用サンプルまでを丁寧に解説します。Find、For Each、SpecialCellsなどの手法を比較しながら、最適な選び方も紹介します。
目次
- ✅ 条件一致セルを複数取得する3つの基本アプローチ
- ・Find+FindNextを使う
- ・For Each+Ifを使う
- ・SpecialCellsを使う
- ✅ Find+FindNextで条件一致セルを取得する
- ・基本構文
- ✅ For Each+Ifで条件一致セルを走査する
- ・基本コード
- ✅ SpecialCellsで条件一致セルをまとめて取得
- ・空白セルを取得
- ・数式セルを取得
- ・エラーセルを取得
- ✅ 実務で役立つ応用サンプル集
- ・条件一致セルを色付けする
- ・一致セルを別シートに一覧出力
- ・一致セルの行全体をコピー
- ・一致セルの件数をカウント
- ✅ 条件一致セル取得での注意点
- ✅ 条件一致セル取得の使い分け方
- ■ まとめ:条件一致セルを複数取得して業務を効率化しよう
✅ 条件一致セルを複数取得する3つの基本アプローチ
・Find+FindNextを使う
Excelの検索機能を呼び出す方法で、高速かつ効率的。複数セルを探す場合はFindNextを組み合わせます。
・For Each+Ifを使う
セルを順番に走査し、条件を判定する方法。処理はやや遅いですが複雑条件に強いです。
・SpecialCellsを使う
空白やエラーなどExcelが持つ特殊条件に基づいて一括でセルを取得できます。
✅ Find+FindNextで条件一致セルを取得する
・基本構文
Sub FindMultipleCells()
    Dim rng As Range
    Dim firstAddress As String
    
    With Range("A1:A100")
        Set rng = .Find("りんご", LookAt:=xlPart)
        If Not rng Is Nothing Then
            firstAddress = rng.Address
            Do
                Debug.Print "ヒット:" & rng.Address & " 値=" & rng.Value
                Set rng = .FindNext(rng)
            Loop While Not rng Is Nothing And rng.Address <> firstAddress
        End If
    End With
End Sub
手順
- 検索範囲を指定(例:A1:A100)。
- Findで検索語を指定。
- 最初の一致セルのアドレスを保存。
- FindNextで次の一致セルを順に取得。
- 最初のセルに戻ったら終了。
実務例
- 顧客名リストから「山田」を含む全セルを抽出。
- ステータス列から「未処理」のセルだけを探す。
✅ For Each+Ifで条件一致セルを走査する
・基本コード
Sub LoopCheckCells()
    Dim c As Range
    For Each c In Range("B2:B100")
        If c.Value >= 100 Then
            Debug.Print "条件一致:" & c.Address & " 値=" & c.Value
        End If
    Next c
End Sub
手順
- 範囲内のセルを1つずつループ。
- Ifで条件判定(例:100以上)。
- 一致すれば処理を実行。
利点
- 柔軟な条件式を追加できる。
- 複数列の値を組み合わせた判定も可能。
実務例
- 「商品名がりんご かつ 売上が100以上」のセルを抽出。
- 「日付が本日 かつ ステータスが未処理」のセルをチェック。
✅ SpecialCellsで条件一致セルをまとめて取得
・空白セルを取得
Sub GetBlanks()
    Dim rng As Range
    On Error Resume Next
    Set rng = Range("A1:A100").SpecialCells(xlCellTypeBlanks)
    On Error GoTo 0
    
    If Not rng Is Nothing Then
        rng.Select
        MsgBox "空白セルを選択しました"
    End If
End Sub
参考:【VBA】特定のセル(空白セル・数式セル・エラーセル)を見つけ出す:SpecialCells メソッド・数式セルを取得
Range("A1:A100").SpecialCells(xlCellTypeFormulas).Interior.Color = vbYellow
・エラーセルを取得
Range("A1:A100").SpecialCells(xlCellTypeFormulas, xlErrors).Interior.Color = vbRed
利点
- 一括でセルを取得でき、処理が非常に速い。
- エラーや空白チェックに強い。
✅ 実務で役立つ応用サンプル集
・条件一致セルを色付けする
Sub HighlightCells()
    Dim c As Range
    For Each c In Range("B2:B100")
        If InStr(c.Value, "限定") > 0 Then
            c.Interior.Color = vbYellow
        End If
    Next c
End Sub
参考:【VBA】条件に一致するセルを取得する方法|Find・For Each・SpecialCells・一致セルを別シートに一覧出力
Sub ExportMatches()
    Dim c As Range, wsOut As Worksheet
    Dim r As Long
    Set wsOut = Sheets("抽出結果")
    r = 1
    
    For Each c In Range("A2:A100")
        If c.Value = "重要" Then
            wsOut.Cells(r, 1).Value = c.Value
            wsOut.Cells(r, 2).Value = c.Address
            r = r + 1
        End If
    Next c
End Sub
参考:【VBA】オートフィルターに複数条件を設定する方法|業務効率を劇的に上げるフィルター自動化・一致セルの行全体をコピー
Sub CopyMatchedRows()
    Dim rng As Range, firstAddress As String, wsOut As Worksheet
    Dim r As Long
    Set wsOut = Sheets("結果")
    r = 1
    
    With Range("A1:A100")
        Set rng = .Find("確認", LookAt:=xlPart)
        If Not rng Is Nothing Then
            firstAddress = rng.Address
            Do
                rng.EntireRow.Copy wsOut.Rows(r)
                r = r + 1
                Set rng = .FindNext(rng)
            Loop While Not rng Is Nothing And rng.Address <> firstAddress
        End If
    End With
End Sub
参考:【VBA】特定の文字を含む行の処理:検索・削除・別シートにコピー・一致セルの件数をカウント
Sub CountMatches()
    Dim c As Range, cnt As Long
    cnt = 0
    For Each c In Range("B2:B100")
        If c.Value >= 200 Then
            cnt = cnt + 1
        End If
    Next c
    MsgBox "条件に一致するセル数:" & cnt
End Sub
✅ 条件一致セル取得での注意点
- Nothing判定を必ず入れる- Findで一致がなければNothingを返すため、エラー回避に必須。
 参考:【VBA】Findの戻り値を理解する方法|Nothing判定と実務での活用例を解説
 
- Findで一致がなければ
- 部分一致と完全一致の違いを理解する- LookAt:=xlPartと- LookAt:=xlWholeで挙動が変わる。
 参考:【VBA】特定の文字を含む行の処理:検索・削除・別シートにコピー
 
- SpecialCellsは対象がないとエラー- On Error Resume Nextでエラーを回避し、判定後に処理する。
 参考:【VBA】特定のセル(空白セル・数式セル・エラーセル)を見つけ出す:SpecialCells メソッド
 
- 処理速度を考慮する- 数万行規模のデータではFindが高速。
- 複雑条件はFor Eachが柔軟。
- 空白やエラーはSpecialCellsが効率的。
 
- 数万行規模のデータでは
✅ 条件一致セル取得の使い分け方
- 高速検索したい場合 → Find
- 複雑条件で判定したい場合 → For Each+If
- 空白やエラーをまとめて処理したい場合 → SpecialCells
実務ではこれらを組み合わせて使うのが効果的です。
■ まとめ:条件一致セルを複数取得して業務を効率化しよう
- Find+FindNextで高速に複数セルを取得できる。
- For Each+Ifは柔軟で複雑条件に対応可能。
- SpecialCellsは空白やエラーなど特定条件のセルを一括取得できる。
- 実務では「色付け」「コピー」「件数カウント」と組み合わせると便利。
- Nothing判定やエラー処理を組み込むことで安定したコードになる。
ExcelVBAで条件一致セルを複数取得する方法をマスターすれば、大量データから必要な情報を素早く抽出でき、日常業務の効率化に大きく役立ちます。ぜひ本記事のサンプルを活用して、自分の業務に合った自動化を実現してみてください。