今回はAutoFilterメソッドでオートフィルタを設定する方法をご説明します。
オートフィルタは通常のExcel操作でも使用頻度が非常に高く、VBAでも便利且つ大量のデータにも高速で処理が可能になるなど非常に便利です。
とても情報量が多いため、機能をすべて説明しようとすると長くなりますので、分割でご説明します。
その他のAutoFilterメソッドでオートフィルタを操作する方法は次の記事をご覧ください。
- 文字列や空白、ワイルドカード、複数条件で絞り込み
- 複数列で条件を指定して絞り込み
- 数値で絞り込み
- 日付で絞り込み
- 色で絞り込み
- オートフィルタの解除とクリア
- オートフィルタの設定と絞り込みを取得する
- オートフィルタで絞り込みしたデータをコピーする
- オートフィルタで文字列と数値の絞り込み条件を取得する
1.AutoFilterメソッドとは
AutoFilterメソッドとは、オートフィルタを使ってリストをフィルター処理します。
構文は次のように記述します。
Range.AutoFilter (Field, Criteria1, Operator, Criteria2, SubField, VisibleDropDown)
引数一覧
下の一覧にある「SubField」はExcel2016から追加されましたが、新しいデータ型「株式」の[量]フィールドや「地理」の[人工]フィールドなどに条件を、指定するときに使う引数ですので、ほとんど使用する事はないともいます。
引数名 | 必須/省略可能 | データ型 | 説明 |
Field | 省略可能 | Variant | フィルターの対象となるフィールド番号を整数で指定します。 フィールド番号はリストの左側から始まり、一番左を1とします。 |
Criteria1 | 省略可能 | Variant | 抽出条件となる文字列を指定します。 「=」で空白セルが抽出され、「<>」で空白以外を抽出します。 |
Operator | 省略可能 | XlAutoFilterOperator | フィルターの種類をXlAutoFilterOperatorの定数で指定します。 |
Criteria2 | 省略可能 | Variant | 2 番目の抽出条件となる文字列を指定します。 引数 Criteria1 および引数 Operator と組み合わせて使い、複合抽出条件を 構築します。 |
SubField | Optional(省略可) | Variant | 抽出条件を適用するデータ型のフィールド (たとえば、地理学の[人口]フィールド、または株価の[量] フィールド)。 この値を省略すると、”(表示値)”が対象になります。 |
VisibleDropDown | 省略可能 | Variant | Trueを指定すると、フィルター処理されるフィールドのオートフィルターのドロップダウン矢印を表示します。 Falseを指定すると、抽出されるフィールドのオートフィルターのドロップダウン矢印を非表示にします。 既定値はTrueです。 |
XlAutoFilterOperatorの定数
定数 | 説明 |
xlAnd | 抽出条件1と抽出条件2の論理演算子ANDで抽出します。 |
xlBottom10Items | 抽出条件1で指定される最低値の項目数のレコード数を抽出します。 |
xlBottom10Percent | 抽出条件1で指定される最低値「%」のレコード数を抽出します。 |
xlFilterCellColor | セルの色 |
xlFilterDynamic | 動的フィルタ |
xlFilterFontColor | フォントの色 |
xlFilterIcon | フィルタアイコン |
xlFilterValues | フィルタの値 |
xlOr | 抽出条件1または抽出条件2の論理演算子ORで抽出します。 |
xlTop10Items | 抽出条件1で指定される最高値の項目数のレコード数を抽出します。 |
xlTop10Percent | 抽出条件1で指定される最高値「%」のレコード数を抽出します。 |
2.AutoFilterメソッドのデータ範囲を指定する
空白行を考慮して範囲指定する
次のコードは、下図のようなデータがある場合にA1~B5000(最終行)までを範囲指定します。
最終行を取得している理由は「空白行」の存在を考慮してです。
もし空白行が存在すると、途中で範囲が途切れてしまいます。
また、「Field:=1」で指定した範囲の1列目を「Criteria1:=」で指定した文字列で絞り込んでいます。
Sub Sample1()
Dim MaxRow As Long
MaxRow = Cells(Rows.Count, 1).End(xlUp).Row
Range(Cells(1, 1), Cells(MaxRow, 2)) _
.AutoFilter Field:=1, Criteria1:="店舗B"
End Sub
空白行がない想定でデータ範囲を指定する
次はデータ範囲に空白行がない場合に次のようにデータ範囲を指定する事ができます。
Sub Sample2()
Cells(1, 1).AutoFilter Field:=1, Criteria1:="店舗B"
End Sub
たったのこれだけです。
3.引数名を省略する
引数名を省略する事ができます。
「AutoFilterメソッド」は引数を左から順番に指定していきます。
引数一覧に省略可能と記載していますが、指定する場合には必要な引数のみ指定する、ということはできません。
「AutoFilterメソッド」は引数が多いのと、一つ一つの引数名が多いためすべて書く場合はそれなりにコードが長くなります。
そのため省略して記述する事で、よりシンプルに記述する事ができます。
省略していない次のコードを
Sub Sample3()
Dim MaxRow As Long
MaxRow = Cells(Rows.Count, 1).End(xlUp).Row
Range(Cells(1, 1), Cells(MaxRow, 2)) _
.AutoFilter Field:=1, Criteria1:="店舗B", Operator:=xlOr, Criteria2:="店舗C"
End Sub
次の様に省略する事でシンプルにできます。
Sub Sample4()
Dim MaxRow As Long
MaxRow = Cells(Rows.Count, 1).End(xlUp).Row
Range(Cells(1, 1), Cells(MaxRow, 2)) _
.AutoFilter 1, "店舗B", xlOr, "店舗C"
End Sub
4.引数を省略しなくても見やすいコードにする
3で引数の省略を記載しましたが、指定する列や項目が多くなるとどの条件が、どこを指しているのか正直「パッと見」で理解できなくなります。
そのため、これは好みになってきますが、次の様に引数を省略しなくても見やすいコードで書くことで、指定する条件を理解しやすくします。
Sub Sample5()
Dim MaxRow As Long
MaxRow = Cells(Rows.Count, 1).End(xlUp).Row
Range(Cells(1, 1), Cells(MaxRow, 2)) _
.AutoFilter Field:=1, _
Criteria1:="店舗B", _
Operator:=xlOr, _
Criteria2:="店舗C"
End Sub
この様に「 _」半角スペース アンダーバー と記載する事でコードを改行できますので、上の様に各条件で改行する事で条件の指定の可読性が上がります。