和風スパゲティのレシピ

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

テーブルのフィルターをクリアする - ShowAllData

テーブルのフィルターをクリアする方法を紹介します。

ListObject.AutoFilterオブジェクトのShowAllDataメソッドを使用します。

サンプルコード

' 対象シートの第1テーブルのフィルターをクリアする
Worksheets("○○").Listobjects(1).AutoFilter.ShowAllData

' 指定名称テーブルのフィルターをクリアする
Worksheets("○○").ListObjects("tb売上データ").AutoFilter.ShowAllData

解説

テーブルのフィルターをクリアする場合は、
ListObject.AutoFilterオブジェクトのShowAllDataメソッドを実行します。

フィルターの抽出状態に関わらず実行できますので、
どの列にも絞り込みがかかっていなくてもエラーにはなりません。


簡単なコードですのでこのコード自体に注意点は特にありませんが、
ShowAllDataはWorksheetからも実行ができてしまいます。

' この記述は非推奨
Worksheets("○○").ShowAllData

 
このコードは基本良くない書き方なのですが、
たまにうまくいってしまうため間違って書いたときに気づかない可能性があります。

何故よくないかの詳しい解説は後述しますが、
とりあえずこう書けてしまう=構文エラーにならないことは知っておいてください。

特定の列のフィルターだけをクリアする

続いて複数の列で絞り込みがかかっているフィルターに対し、
特定の列の絞り込みだけを解除する方法を解説します。

↓の状態のテーブルに対し、「個数」のフィルターだけを解除する方法ですね。

テーブルのフィルター


これを実行するには、以下のコードを実行します。

Worksheets("○○").ListObjects("tb売上データ").AutoFilter.Range.AutoFilter 3

 

AutoFilterメソッドは通常、

  • 第1引数Fieldに抽出する列番号を
  • 第2引数Criteria1に抽出する内容を

それぞれ指定します。

この第2引数Criteria1を省略することその列の抽出をクリアすることが可能です。


注意点として、第1引数Fieldはシートの列番号ではなく、
フィルター設置範囲で何列目になるかを指定する必要があります。

今回も「D列」の個数をクリアするコードですが、
テーブルがB列始まりのため指定する値が「3」となっている点に注意してください。


なお、せっかくのテーブルの機能を利用するのであれば、
以下のように「個数」という列名を使って抽出を解除することが可能です。

Dim 対象テーブル As ListObject
Set 対象テーブル = Worksheets("○○").ListObjects("tb売上データ")
対象テーブル.AutoFilter.Range.AutoFilter 対象テーブル.ListColumns("個数").Index

 
テーブルの構造化参照をVBA上で使用する場合は、
テーブル(ListObject)のListColumnオブジェクトを参照します。


今回はListColmns("個数")という記述で個数列を取得でき、
Indexプロパティでテーブル内の列番号を取得できます。

テーブル内の列番号のため、AutoFilterメソッドにそのまま渡せるのがいいですね。


テーブルを使う方は構造化参照も好きな人が多いと思いますので、
この記述もぜひ覚えておきましょう。



最後に細かい仕様に一応触れておくと、テーブルのAutoFilterを操作する場合は、
テーブル内のRangeオブジェクトからAutoFilerを実行すればよいです。

つまり、実際は以下のコードでも今回の処理を実行できます。

Worksheets("○○").Range("B3").AutoFilter 3

 
もちろんこのコードはテーブルの開始位置が変わると動かなくなるため、実際は、

対象テーブル.AutoFilter.Range.AutoFilter 3

と、対象のテーブルのAutoFilterの範囲からしっかり実行しましょう。

おまけ:WorksheetからShowAllDataを実行する

先ほどあまりよくない記述と書いた、

Worksheets("○○").ShowAllData

この記述について解説しておきます。


この記述を行った場合はクリアするフィルターが選択中のセルによって変わり

  • 選択セルがテーブル内にあった場合はそのテーブルのフィルター
  • 選択セルがテーブル内にない場合はそのシートのフィルター
    ※ シートフィルター内のセルを選択している必要はない

という仕様で対象のフィルターが決定されます。


その上で、

  • 対象フィルター内のどこかひとつでも抽出がされていればクリアを実行
  • 対象フィルター内に抽出されている列が1つもなければエラー

という挙動でメソッドが実行されます。


挙動が選択セルによって変わる上に有難くもないエラーが出てしまうため、
使う必要はないですね。


あまり使うべきではない記述方法ですが、
だからこそ「こう書けてしまう=構文エラーにならない」ことは覚えておきましょう。
 

Worksheets("○○").AutoFilter.ShowAllData

「このAutoFilterを書き忘れてもエラーで教えてくれない」
というのは知識として大事ですね。