テーブル(ListObject)の特定の列でのオートフィルターを切り替えるマクロです。
“空白でオートフィルター” → “空白以外でオートフィルター” → “オートフィルター解除” と状態を切り替えます。
空欄/入力済みでフィルターしたり解除したりを切り替えることを想定しています。
テーブルのオートフィルターを切り替えるマクロ
Sub テーブルのオートフィルター切り替え()
Const COL As Long = 10 'フィルターを設定する列番号
Dim sCrit As String
sCrit = "=" '初期値(空白)
With ActiveSheet.ListObjects("テーブル1")
'現在のオートフィルター状態を判定
With .AutoFilter.Filters(COL)
If .On Then
Select Case .Criterial
Case "="
sCrit = "<>" '空白→空白以外
Case "<>"
sCrit = "" '空白以外→すべて
End Select
End If
End With
If sCrit = "" Then
.Range.AutoFilter Field:=COL
Else
.Range.AutoFilter Field:=COL, Criterial:=sCrit
End If
End With
End Sub
AutoFilterオブジェクトでオートフィルター状態を取得
ListObject.AutoFilter.Filters(
列インデックス)
から、列に適用されているフィルターを取得します。
On
プロパティでフィルターのOn/Offを取得します。シートのオートフィルターはAutoFilterMode
プロパティで取得できますが、テーブルではこのプロパティは使用できません。
Onの場合はCriteria1
プロパティでフィルター対象の値を取得します。
空白を表すフィルター値 : "="
空白以外を表すフィルター値 : "<>"
AutoFilterメソッドでオートフィルターを設定
オートフィルターの設定や解除には、ListObject.Range.AutoFilter
メソッドを使います。同じAutoFilterでもこちらはRangeオブジェクトに対するメソッドです。
オートフィルターを設定する場合はCriteria1
を指定します。解除する場合はCriteria1
は指定しません。
ListObject.Range.AutoFilter
Field:=
列インデックス,
Criteria1:=
フィルター値ListObject.Range.AutoFilter
Field:=
列インデックス