和風スパゲティのレシピ

日本語でコーディングするExcelVBA

81本目:全フィルターの絞り込み解除

Excel&VBA解説サイト「エクセルの神髄」様出題の問題集、
VBA100本ノック」に対する私の回答と解説のページです。

100本ノックの出題リストはこちらから
excel-ubara.com

出題:全フィルターの絞り込み解除

#VBA100本ノック 81本目
シートにはテーブル設定されている表と単なる範囲の表が複数混在しています。
全てのフィルターの絞り込みを解除して非表示行が無い状態にしたい。
つまり全ての行が表示されている状態にしてください。
ただしフィルター適用は残してください。→画像参照
※シートは任意

複数のオートフィルター

◇ 出題ページはこちら

ソースコード

' 100本ノック081:全フィルターの絞り込み解除

Sub 実行テスト()
    Call 対象シートの全フィルターをクリアする(ActiveSheet)
End Sub

Sub 対象シートの全フィルターをクリアする(ws対象シート As Worksheet)

    ' 本処理は選択セルの影響を受けるためまずはActivate
    ws対象シート.Activate

    ' すべてのテーブルのフィルターをクリア
    Dim テーブル As ListObject
    For Each テーブル In ws対象シート.ListObjects
        If Not テーブル.AutoFilter Is Nothing Then
            テーブル.AutoFilter.ShowAllData
        End If
    Next

    ' 通常のフィルターは「テーブルがないセルを選択した状態」でないと取得できないため、
    ' UsedRange外 = 絶対にテーブルではないセルを選択
    ws対象シート.Cells(1, ws対象シート.UsedRange.Columns.Count + 1).Select

    ' 通常のフィルターを解除
    If ws対象シート.AutoFilterMode = True Then
        ws対象シート.AutoFilter.ShowAllData
    End If

End Sub

解説

AutoFilterメソッドには「選択中のセルに影響される」厄介な仕様があり、

  • テーブル内のセルであればそのテーブルのオートフィルター
  • それ以外のセルであれば通常のオートフィルター

を取得する仕様になっています。


ひとまずテーブルのフィルターはこの仕様に頼らずとも取得することができ、
各ListObjectからAutoFilterプロパティを実行すればOKです。


問題は通常のオートフィルターの方で、
通常フィルターはWorksheet.AutoFIlterからしか取得できません。

よってどこかテーブル以外のセルを選択してからAutoFilterを実行する必要があり、
今回は「UsedRangeより右側にあるセル」を利用しています。


今回は目的が「フィルターのクリア(絞り込み解除)」ですので、
各AUtoFilterオブジェクトからShowAllDataメソッドを実行すればいいですね。


テーブルと通常フィルターが混在する場合はこの仕様に気を付けなければいけません。

詳しくはこちらの記事をどうぞ。
www.limecode.jp