isAutoFilteredメソッドの修正
isAutoFilteredメソッドの欠陥
isAutoFilteredメソッドとは
自作のFunction。
このときに作ったもの。
こんなふうにフィルターで絞り込まれていないときにFalseを返す。
イミディエイト・ウインドウに
?isAutoFiltered(Sheet1)
と入力して[Enter]を押すと、
このとおり。
こんなふうに、フィルターで絞り込まれていると、Trueを返す。
このとおり。
重大な欠陥
しかし、このisAutoFilterメソッドには、重大な欠陥があったのだった。
AutoFilterオブジェクトのことが分かっている方は、すでにお気づきだったかと思うが、たとえば、
この状態のワークシートを指定して
実行しようと[Enter]を押すと、
実行時エラーになる。
理由は簡単。
そもそもAutoFilterオブジェクトが存在しないのに参照しようとしたからだ。
今でこそエラーメッセージを見た瞬間、このことに気づけたけれど、初心者の頃だったらこれだけで小一時間はハマっていたと思うw
というわけで、コードを修正した。
修正後のコード
リスト1 標準モジュール
Public Function isAutoFiltered(Optional ByVal targetSheet As Worksheet) As Boolean If targetSheet Is Nothing Then Set targetSheet = ActiveSheet With targetSheet If .AutoFilter Is Nothing Then isAutoFiltered = False: Exit Function '……(*)' If .AutoFilter.FilterMode Then isAutoFiltered = True: Exit Function End With isAutoFiltered = False: Exit Function End Function
変えたのは、基本的には(*)のところだけ。
対象のワークシートにAutoFilterオブジェクトがなかったらFalseをreturnして処理を抜ける、というだけ。
使ってみる
改めて[Enter]!
ちゃんとFalseが返った。
おわりに
フィルターを設定した状態で作成したFunctionだったので、フィルターを外した状態での実験が完全に抜けていた。とらわれるとやはり見落とすことが多いものです。