こんにちは、Ryoです。
Excelのオートフィルタ機能は便利なので利用する頻度も高いと思いますが、この機能はVBAでも扱うことができます。今回はオートフィルタによるトップ3データ/上位20%/セル色/複数項目/指定範囲データの抽出や全データ表示、オートフィルタ解除ON/OFFについて書いていこうと思います。
1.AutoFilterメソッド
オートフィルター機能を利用するためにはAutoFilterメソッドを利用します。
構文:AutoFilter(Field,Criteria1,Operator,Criteria2,VisbleDropDown)
引数Fieldに抽出対象のフィールド、引数Criteriaに条件、引数Operatorにフィルタの種類を指定します。例として以下画像の表で「product name」が「製品A」のデータを抽出してみます。
Sub Sample1() 'セルA1を含む表にオートフィルタを設定し「製品A」を抽出 Range("A1").AutoFilter Field:=3, Criteria1:="製品A" '※ Field:=3 ⇒ C列 , Criteria1:="製品A" ⇒ 抽出対象 End Sub
このサンプルコードを実行すると結果は以下の通りになります。
引数Fieldに3を指定(C列)し、その中から「製品A」のデータを抽出する簡単なものですがAutoFilterメソッドを利用したデータ抽出として基本的な動作になります。
AutoFilterメソッド引数の詳細などについては以下の通りになります。これらを用いて冒頭に記述した多様なデータ抽出に対応していきます。
≪AutoFilterメソッドの引数≫
項目 | 内容 |
Field | フィルタの対象となるフィールド(列)番号を整数で指定 |
Criteria1 | 抽出条件となる文字列を指定 |
Operator | フィルタの種類をXlAutoFilterOperatorクラスの定数で指定 |
Criteria2 | 2番目の抽出条件となる文字列を指定。引数Criteria1及び引数Operatorと組み合わせて使用し、複合抽出条件を指定 |
VisibleDropDown | True指定でフィールドにあるオートフィルタのドロップダウン矢印を表示、Falseで非表示(既定はTrue) |
≪引数Operatorの定数≫
定数 | 内容 |
xlAnd | Criteria1とCriteria2のAND条件 |
xlBottom10Items | 下位からCriteria1で指定される項目数 |
xlBottom10Percent | 下位からCriteria1で指定される割合 |
xlFilterCellColor | セルの色(2007以降) |
xlFilterDynamic | 動的フィルタ(2007以降) |
xlFilterFontColor | フォントの色(2007以降) |
xlFilterIcon | フィルタアイコン(2007以降) |
xlFilterValues | フィルタの値(2007以降) |
xlOr | Criteria1またはCriteria2のOR条件 |
xlTop10Items | 上位からCriteria1で指定された項目数 |
xlTop10Percent | 上位からCriteria1で指定される割合 |
2.トップ3のデータを抽出
AutoFilterメソッドを利用して上位または下位からカウントした数を抽出することもできます。この場合は引数OperatorにxlTop10Items、またはxlBottom10Itemsを指定します。
サンプルとして「quantity」欄の上位3つのデータを抽出してみます。
Sub Sample2() 'トップ3データを抽出する Range("A1").AutoFilter Field:=4, Criteria1:=3, _ Operator:=xlTop10Items '※ Field:=4⇒D列、 ' Criteria1:=3,Operator:=xlTop10Items ⇒上位から3つ End Sub
≪実行前≫
≪実行後≫
このように指定したフィールド(D列)の上位3つのデータが抽出されます。
3.上位20%のデータを抽出
トップ3データ抽出と同様に上位20%のデータを取得するには引数OperatorにxlTop10Percentを指定し、Criteria1に割合を指定します。
Sub Sample3() '上位20%のデータを抽出する Range("A1").AutoFilter Field:=4, Criteria1:=20, _ Operator:=xlTop10Percent '※ Field:=4⇒D列、 ' Criteria1:=20,Operator:=xlTop10Percent ⇒上位20% End Sub
≪実行前≫
≪実行後≫
このように指定したフィールド(D列)の上位20%のデータを抽出することができます。
4.セルの色を指定して抽出
AutoFilterメソッドの引数OperatorにxlFilterCellColorを指定することでセルの色でデータを抽出することができます。
このサンプルコードでは赤色で塗りつぶされたセルのデータを抽出します。
Sub Sample4() 'セルの色を指定して抽出する Range("A1").AutoFilter Field:=3, Criteria1:=RGB(255, 0, 0), _ Operator:=xlFilterCellColor '※ Field:=3⇒C列、 ' Criteria1:=RGB(255, 0, 0),Operator:=xlFilterCellColor⇒赤色のセル End Sub
≪実行前≫
≪実行後≫
このように指定したフィールド(C列)で赤色に塗りつぶされたセルを抽出することができます。
5.複数項目を抽出条件に指定
AutoFilterメソッドの抽出条件として1つの列に対し複数の値を指定する場合は、Array関数を利用し配列を指定することで対応できます。
構文:Array(arglist)
次のサンプルコードは「product name」欄の「製品A」「製品C」「製品E」の3種データを抽出します。
Sub Sample5() '複数項目を抽出条件に指定する Range("A1").AutoFilter Field:=3, Criteria1:=Array("製品A", _ "製品C", "製品E"), Operator:=xlFilterValues '※ Field:=3⇒C列、 ' Criteria1:=Array("製品A","製品C", "製品E") ' , Operator:=xlFilterValues ⇒ 製品A/製品C/製品Eの3種データ抽出 End Sub
≪実行前≫
≪実行後≫
この通り指定したフィールド(C列)の3種類のデータが抽出されます。
6.あいまいな条件で抽出
抽出条件にワイルドカード(*)を組み合わせることで曖昧な条件でも抽出することができます。
次のサンプルでは「製品B」で始まるデータを抽出します。
Sub Sample6() 'あいまいな条件で抽出する Range("A1").AutoFilter Field:=3, Criteria1:="製品B*" _ , Operator:=xlFilterValues '※ Field:=3⇒C列, Criteria1:="製品B*" ⇒ 製品Bで始まるデータ ' , Operator:=xlFilterValues End Sub
≪実行前≫
≪実行後≫
このようにワイルドカードを組み合わせることで、あいまいな条件であっても抽出することが可能です。
7.指定した範囲のデータを抽出
引数Criteria1と合わせてCriteria2を使用することでデータの範囲指定を行うことができます。
次のサンプルでは「quantity」欄の値が「700以上1000未満」のデータを抽出します。
Sub Sample7() '指定した範囲のデータを抽出する Range("A1").AutoFilter Field:=4, Criteria1:=">=700", _ Operator:=xlAnd, Criteria2:="<1000" '※ Field:=4⇒D列、Criteria1:=">=700"⇒700以上 ' Operator:=xlAnd ⇒ 且つ ' Criteria2:="<1000" ⇒ 1000未満 End Sub
≪実行前≫
≪実行後≫
このように引数Criteria1と引数Criteria2にそれぞれ条件を設定し、引数OperatorにxlAndを設定することで、指定した範囲のデータを抽出することができます。
8.複数の文字列を条件に指定
前項で指定範囲のデータ抽出例を書きましたが、同様にして複数の文字列を指定して抽出することもできます。この場合、引数Criteria1とCriteria2に抽出したい文字列を指定し引数Operatorに「xlOr」を設定します。
次のサンプルでは「product name」欄から「製品A」と「製品D」を抽出します。
Sub Sample8() '複数の文字列を条件に指定する Range("A1").AutoFilter Field:=3, Criteria1:="製品A" _ , Operator:=xlOr, Criteria2:="製品D" '※ Field:=3⇒C列、Criteria1:="製品A"⇒指定文字列① ' Operator:=xlOr ⇒ または ' Criteria2:="製品D" ⇒ 指定文字列② End Sub
≪実行前≫
≪実行後≫
このように引数の組み合わせによって複数の文字列を条件に指定することもできます。
9.オートフィルタON/OFFの切り替え
オートフィルタの解除を行うにはAutoFilterメソッドを使用します。
構文:オブジェクト.AutoFilter
AutoFilterメソッドは引数を指定しない場合、実行することでオートフィルタのON/OFFを切り替えます。
Sub Sample9() 'オートフィルタの引数未設定で実行することにより 'ON/OFFを切り替えることができる Range("A1").AutoFilter '※解除した後に再度実行するとオートフィルタONとなる End Sub
≪実行前≫
≪実行後≫
実行することでオートフィルタが解除されて全てのデータが表示されますが、この状態で再度実行すると下の画像のようにオートフィルタがONとなります。
このようにオートフィルタON/OFFを切り替えることができます。
10.オートフィルタを解除せずに全データを表示する
オートフィルタの抽出条件を解除してすべてのデータを表示し、オートフィルタ自体は維持する(解除しない)場合はShowAllDataメソッドを利用します。
構文:オブジェクト.ShowAllData
この場合、対象のSheetに対して処理を実行することでオートフィルタ抽出条件を解除することができます。
Sub Sample10() '全てのデータを表示する ' 注記)オートフィルタ自体は解除されない '対象のSheetに対しオートフィルタ抽出条件を解除 Worksheets("Sheet1").ShowAllData '現在開いている(アクティブ)シートに対してであれば 'ActiveSheet.ShowAllData 'このような記述でも可 '※参考 ' 条件が設定されているフィールドがわかっている場合, ' 以下記述でも全データ表示可能です。 ' (予めC列に条件設定されている場合↓↓) 'Range("A1").AutoFilter Field:=3, Criteria1:="*" End Sub
このサンプルを実行するとワークシート「Sheet1」の抽出条件を解除し、すべてのデータを表示します。
≪実行前≫
≪実行後≫
このようにオートフィルタ機能を維持した状態ですべてのデータを表示させることも可能です。
11.まとめ
今回はオートフィルタ機能をVBAで利用する際に使用頻度が高いと思われる部分をピックアップして書いてみました。
集計したデータにオートフィルタを設定し、条件に応じてユーザーの望む抽出結果を表示させるなどの対応もできますので、この辺りの処理内容を知っておくと何かと有用かと思います。
以上、VBAでオートフィルタを実行する内容についてでした!今回の記事が何かの参考になれば幸いです。
Ryo