【本日のミッション】
Excel VBAでAutoFilter(オートフィルター)の実行。
複数列に「条件3つ」を実行せよ。
ミッションの概要
今回のミッションは、この表から
- B列:「店舗A」または「店舗C」
- C列:「バナナ」または「りんご」または「ぶどう」
- D列:「3以上」かつ「5未満」
のデータを抽出することです。
↓↓↓↓↓↓↓↓↓↓↓↓↓↓
プロシージャ
Sub フィルター_複数列_条件3つ以上() Dim ary(2) As String '条件用配列 Dim e_row As Long '最終行 ActiveSheet.AutoFilterMode = False 'フィルターモード解除 ary(0) = "バナナ" ary(1) = "りんご" ary(2) = "ぶどう" e_row = Cells(Rows.Count, 1).End(xlUp).Row '最終行 '■フィルタ実行 With Range(Cells(1, 1), Cells(e_row, 4)) .AutoFilter Field:=2, _ Criteria1:="店舗A", _ Operator:=xlOr, _ Criteria2:="店舗C" .AutoFilter Field:=3, _ Criteria1:=ary, _ Operator:=xlFilterValues .AutoFilter Field:=4, _ Criteria1:=">=3", _ Operator:=xlAnd, _ Criteria2:="<5" End With End Sub
記入したプロシージャ(Sub~End Subまで)のどこかにカーソルを置いてF5キーをクリックしてください。
「店舗A」または「店舗C」の
「バナナ」または「りんご」または「ぶどう」の
「3以上」かつ「5未満」のデータが抽出されましたね。
AutoFilter オートフィルター 解除の必要性
オートフィルターを解除するには、 AutoFilterMode プロパティに「False」を設定します。
オートフィルターでデータ抽出された状態で他の処理を行うと、色々な不具合が発生します。
例えば・・・
- 最終行の取得処理がおかしくなる場合があります。(次項参照)
e_row = Cells(Rows.Count, 1).End(xlUp).Row
→最終行がオートフィルターで非表示になっている場合、取得されません。 - 非表示のセルは、検索(Find)で検出されません。
ActiveSheet.AutoFilterMode = False
最終行の取得
最終行の取得には、「Endプロパティ」を使用します。
Rangeオブジェクト.End(方向)
方向 | 内容 | キーボード操作 |
xlUp | 上方向 | Ctrl+↑ |
xlDown | 下方向 | Ctrl+↓ |
xlToLeft | 左方向 | Ctrl+← |
xlToRight | 右方法 | Ctrl+→ |
今回、最終行を取得するのはこのコード。
e_row = Cells(Rows.Count, 1).End(xlUp).Row
Rows.Count はワークシートの行数「1048576」。
Cells(Rows.Count, 1) はセル「A1048576」。
セル「A1048576」からキーボード操作「Ctrl + ↑」をした結果の、行番号「Row」を取得し、変数e_rowに格納します。
AutoFilterの解除がされていないと、最終行取得の結果がおかしくなってしまいます。
AutoFilterを解除してから、最終行を取得するようにします。
Withステートメント
1つのオブジェクトに対して、複数のプロパティやメソッドを記述する際、Withステートメントを使用して、コードを簡略化することができます。
例えば Range(“A1”) に対して、下記のような処理がある場合
Range("A1").Font.Bold = True Range("A1").Font.Size = 14 Range("A1").Font.ColorIndex = 3
Withステートメントを使うと、このように簡略化できます。
With Range("A1").Font .Bold = True .Size = 14 .ColorIndex = 3 End With
Range(“A1”)のフォントに対して3つの処理を行っているのが一目瞭然ですよね。
今回は一つの表に対して、複数のAutoFilter処理を行うため、Withステートメントを使用しています。
AutoFilterメソッド
Range.AutoFilter(Field, Criteria1, Operator, Criteria2, VisibleDropDown)
引数名 | 説明 | 省略 | ||||||||||||||||||||||||
Field | フィルターの対象となる列を列番号で指定します。列番号は、Rangeオブジェクト範囲の左から何列目かを整数値で指定します。(一番左列番号が「1」 になります。) | ○ | ||||||||||||||||||||||||
Criteria1 | 1つめのフィルター条件となる文字列を指定します。 “=”と指定:空白セルが抽出されます。 “<>”と指定:空白以外のフィールドが抽出されます。 省略すると、フィルター条件は All になります。 引数Operatorに「xlTop10Items」を指定する場合は、引数 Criteria1に項目数を指定します。 | ○ | ||||||||||||||||||||||||
Operator | フィルター条件をXlAutoFilterOperator列挙型の定数で指定します。
| ○ | ||||||||||||||||||||||||
Criteria2 | 2つめのフィルター条件となる文字列を指定します。引数 Criteria1および引数 Operatorと組み合わせて、複合抽出条件を指定します。 | ○ | ||||||||||||||||||||||||
VisibleDropDown | オートフィルターのドロップダウン矢印の表示を指定します。 True :矢印を表示します。(規定値) False:矢印を非表示にします。 | ○ |
フィルター条件は「Criteria1」と「Criteria2」の2つしか指定できません。
「バナナ」または「りんご」または「ぶどう」のように、3つ以上の条件を指定する場合は、配列を使用します。
今回は、配列ary(0)~ary(2)に「バナナ」「りんご」「ぶどう」を格納し、2つ目のAutoFilterで使用しています。
Dim ary(2) As String '条件用配列 ary(0) = "バナナ" ary(1) = "りんご" ary(2) = "ぶどう" With Range(Cells(1, 1), Cells(e_row, 4)) .AutoFilter Field:=2, _ Criteria1:="店舗A", _ Operator:=xlOr, _ Criteria2:="店舗C" .AutoFilter Field:=3, _ Criteria1:=ary, _ Operator:=xlFilterValues .AutoFilter Field:=4, _ Criteria1:=">=3", _ Operator:=xlAnd, _ Criteria2:="<5" End With
Withステートメントを使うことによって、同じ表に対して3列のAutoFilter処理を行っていることをわかりやすくしています。
Withステートメントを使用せず、別々に記述しても結果は同じです。
引数Field:=2 は B列、引数Field:=3 は C列、引数Field:4 は D列のことです。
1つ目のAutoFilter(B列)は、引数Operator:=xlOr とすることで、
Criteria1「店舗A」または Criteria2「店舗B」
という条件を指定しています。
2つ目のAutoFilter(C列)は、複数条件に指定する文字列「バナナ」「りんご」「ぶどう」を配列aryに格納します。
Criteria1に配列を指定する時、引数Operatorには「xlFilterValues」を指定します。
3つ目のAutoFilter(D列)は、引数Operator:=xlAnd とすることで、
Criteria1「3以上」かつ Criteria2「5未満」
という条件を指定しています。
▼抽出結果