和風スパゲティのレシピ

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

シート上の全フィルターをクリアする - ShowAllData

ワークシート上にあるすべてのフィルターをクリアする方法を解説します。

といっても通常のオートフィルターは複数設置できませんので、
下記シートのような「テーブルとフィルターが混在したシート」において、
すべてのフィルターをクリアする方法の解説になります。
テーブルとフィルターが混在したシート

ソースコード

' 全フィルター(テーブル&通常)のクリア
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オブジェクトを取得し、
そこからShowAllDataメソッドを実行しているコードです。

ShowAllDataメソッドはWorksheetから実行する場合はどこかの列で抽出がかかっていないとエラーになってしまいますが、
AutoFilterから実行した場合はクリア済みでもエラーになりません。

' すべての列が既にクリアされている状態で
Worksheets("○○").ShowAllData ' ← エラー
Worksheets("○○").AutoFilter.ShowAllData ' ← 実行可(何も起きない)

 
問題はテーブルと通常フィルター混在時のフィルター取得問題で、
通常のフィルターを取得するにはテーブル以外のセルを選択する必要があります。


選択セルに影響されてしまうコードのため、
対象シートをActivateしてテーブルでないセルを探しています。

今回はUsedRangeの右側のセルを選択して実行しました。


テーブルと通常フィルターが混在したシートはいろいろと考慮することが増えます。

詳しくはこちらの記事をご覧ください。
www.limecode.jp