ワークシート上のリストにオートフィルタを設定するには次のようにします。
ここでは、セル範囲A1:C10にリストが入力されているとします。
Sub Sample1()
Range("A1").CurrentRegion.AutoFilter Field:=2, Criteria1:="田中"
End Sub
上のコードは、オートフィルタ矢印を表示すると同時にB列を"田中"で絞り込みました。
オートフィルタは、ワークシート上で1つしか作成できません。
リストの範囲はExcelが自動的に判断しますので、次のようにリスト内の任意の単一セルを指定するだけでも、オートフィルタを設定できます。
Sub Sample2()
Range("A1").AutoFilter Field:=2, Criteria1:="田中"
End Sub
オートフィルタを解除するには、もう一度AutoFilterメソッドを実行します。
Sub Sample3()
Range("A1").AutoFilter
End Sub
AutoFilterメソッドは、オートフィルタのオン/オフを切り替える働きをします。
さて、オートフィルタをオンにしただけの状態と、オートフィルタを使って何らかの絞り込みを行っている状態を区別するには、どうしたらいいでしょう。
ワークシートのAutoFilterプロパティは、そのシート内でオートフィルタが設定されているかどうかを表すプロパティです。
オートフィルタが設定されていないとNothingを返します。
Sub Sample4()
Dim myRange As AutoFilter
Set myRange = ActiveSheet.AutoFilter
If Not myRange Is Nothing Then
MsgBox "設定されています"
Else
MsgBox "設定されていません"
End If
End Sub
オートフィルタが設定されているとAutoFilterオブジェクトを返しますので次のように判定することも可能です。
Sub Sample4()
Dim myRange As AutoFilter
Set myRange = ActiveSheet.AutoFilter
If TypeName(myRange) = "AutoFilter" Then
MsgBox "設定されています"
Else
MsgBox "設定されていません"
End If
End Sub
あるいは、もっと簡単に、ワークシートのAutoFilterModeプロパティを調べる手もあります。
こちらは、オートフィルタが設定されているとTrueを返します。
Sub Sample4()
If ActiveSheet.AutoFilterMode Then
MsgBox "設定されています"
Else
MsgBox "設定されていません"
End If
End Sub
いずれにしても、Sample4の判定は「オートフィルタが設定されているか」が分かるだけで、そのオートフィルタで「絞り込まれているか」は不明です。
オートフィルタ矢印が表示されているだけでなく、実際に何らかの絞り込みが行われているかどうかは、次のように判定します。
AutoFilterオブジェクトのFilterModeプロパティは、オートフィルタが絞り込まれているときにTrueを返します。
Sub Sample5()
If ActiveSheet.AutoFilterMode Then
If ActiveSheet.AutoFilter.FilterMode Then
MsgBox "絞り込まれています"
Else
MsgBox "絞り込まれていません"
End If
End If
End Sub
便利なFilterModeプロパティですが、残念ながらこのプロパティはExcel 2007で追加された新しいプロパティです。
Excel 2003以前のバージョンでは使用できません。
Excel 2003以前のバージョンで「絞り込まれているか」を判定するには、各列ごとの状態を調べなければなりません。
リスト内で、オートフィルタ矢印が表示されている各列は、Filterオブジェクトとして操作できます。
Sub Sample6()
Dim n As Long
If ActiveSheet.AutoFilterMode Then
n = ActiveSheet.AutoFilter.Filters.Count
MsgBox n & "列のフィルタがあります"
End If
End Sub
各Filterオブジェクト(各列)で、絞り込みが行われているかどうかは、FilterオブジェクトのOnプロパティで判定できます。
Sub Sample7()
Dim i As Long
If ActiveSheet.AutoFilterMode Then
For i = 1 To ActiveSheet.AutoFilter.Filters.Count
If ActiveSheet.AutoFilter.Filters(i).On Then
MsgBox i & "列目で絞り込まれています"
End If
Next i
End If
End Sub
列の位置は取得できましたが、できればタイトルも知りたいところです。
しかし、Filterオブジェクトには、タイトルを返すプロパティがありません。
今回の例では、セル範囲A1:C10にリストを作っていますので、2列目がB列と分かりますが、いつもセルA1からリストが存在するとは限りません。
ちょっと面倒ですが、絞り込まれている列のタイトルは、次のようにして調べます。
Sub Sample8()
Dim i As Long, Title As String
If ActiveSheet.AutoFilterMode Then
For i = 1 To ActiveSheet.AutoFilter.Filters.Count
If ActiveSheet.AutoFilter.Filters(i).On Then
Title = ActiveSheet.AutoFilter.Range.Cells(1, i)
MsgBox Title & " 列で絞り込まれています"
End If
Next i
End If
End Sub
● 補足 ●
どんな条件で絞り込まれているかは、Criteria1プロパティやOperatorプロパティで分かります。