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

VBA での操作を試してみます。
- 下記の状態でテストしてみます。

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 のマクロを実行する度にオートフィルタモードの ON / OFF が切り替わりました。
Sub 再度AutoFilterModeプロパティを取得()
Debug.Print Worksheets(1).AutoFilterMode
End Sub
- 実行結果は以下のようになりました。

Sub AutoFilterModeをfalseに設定してみる()
Worksheets(1).AutoFilterMode = False
End Sub
- 実行結果は以下のようになりました。


各列にフィルタを掛ける
Excel では以下の画像のような操作になると思います。

VBA での操作を試してみます。
- 下記の状態でテストしてみます。

Sub 一列目数値3以上()
Range("A1:C6").AutoFilter 1, ">=3"
End Sub
- 「AutoFilter 1」
「1」はオートフィルタの範囲「A1:C6」の 1 列目という意味です。 - 「”>=3″」
3 以上という意味です。 - 実行結果は以下のようになりました。

Sub 非表示の行があるかどうかを取得()
Debug.Print Worksheets(1).FilterMode
End Sub
- FilterMode
非表示の行がある場合「True」を返すようです。上記で 1 列目にフィルタを掛けたので「True」が返ってくる予定です。 - 実行結果です。

Sub 一列目すべて表示()
Range("A1:C6").AutoFilter 1
End Sub
- 実行結果です。

Sub すべてのデータが表示されている状態でFilterModeを取得()
Debug.Print Worksheets(1).FilterMode
End Sub
- 実行結果です。

Sub 一列目_数値3以上で4以下()
Range("A1:C6").AutoFilter 1, ">=3", xlAnd, "<=4"
End Sub
- xlAnd
OR の場合は定数「xlOr」を指定するようです。 - 実行結果です。



Sub 一列目2以上_二列目C以外_三列目Bで始まる文字()
Range("A1:C6").AutoFilter 1, ">=2"
Range("A1:C6").AutoFilter 2, "<>C"
Range("A1:C6").AutoFilter 3, "b*"
End Sub
- 「AutoFilter 2」「AutoFilter 3」
オートフィルタを掛けている範囲「A1:C6」の 2 列目、3 列目という意味です。 - 「b*」
文字「b」と「*」アスタリスクを記述しています。「*」はその部分に複数の文字があることを表現しています。 - 実行結果です。

Sub 一二三列目全て表示()
Range("A1:C6").AutoFilter 1
Range("A1:C6").AutoFilter 2
Range("A1:C6").AutoFilter 3
End Sub
- 実行結果です。

Sub 二列目空白()
Range("A1:C6").AutoFilter 2, "="
End Sub
- 実行結果です。

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
- Worksheets(1).AutoFilter
Worksheets オブジェクトの AutoFilter プロパティで AutoFilter オブジェクトを取得しています。 - 実行結果は以下のようになりました。

9

9
Sub オートフィルタのデータ範囲取得()
Dim a As AutoFilter
Set a = Worksheets(1).AutoFilter
Debug.Print a.Range.Address
End Sub
- Dim a As AutoFilter
「a」「.(ピリオド)」と続けて入力すると、入力候補が出てきて便利なので、AutoFilter として宣言しています。 - 実行結果は以下のようになりました。

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
- 「.Item(1)」
1 列目は (1) になります。2,3 列目は (2),(3) になります。 - 「.On」
フィルタが掛かっている状態だと「true」を返すようです。下向き矢印が青くなっていると「true」を返すのだと思います。 - 実行結果は以下のようになりました。

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 つ目の条件です。

AND,OR などの条件が定数で返ってくるようです。xlAnd = 1 , xlOr = 2 など。

<=4
1
フィルタ条件を「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”) の中の可視セル(Visible)のみを取得しています。
Sub xlCellTypeVisibleが返す範囲()
Debug.Print Range("A2:C6").SpecialCells(xlCellTypeVisible).Address
End Sub
- 実行結果は以下のようになりました。

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
- 実行結果は以下のようになりました。

「シート1」のオブジェクト名を使用しています。普通の Worksheets(1) でも良いと思います。
各シートのオブジェクト名は VBE で見る事が出来ます。

Excel の「シート1」と VBE のプロジェクトエクスプローラーの「(シート1)」が一致している。
(2)
VBE のプロジェクトエクスプローラーの「Sheet1」とプロパティウィンドウのオブジェクト名の「Sheet1」が一致している。
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
以上、閲覧ありがとうございました。
