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