機能と数式 | VBA | セミナー | オンラインソフト | お問い合わせ | その他
Top > Excel > VBA

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



ワークシート上のリストにオートフィルタを設定するには、RangeオブジェクトのAutoFilterメソッドを実行します。次のコードは、下図のリストにオートフィルタを設定し、B列の「名前」を"田中"で絞り込みます。



Sub Sample1()
    Range("A1").CurrentRegion.AutoFilter Field:=2, Criteria1:="田中"
End Sub



オートフィルタは、ワークシート上で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プロパティは、オートフィルタが設定されているとAutoFilterオブジェクトを返しますので、次のように判定することも可能です。

Sub Sample5()
    Dim myRange As AutoFilter
    Set myRange = ActiveSheet.AutoFilter
    If TypeName(myRange) = "AutoFilter" Then
        MsgBox "設定されています"
    Else
        MsgBox "設定されていません"
    End If
End Sub

AutoFilterプロパティが返すAutoFilterオブジェクトを使うと、マクロでオートフィルタを自由に操作できます。あるいは、もっと簡単に、ワークシート(Worksheetオブジェクト)のAutoFilterModeプロパティを調べる手もあります。こちらは、オートフィルタが設定されているとTrueを返します。

Sub Sample6()
    If ActiveSheet.AutoFilterMode Then
        MsgBox "設定されています"
    Else
        MsgBox "設定されていません"
    End If
End Sub

いずれにしても、ここまでのコードでは「オートフィルタが設定されているか」が分かるだけで、そのオートフィルタで「絞り込まれているか」を判定することはできません。オートフィルタ矢印が表示されているだけでなく、実際に何らかの絞り込みが行われているかどうかを判定するには、AutoFilterオブジェクトのFilterModeプロパティを使います。FilterModeプロパティは、オートフィルタが絞り込まれているときにTrueを返します。

Sub Sample7()
    If ActiveSheet.AutoFilterMode Then
        If ActiveSheet.AutoFilter.FilterMode Then
            MsgBox "絞り込まれています"
        Else
            MsgBox "絞り込まれていません"
        End If
    End If
End Sub





FilterModeプロパティは、AutoFilterオブジェクトのプロパティです。もし、オートフィルタが設定されていないと、AutoFilterオブジェクトを操作できませんので、FilterModeプロパティを調べる前に、AutoFilterModeプロパティで「オートフィルタ設定されていかどうか」を判定しています。

とても便利なFilterModeプロパティですが、残念ながらこのプロパティはExcel 2007で追加された新しいプロパティです。Excel 2003までのバージョンでは使用できません。Excel 2003までのバージョンで「絞り込まれているか」を判定するには、各列ごとの状態を調べなければなりません。リスト内で、オートフィルタ矢印が表示されている各列は、Filterオブジェクトとして操作できます。

Sub Sample8()
    Dim n As Long
    If ActiveSheet.AutoFilterMode Then
        n = ActiveSheet.AutoFilter.Filters.Count
        MsgBox n & "列のフィルタがあります"
    End If
End Sub



各Filterオブジェクト(各列)で、絞り込みが行われているかどうかは、FilterオブジェクトのOnプロパティで判定できます。

Sub Sample9()
    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 Sample10()
    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プロパティで分かりますね。






このエントリーをはてなブックマークに追加