スポンサーリンク
前回の記事では、Excel VBAでオートフィルタを設定する方法を扱った。
今回は、そのオートフィルタを解除する方法を中心に取り扱う。
オートフィルタのフィルタリングを解除する ShowAllData
下図では、B列にオートフィルタのフィルタリングが掛かっている。
こういったフィルタリングを全て解除し、表のデータを全て表示するソースコードは、ShowAllDataというメソッドを使えば良く、次のようになる。
1 2 3 |
Dim ws As Worksheet: Set ws = ActiveSheet ws.ShowAllData'フィルタリング解除 |
ただ、このShowAllDataは、あくまでフィルタリングが掛かっている状態でなければ正しく動作しない。
私もこれをよく忘れてしまうのだが、何もフィルタリングが掛かっていない状態でShowAllDataを実行すると「ShowAllDataメソッドは失敗しました」というエラーが出てしまう。
ではこのエラーを防ぐには、これまた場合分けをすることになる。
すなわち、フィルタリングが掛かっている状態なのか、そうでないのかだ。
そのソースコードを示す前に、こういう処理をVBAに組み込む必要性が、実務のどのような場面で考えられるだろうか。
実務からも考えた操作目的
実務では、Excelのオートフィルタ付き表のフォームを配布して、そこに色々と記入してもらうことがよくある。
それに記入する人はしばしば、まず必要なデータの行だけにフィルタリングするものだ。
そしてそのフィルタリングを掛けっぱなしにしたままで、与えられたマクロを実行するものだ。
あるいは、あれこれ操作しているうちに、オートフィルタの設定じたいが解除されてしまうことも考えられる。
だから、
- オートフィルタが設定されたままであろうと解除されていようと
- データのフィルタリングがされていようといまいと
「オートフィルタが設定されていて、なおかつデータのフィルタリングは全て解除された状態」に直したいという場面が多いわけだ。
FilterModeも使ったソースコード
では本題に戻って、表にフィルタリングが掛かっている状態なのか、そうでないのかを判定するのには、FilterModeというものを使う。
前回の記事で扱ったのはAutoFilterModeで、今回扱うのはFilterModeだが、
FilterMode→オートフィルタ付きの表が、何らかの条件でフィルタリングされているのか
という違いになる。
さてこれらを組み合わせ、前回の記事で扱ったものも総合すると、次のようなソースコードになる。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
'オートフィルタが設定されたままであろうと解除されていようと 'データのフィルタリングがされていようといまいと '「オートフィルタが設定されていて、なおかつデータのフィルタリングは全て解除された状態」に直す Dim ws As Worksheet: Set ws = ActiveSheet With ws If .AutoFilterMode Then 'オートフィルタが設定されているか If .FilterMode Then '何らかの条件でフィルタリングされているか .ShowAllData '全データ表示 End If Else 'そもそもオートフィルタが設定されていないなら .Cells(1, 1).AutoFilter End If End With |
オートフィルタ関係のVBAは、意外と面倒だ。
スポンサーリンク