オートフィルターの状態を取得するFunction

オートフィルターの状態を取得する

元データが置いてあるワークシートがオートフィルターで絞り込まれているのに、それに気づかずにマクロを実行してわけのわからない結果が出て(゚Д゚)ポカーンとなったことはないだろうか。

わしはある!!!!!!!!

そんなわけで、オートフィルタの状態を表すオブジェクト、プロパティについて調べてみた。

Worksheet.AutoFilterオブジェクト

コチラによると、

指定されたワークシートのオートフィルターを示します。

AutoFilter オブジェクトを取得するには、 AutoFilter プロパティを使用します。

とのこと。

AutoFilter オブジェクトを取得するには、 AutoFilter プロパティを使用しますというのがちょっと分かりにくいけれど、

WorksheetオブジェクトのAutoFilterプロパティを参照すると、つまり、

「[Worksheetオブジェクト].AutoFilter」と書くと、

AutoFilterオブジェクトが返る


という理解で良いかと。

まあ、最初の指定されたワークシートのオートフィルターを示しますというのもよく分からんなw

「オートフィルターそのもの」とでも考えたら良いのかな。

AutoFilter.FilterModeプロパティ

再びコチラによると、

ワークシートがオートフィルター フィルター モードの場合、 True を返します。値の取得のみ可能です。ブール型 ( Boolean ) の値を使用します。

構文

式 . FilterMode

式AutoFilter オブジェクトを表す変数。

とのこと。

「フィルターモード」??? 何それ???(←素人)

フィルターモード

コチラによると、どうもフィルターで絞り込まれた状態を「フィルターモード」と言うらしい。

アッーーー!!

そ、そういえば……、

f:id:akashi_keirin:20180301075715j:plain

f:id:akashi_keirin:20180301075723j:plain

こういうことかー!

はい、その程度のことも知らなかったExcel初心者ですよ、私は。

ここまでのまとめ

Worksheet.AutoFilterオブジェクトのFilterModeプロパティがTrueだったら、そのシートはどこかの列がオートフィルターで絞り込まれた状態であるということですね。

オートフィルターの状態を調べるFunction

無駄にFunction化する。

リスト1 標準モジュール
Public Function isAutoFiltered(targetSheet As Worksheet) As Boolean
  If targetSheet.AutoFilter.FilterMode Then isAutoFiltered = True
End Function

まあ、ほとんど冗談だと思ってください。

使ってみる

次のコードで実行する。

スト2 標準モジュール
Public Sub testIsAutoFiltered()
  Debug.Print isAutoFiltered(Selection.Parent)
End Sub

選択範囲のあるシートについて、オートフィルターの状態をイミディエイトに表示するだけのコード。

f:id:akashi_keirin:20180301075751j:plain

こんな表を用意してオートフィルターを設定する。

f:id:akashi_keirin:20180301075758j:plain

こんなふうに「武松」と「楊志」(またこの2人w)のチェックを外して、[OK]。

f:id:akashi_keirin:20180301075806j:plain

絞り込まれた。

f:id:akashi_keirin:20180301075814j:plain

範囲を選択して、リスト2を実行!

f:id:akashi_keirin:20180301075822j:plain

当然、「True」が返る。

念のため、

f:id:akashi_keirin:20180301075831j:plain

絞り込みを解除して実行。

f:id:akashi_keirin:20180301075841j:plain

ちゃんと「False」が返った。

おわりに

まあ、Function化するよりも、AutoFilterオブジェクトについてマスターしておくことの方が重要でしょうね。

@akashi_keirin on Twitter