Sub TEST4()
For i = 2 To 13
'商品がA、D、G以外の場合
If Cells(i, "A") <> "A" And Cells(i, "A") <> "D" And Cells(i, "A") <> "G" Then
Cells(i, "C") = "〇" '作業列に印をつける
End If
Next
'作業列でフィルタ
Range("A1").AutoFilter 3, "〇"
End Sub
表を用意しておきます。
表を用意
では、VBAコードを実行してみます。
「AとDとG」以外をフィルタ
「AとDとG」以外をフィルタできました。
こんな感じで、作業列を使えば、標準の機能以外のフィルタもできます。
他の例もやってみます。
2つの列を「OR」でフィルタ
2つの列を「OR」でフィルタする、というのをやってみます。
下記の条件を「OR」でフィルタします。
商品が「A、DもしくはG」
支店が「東京もしくは福岡」
VBAコードは、こんな感じになります。
Sub TEST5()
For i = 2 To 13
'商品がA、DもしくはGの場合
If Cells(i, "A") = "A" Or Cells(i, "A") = "D" Or Cells(i, "A") = "G" Then
Cells(i, "D") = "〇"
End If
'支店が東京もしくは福岡の場合
If Cells(i, "B") = "東京" Or Cells(i, "B") = "福岡" Then
Cells(i, "D") = "〇"
End If
Next
'作業列でフィルタ
Range("A1").AutoFilter 4, "〇"
End Sub
表を用意しておきます。
表を用意
では、VBAコードを実行してみます。
2つの列を「OR」でフィルタ
2つの列を「OR」でフィルタできました。
もうちょい複雑なものでやってみます。
3つの列の条件でフィルタ
3つの列の条件でフィルタしてみます。
価格が「500以上」
で、下記の「OR」条件でフィルタします。
商品が「A、DもしくはG」
支店が「東京もしくは福岡」
これも、作業列を使えば簡単にフィルタできます。
Sub TEST6()
For i = 2 To 13
'価格が「800以上」の場合
If Cells(i, "C") >= 800 Then
'商品がA、DもしくはGの場合
If Cells(i, "A") = "A" Or Cells(i, "A") = "D" Or Cells(i, "A") = "G" Then
Cells(i, "D") = "〇"
End If
'支店が東京もしくは福岡の場合
If Cells(i, "B") = "東京" Or Cells(i, "B") = "福岡" Then
Cells(i, "D") = "〇"
End If
End If
Next
'作業列でフィルタ
Range("A1").AutoFilter 4, "〇"
End Sub
Sub TEST7()
'最終行までループ
For i = 2 To Cells(Rows.Count, "A").End(xlUp).Row
'商品がA、D、G以外の場合
If Cells(i, "A") <> "A" And Cells(i, "A") <> "D" And Cells(i, "A") <> "G" Then
Cells(i, "C") = "〇"
End If
Next
'作業列でフィルタ
Range("A1").AutoFilter 3, "〇"
End Sub
表を用意しておきます。
表を用意
では、VBAコードを実行してみます。
最終行までループしてフィルタ
「AとDとG」以外でフィルタできました。
最終行までループしてフィルタできています。
配列を使って高速化する
もう一つのポイントは、「配列」を使って高速化することです。
作業列を使う場合は、セルに値を入力する必要があります。
Excelの中では、「セルに値を入力」する作業に時間がかかってしまいます。
なので、配列を使って「一括で」入力すると高速化できます。
配列を使って高速化
配列を使って高速化するには、先に配列を作成しておきます。
「ReDim X(1 To LastRow, 1 To 1)」で最終行までの配列を作成します。
条件に一致した場合は、「X(i, 1) = "〇"」というように、配列に値を入力していきます。
Sub TEST8()
'最終行を取得
Dim LastRow
LastRow = Cells(Rows.Count, "A").End(xlUp).Row
'配列を作成
Dim X
ReDim X(1 To LastRow, 1 To 1)
X(1, 1) = "作業列" '見出しを入力'最終行までループ
For i = 2 To LastRow
'商品がA、D、G以外の場合
If Cells(i, "A") <> "A" And Cells(i, "A") <> "D" And Cells(i, "A") <> "G" Then
X(i, 1) = "〇" '配列に入力
End If
Next
'フィルタを解除
Range("A1").AutoFilter
'配列を作業列に入力
Range("C1").Resize(UBound(X, 1)) = X
'作業列でフィルタ
Range("A1").AutoFilter 3, "〇"
End Sub