テーブル列のオートフィルター 空白/空白以外を切り替える

テーブル(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:=列インデックス
タイトルとURLをコピーしました