更新日:、 作成日:
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
次のように値が入力されています。
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 個以上の文字 | *AB | AB, 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