目次
目的
- オートフィルタを掛けたい。
- オートフィルタが掛かっているかどうかを調べたい。
オートフィルタを掛ける、かける、どちらの字で書いた方が良いのか分かりません。
オートフィルタモードにしてみる
Excel では以下の画像のような操作になると思います。

VBA での操作を試してみます。
- 下記の状態でテストしてみます。
下向き矢印が表示されていません。オートフィルタモードになっていない状態です。 - 下記 URL に元データをアップロードしてあります。タブ区切りのテキストファイルになっています。
https://pulogu.net/wordpress/wp-content/uploads/2024/02/sample.txt- 上記 URL のデータをすべてコピー。
- Excel の A1 セルを右クリック。
- 「形式を選択して貼り付け」をクリック。
- 「HTML」「unicode テキスト」「テキスト」の中から「テキスト」をクリック。
- A1:C6 の範囲にデータがコピーされる。
- 下記マクロを実行してみます。
Sub オートフィルタモードになっているかを調べる()
Debug.Print Worksheets(1).AutoFilterMode
End Sub - オートフィルタモードにしてみます。
Sub オートフィルタモードにしてみる()
Range("A1:C6").AutoFilter
End Sub - 上記 3 のマクロを再度実行してみます。
- 上記 3 のマクロをもう一度実行してみます。
- オートフィルタモードになっている状態で、再度、AutoFilterMode プロパティを取得してみます。
Sub 再度AutoFilterModeプロパティを取得()
Debug.Print Worksheets(1).AutoFilterMode
End Sub - AutoFilterMode プロパティは False を設定できるようです。
Sub AutoFilterModeをfalseに設定してみる()
Worksheets(1).AutoFilterMode = False
End Sub
各列にフィルタを掛ける
Excel では以下の画像のような操作になると思います。

