更新日:、 作成日:

VBA セルを複数条件で検索する

はじめに

Excel VBA マクロのセルを複数条件で検索する方法を紹介します。

セルの範囲をループして And でも Or でも複数条件で検索できます。

条件に一致したセルの値を編集したり、書式を設定できます。

セルを検索するには「セルを検索する」をご覧ください。
セルを範囲指定するすべての方法は「セルを範囲指定して取得する」をご覧ください。

セルを複数条件で検索する

この方法は処理を説明するために記載している遅い処理です。高速に処理するためには下記の「高速に複数条件で検索する」をご覧ください。

Range の引数にセル名を指定すると、セルの範囲を指定できます。

For Each に Range を指定すると範囲内の全てのセルを参照できます。

セル「A1」~「B2」を検索するには For Each c In Range("A1:B2") のように入力します。

Dim c As Range
For Each c In Range("A1:B2")
    Debug.Print(c.Address)
    ' $A$1
    ' $B$1
    ' $A$2
    ' $B$2
Next

次のように値が入力されています。

1

B 列が ABC で、C 列が あいう の A 列の値を取得するには次のようにします。

Dim c As Range
For Each c In Range("B1:B4")
    ' 第一条件
    If c.Value <> "ABC" Then
        GoTo Continue
    End If
    ' 第二条件
    If c.Offset(0, 1).Value <> "あいう" Then ' Offset(0, 1) は 1 つ右のセル (C 列のセル) を取得している
        GoTo Continue
    End If

    Dim aValue As String
    aValue = c.Offset(0, -1).Value ' A 列の値を取得
    Debug.Print(aValue)

Continue:
Next

このようにセルの範囲をループして If 文で条件を追加すれば、複数条件で検索ができます。

Offset は指定のセルから移動した位置のセルを取得できます。

セルや範囲を取得する方法は「セルを範囲指定して取得する」で紹介しています。

セルに指定した文字が含まれているかどうかは「InStr 関数」を使用します。

Like 演算子を使ってワイルドカードでも判定できます。

パターン 説明 使用例 一致例
?任意の 1 文字あい?あいう, あいか, あいも
*0 個以上の文字*ABAB, 0AB, 10AB
#任意の 1 桁 (0–9)##10, 22, 59
[charlist]charlist に含まれる任意の 1 文字[A-C]
[A, H, L]?
A, B, C
A1, H2, L3
[!charlist]charlist に含まれない任意の 1 文字[!A-C]
[!A, B, C]?
D, E, F
[パターン]パターンの文字 ? * # [ ] と比較する[*]?*あ, *い, *A
Dim b As Boolean
b = "あいうえお" Like "う*" ' "う" で始まるか
b = "あいうえお" Like "?い" ' "い" の前に一文字あるか
b = 12 Like "##" ' 2 桁の数字か
b = "AZZ" Like "[A-C]*" ' A ~ C の文字で始まるか
b = "AZZ" Like "[!A-C]*" ' A ~ C 以外の文字で始まるか
Debug.Print(b)

高速に複数条件で検索する

上記の方法はセルの値を何度も取得または設定しているので、セルの数が多くなるほど遅くなります。

詳しくは「高速化」をご覧ください。

高速に処理するためにはセルの範囲を二次元配列で取得し、それを編集して二次元配列をセルの範囲に設定します。また書式を設定するときも、セルの範囲にまとめて設定します。

Dim c As Range
Set c = Range("A1:C5")

Dim values As Variant
values = c.Value ' (1 To Rows.Count, 1 To Columns.Count) の二次元配列で値を取得

Dim formatCells As Range ' 書式を設定するための条件に一致したセル

Dim row As Long
Dim column As Long

' セルを Z 方向に検索
For row = 1 To c.Rows.Count
    For column = 1 To c.Columns.Count
        
        ' 複数条件
        Dim value As Variant
        value = values(row, column)
        If Not (value = 条件1 And value = 条件2) Then ' And
            GoTo Continue
        End If
        If Not (value = 条件1 Or value = 条件2) Then ' Or
            GoTo Continue
        End If

        ' 複数条件に一致している
        values(row, column) = "一致" ' 値を編集
        
        ' 書式を編集するためにセルを収集
        If formatCells Is Nothing Then
            Set formatCells = c.Cells(row, column)
        Else
            Set formatCells = Union(formatCells, c.Cells(row, column))
        End If
        
Continue:
    Next
Next

' 値をまとめて設定
c.Value = values

' 書式をまとめて設定
If Not formatCells Is Nothing Then
    With formatCells
        .Font.Color = RGB(255, 0, 0)
        .Interior.ColorIndex = 35
    End With
End If