【VBA】オートフィルターを使いこなす【機能別】

VBA
スポンサーリンク

オートフィルターの基本

オートフィルターの設定方法

オートフィルターはrangeオブジェクトのメソッドです。
オートフィルターを呼び出す場合以下のように記述します。

Range("A2").AutoFilter

オートフィルターの解除方法

解除方法はオートフィルターの設定方法と全く一緒です。

Range("A2").AutoFilter

オートフィルターが設定されていればオートフィルターの解除になり、
オートフィルターが設定されていなければオートフィルターが設定されます。
正直なところ、オートフィルターを設定する際はフィルター条件を設定して使用しますので、解除するときにこのように記述することが大半です。

オートフィルターが設定されているかを確認する方法

オートフィルターが設定されているかどうかはWorksheetsオブジェクトのAutoFilterModeメソッドで判定できます。

Worksheets(1).AutoFilterMode

オートフィルターが設定されていればTrue,設定されていなければFalseを返します。

ですので、オートフィルターをかけるプログラムは以下のように記述します。

With Worksheets(1)
    If Not .AutoFilterMode Then
        .Range("a2").AutoFilter
    End If
End With

フィルターの設定方法

オートフィルターを設定した後はフィルターをかけていきます。

フィルターはAutoFilterの後に引数を渡すことでかけることができます。

どの列(Field)でどんな条件で(Criteria)フィルターをかけるか設定

どの列でフィルターをかけるかはFieldという引数で設定します。
どんな条件でフィルターをかけるかはCriteria1という引数で設定します。

'1列目で"a"でフィルターをかける場合
Range("A2").AutoFilter Field:=1, Criteria1:="a"

2つ以上の条件でフィルターをかける方法

2つ以上の条件は配列を使用して指定します。
また、Operatorという引数でxlFilterValuesを指定しなければなりません。
これは複数条件があることを伝えるためのものです。

'2列目で"a","b","c"でフィルターをかける場合
Range("A2").AutoFilter Field:=2, Criteria1:=Array("a", "b", "c"), Operator:=xlFilterValues

〇〇以上〇〇以下という条件でフィルターをかける方法

この場合はCriteria1とCriteria2を使用して範囲内のフィルターをかけます。
また、Operatorにxlor(または) か xland(かつ)を引数として渡します。

xlOr(または)の場合

1から100までの数字があるデータで5以下または95以上のデータを抽出したい場合は下記のようになります。

Range("A2").AutoFilter Field:=1, Criteria1:="<=5", Operator:=xlOr, Criteria2:=">=95"

xlAnd(かつ)の場合

1から100までの数字があるデータで5以上かつ95以下のデータを抽出したい場合は下記のようになります。

Range("A2").AutoFilter Field:=1, Criteria1:=">=5", Operator:=xlAnd, Criteria2:="<=95"

その他のフィルター方法の確認方法

マクロの記録を使用して、確認することができますので、活用してみて下さい。

フィルターのはずし方(全部表示に戻す)

これはFieldだけ指定することによって戻すことができます。

'1列目に設定しているフィルター条件の解除
Range("A2").AutoFilter Field:=1

これでフィルターを外すことができます。
オートフィルターを外すのとは違うので注意してください。

注意事項

フィルターをかけられないときはエラーが出る。
rangeを指定していてもその周り1マス範囲内のセルに文字が入っていない場合エラーが発生するので注意してください。
また、マクロで新しいを列を追加したり、最後の列に値を代入した場合、フィルターがかかっていない状態でフィルターをかけてしまうことになるので、エラーが発生します。

余談

自分で作成したマクロは引数の名前を省略してもわかりますが、他の人が見たときにわからなくなってしまう可能性が高いので、引数は指定してプログラムした方が属人化を防ぐ手段となりますので、参考にしてみてください。

下記のように引数を記述しなくてもプログラムできます。

'1列目をa,b,cでフィルター
Range("A2").AutoFilter 1,Array("a","b","c"),xlFilterValues
'1列目のフィルターを解除
Range("A2").AutoFilter 1
'そもそもオートフィルターを解除
Range("A2").AutoFilter

コメント

タイトルとURLをコピーしました