VBA での操作を試してみます。
- 下記の状態でテストしてみます。
フィルタは掛かっていない状態です。 - 下記マクロを実行してみます。
Sub 一列目数値3以上()
Range("A1:C6").AutoFilter 1, ">=3"
End Sub - ここで FilterMode プロパティの値を取得してみます。
Sub 非表示の行があるかどうかを取得()
Debug.Print Worksheets(1).FilterMode
End Sub - 一列目に掛けたフィルタを解除してみます。
Sub 一列目すべて表示()
Range("A1:C6").AutoFilter 1
End Sub - ここでもう一度 FilterMode プロパティの値を取得してみます。
Sub すべてのデータが表示されている状態でFilterModeを取得()
Debug.Print Worksheets(1).FilterMode
End Sub - AND で複数の条件に一致するデータのみ表示してみます。
Sub 一列目_数値3以上で4以下()
Range("A1:C6").AutoFilter 1, ">=3", xlAnd, "<=4"
End Sub - 1 から 3 列目に同時にフィルタを掛けてみます。
Sub 一列目2以上_二列目C以外_三列目Bで始まる文字()
Range("A1:C6").AutoFilter 1, ">=2"
Range("A1:C6").AutoFilter 2, "<>C"
Range("A1:C6").AutoFilter 3, "b*"
End Sub - 1 から 3 列目のデータを順番に表示してみます。
Sub 一二三列目全て表示()
Range("A1:C6").AutoFilter 1
Range("A1:C6").AutoFilter 2
Range("A1:C6").AutoFilter 3
End Sub - 2 列目の空白セルのみ表示してみます。元データは 3,5 行目が空白セルになっています。
Sub 二列目空白()
Range("A1:C6").AutoFilter 2, "="
End Sub - 2 列目の空白セル以外を表示してみます。2,4,6 行目が表示される予定です。
Sub 二列目空白以外のフィルタ()
Range("A1:C6").AutoFilter 2, "<>"
End Sub
AutoFilter オブジェクト
上記では「Raneg("A1:C6").AutoFilter」のように Range オブジェクトの AutoFilter "メソッド" を使用しましたが、Worksheet オブジェクトの AutoFilter "プロパティ" で「AutoFilter オブジェクト」というものを取得できるようです。
- オートフィルタモードになっている状態でテストしてみます。
オートフィルタモードになっている。 - 下記マクロを実行してみます。
Sub AutoFilterオブジェクト取得()
Dim a
Set a = Worksheets(1).AutoFilter
Debug.Print TypeName(a)
Debug.Print VarType(a) '9 は vbObject
End Sub - オートフィルタのセル範囲のアドレスを取得してみます。
Sub オートフィルタのデータ範囲取得()
Dim a As AutoFilter
Set a = Worksheets(1).AutoFilter
Debug.Print a.Range.Address
End Sub - フィルタの数を取得してみます。
Sub フィルタの数を取得()
Dim a As AutoFilter
Set a = Worksheets(1).AutoFilter
Debug.Print a.Filters.Count
End Sub - 上記で実行したマクロですが、下記マクロを実行してみます。
Sub 一列目_数値3以上で4以下_二回目()
Range("A1:C6").AutoFilter 1, ">=3", xlAnd, "<=4"
End Sub - 各列にフィルタが掛かっているかどうかを取得してみます。
Sub 各列のフィルタの状態()
Dim a As AutoFilter
Set a = Worksheets(1).AutoFilter
Debug.Print a.Filters.Item(1).On
Debug.Print a.Filters.Item(2).On
Debug.Print a.Filters.Item(3).On
End Sub - 1 列目のフィルタの条件を取得してみます。
Sub 一列目のフィルタの条件を取得()
Dim a As AutoFilter
Set a = Worksheets(1).AutoFilter
Debug.Print a.Filters.Item(1).Criteria1
Debug.Print a.Filters.Item(1).Criteria2
Debug.Print a.Filters.Item(1).Operator
End Sub- 「.Criteria1」「.Criteria2」
フィルタの 1 つ目の条件と 2 つ目の条件です。
フィルタの条件 - 「.Operator」
AND,OR などの条件が定数で返ってくるようです。xlAnd = 1 , xlOr = 2 など。 - 実行結果は以下のようになりました。
>=3
<=4
1 - 上記マクロの「Item(1)」の「1」を「2」「3」に変更すると下記のエラーが発生しました。2,3 列目にはフィルタが掛かっていないのでエラーになったようです。
フィルタ条件を「Criteria1」のみ設定して「Criteria2」を取得しようとしても同じエラーが発生しました。
実行時エラー '1004' アプリケーション定義またはオブジェクト定義エラーです。 エラー発生行
- 「.Criteria1」「.Criteria2」
結果を操作する
オートフィルタを掛けた結果、表示されるデータがあると思いますが、そのデータを操作してみます。
表示されているデータの取得を行ってみます。
- 下記の状態でテストしてみます。
オートフィルタは掛かっていない。 - オートフィルタを掛けてみます。
Sub 二列目が空白以外でフィルタを掛ける()
Range("A1:C6").AutoFilter 2, "<>"
End Sub - 表示されているセルをループ処理してみます。
Sub オートフィルタの結果をループする()
Dim a As Range
For Each a In Range("A2:C6").SpecialCells(xlCellTypeVisible)
Debug.Print a
Next
End Sub - Range("A2:C6").SpecialCells(xlCellTypeVisible) が返す範囲を取得してみます。
Sub xlCellTypeVisibleが返す範囲()
Debug.Print Range("A2:C6").SpecialCells(xlCellTypeVisible).Address
End Sub - cells.SpecialCells(xlCellTypeVisible) が返す範囲を取得してみます。
Sub cells_xlCellTypeVisibleが返す範囲()
Debug.Print Cells.SpecialCells(xlCellTypeVisible).Address
End Sub
次は、行単位の操作を試してみます。
- 下記マクロを実行してみます。
Sub オートフィルタの結果を行単位で操作()
Debug.Print Range("A2:C6").SpecialCells(xlCellTypeVisible).EntireRow.Address
End Sub - 行を削除してみます。
Sub オートフィルタの結果を行単位で削除()
Range("A2:C6").SpecialCells(xlCellTypeVisible).EntireRow.Delete
End Sub - オートフィルタを解除してみます。
Sub オートフィルタを解除()
Sheet1.AutoFilterMode = False
End Sub - ワークシートのオブジェクト名は下記のようなマクロで取得することも出来るようです。
Sub ワークシート1のコード名取得()
Debug.Print Worksheets(1).CodeName
End Sub
マクロストック
Sub 一列目の下向き矢印を非表示にする()
Range("A1:C6").AutoFilter 1, ">=3", xlAnd, "<=4", False
End Sub
第 5 引数「VisibleDropDown」を「False」に設定しています。

テスト環境
- Windows 10(64 ビット)
- Microsoft Office Excel 2003
以上、閲覧ありがとうございました。