isAutoFilteredメソッドの修正

isAutoFilteredメソッドの欠陥

isAutoFilteredメソッドとは

自作のFunction。

akashi-keirin.hatenablog.com

このときに作ったもの。

f:id:akashi_keirin:20180414075452j:plain

こんなふうにフィルターで絞り込まれていないときにFalseを返す。

イミディエイト・ウインドウに

?isAutoFiltered(Sheet1)

と入力して[Enter]を押すと、

f:id:akashi_keirin:20180414075501j:plain

このとおり。

f:id:akashi_keirin:20180414075509j:plain

こんなふうに、フィルターで絞り込まれていると、Trueを返す。

f:id:akashi_keirin:20180414075528j:plain

このとおり。

重大な欠陥

しかし、このisAutoFilterメソッドには、重大な欠陥があったのだった。

AutoFilterオブジェクトのことが分かっている方は、すでにお気づきだったかと思うが、たとえば、

f:id:akashi_keirin:20180414075545j:plain

この状態のワークシートを指定して

f:id:akashi_keirin:20180414075553j:plain

実行しようと[Enter]を押すと、

f:id:akashi_keirin:20180414075602j:plain

f:id:akashi_keirin:20180414075610j:plain

実行時エラーになる。

理由は簡単。

そもそも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して処理を抜ける、というだけ。

使ってみる

f:id:akashi_keirin:20180414075553j:plain

改めて[Enter]!

f:id:akashi_keirin:20180414075617j:plain

ちゃんとFalseが返った。

おわりに

フィルターを設定した状態で作成したFunctionだったので、フィルターを外した状態での実験が完全に抜けていた。とらわれるとやはり見落とすことが多いものです。

f:id:akashi_keirin:20180414075627j:plain
三国志』53巻(横山光輝 潮出版社)より

@akashi_keirin on Twitter