AutoFilter オートフィルター 1列に OR条件 で 3つ以上 の条件指定(Excel VBA)

【本日のミッション】

Excel VBAでAutoFilter(オートフィルター)の実行。1列に「条件3つ以上」を「OR条件」で実行せよ。

ミッションの概要

今回のミッションは、この表から

くだものが「バナナ」」または「ぶどう」または「メロン」

を抽出することです。

AutoFilter オートフィルター 1列に OR条件 で 3つ以上 の条件指定(Excel VBA)
↓↓↓↓↓↓↓↓↓↓↓↓↓↓
AutoFilter オートフィルター 1列に OR条件 で 3つ以上 の条件指定(Excel VBA)

プロシージャ

Sub フィルター_1列_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  '最終行
    
    Range(Cells(1, 1), Cells(e_row, 3)) _
       .AutoFilter Field:=2, _
           Criteria1:=ary, _
           Operator:=xlFilterValues
            
End Sub

記入したプロシージャ(Sub~End Subまで)のどこかにカーソルを置いて、F5キーをクリックしてください。

くだものが「バナナ」」または「ぶどう」または「メロン」のデータだけが、抽出されましたね。

AutoFilter オートフィルター 1列に OR条件 で 3つ以上 の条件指定(Excel VBA)

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 オートフィルター 1列に OR条件 で 3つ以上 の条件指定(Excel VBA)

AutoFilterの解除がされていないと、最終行取得の結果がおかしくなってしまいます。
AutoFilterを解除してから、最終行を取得するようにします。

AutoFilter オートフィルター 1列に OR条件 で 3つ以上 の条件指定(Excel VBA)

AutoFilterメソッド

Range.AutoFilter(Field, Criteria1, Operator, Criteria2, VisibleDropDown)
引数名説明省略
Fieldフィルターの対象となる列を列番号で指定します。列番号は、Rangeオブジェクト範囲の左から何列目かを整数値で指定します。(一番左列番号が「1」 になります。)
Criteria11つめのフィルター条件となる文字列を指定します。
“=”と指定:空白セルが抽出されます。
“<>”と指定:空白以外のフィールドが抽出されます。
省略すると、フィルター条件は All になります。
引数Operatorに「xlTop10Items」を指定する場合は、引数 Criteria1に項目数を指定します。
Operatorフィルター条件をXlAutoFilterOperator列挙型の定数で指定します。
定数説明
xlAndAND条件(Criteria1かつCriteria2)
xlOrOR条件(Criteria1またはCriteria2)
xlTop10Items上位からCriteria1で指定した項目数
xlBottom10Items下位からCriteria1で指定した項目数
xlTop10Percent上位からCriteria1で指定した割合%
xlBottom10Percent下位からCriteria1で指定した割合%
xlFilterValuesフィルターの値
xlFilterCellColorセルの色
xlFilterFontColorフォントの色
xlFilterIconフィルター アイコン
xlFilterDynamic動的フィルター
Criteria22つめのフィルター条件となる文字列を指定します。引数 Criteria1および引数 Operatorと組み合わせて、複合抽出条件を指定します。
VisibleDropDownオートフィルターのドロップダウン矢印の表示を指定します。
True :矢印を表示します。(規定値)
False:矢印を非表示にします。

フィルター条件は「Criteria1」と「Criteria2」の2つしか指定できません。
3つ以上の条件を指定する場合は、配列を使用します。

Dim ary(2) As String    '条件用配列

ary(0) = "バナナ"
ary(1) = "ぶどう"
ary(2) = "メロン"

Range(Cells(1, 1), Cells(e_row, 3)) _
    .AutoFilter Field:=2, _
    Criteria1:=ary, _
    Operator:=xlFilterValues

引数Field:=2B列のことです。

複数条件に指定する文字列「バナナ」「ぶどう」「メロン」を配列aryに格納します。
この条件指定の方法は、手動だと下記のイメージになります。

AutoFilter オートフィルター 1列に OR条件 で 3つ以上 の条件指定(Excel VBA)

Criteria1に配列を指定する時、引数Operatorには「xlFilterValues」を指定します。

AutoFilter オートフィルター 1列に OR条件 で 3つ以上 の条件指定(Excel VBA)

▼抽出結果
AutoFilter オートフィルター 1列に OR条件 で 3つ以上 の条件指定(Excel VBA)

参考

AutoFilter オートフィルター 1列に OR条件で2つの条件指定(Excel VBA)
AutoFilter オートフィルター 1列に AND条件 で2つの条件指定(Excel VBA)
AutoFilter オートフィルター 1列に OR条件 で 3つ以上 の条件指定(Excel VBA)

■■■スポンサーリンク■■■