HOME > 即効テクニック > Excel VBA > データベース関連のテクニック > オートフィルタの状況を調べる

即効テクニック

データベース関連のテクニック

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

(Excel 97/2000/2002/2003/2007)
ワークシート上のリストにオートフィルタを設定するには次のようにします。
ここでは、セル範囲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プロパティで分かります。