即効テクニック |
ワークシート上のリストにオートフィルタを設定するには次のようにします。 ここでは、セル範囲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 SubAutoFilterメソッドは、オートフィルタのオン/オフを切り替える働きをします。 さて、オートフィルタをオンにしただけの状態と、オートフィルタを使って何らかの絞り込みを行っている状態を区別するには、どうしたらいいでしょう。 ワークシートの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プロパティで分かります。