オートフィルタって使っていますか?VBAでオートフィルタを使うとExcelシート上の表で条件に当てはまるデータだけ表示することができて便利です。
この記事では、オートフィルタについてオートフィルタとはなんなのかやオートフィルタの使い方といった基本的な内容から
- 抽出されたデータをコピーする方法
- 抽出されたデータを昇順に並び替える方法
- 抽出されたデータの件数を取得する方法
など応用的な内容についても解説していきます。今回はオートフィルタについて、使い方をわかりやすく解説します!
オートフィルタとは
オートフィルタとは、Excelシート上の表で条件に当てはまるデータを表示し、他のデータは非表示にします。
オートフィルタの使い方
オートフィルタを使うためには、以下のように記述します。
オブジェクト名.AutoFilter(Field, [Criteria1[, Operator[, Criteria2[, VisibleDropDown]]]])
オブジェクト名には対象となるRangeオブジェクトを指定します。引数の[ ]内は省略可能です。
条件を設定する方法
引数の使って条件を設定します。設定についての説明は以下の表のとおりです。
引数 | 定数(値) | 説明 |
---|---|---|
Field | ー | フィルタの対象となるフィールド番号を整数で指定。 表の左端列が「1」 |
Criteria1 | ー | 抽出条件となる文字列を指定。 "=" と指定すると、空白セルが抽出。 "" と指定すると空白以外のフィールドが抽出。 省略すると、抽出条件はALL。 |
Operator | xlAnd(1) | And条件(デフォルト値) |
xlOr(2) | Or条件 | |
xlTop10Items(3) | 上位トップ10 | |
xlBottom10Items(4) | 下位ワースト10 | |
xlTop10Percent(5) | 上位トップ10% | |
xlBottom10Percent(6) | 下位ワースト10% | |
Criteria2 | ー | 2 番目の抽出条件となる文字列を指定 |
VisibleDropDown | True | フィールドにドロップダウン矢印を表示 |
False | フィールドにドロップダウン矢印を非表示 |
引数Criteria1とCriteria2を使って複合条件でデータ抽出することができます。それではサンプルコードで確認しましょう。サンプルコードでは、2017年8月1か月間の平均気温、最高気温、最低気温のデータを使用しています。
※実際に動かしてみたい方は、以下にサンプルで使用するデータをCSV形式でおいておくので、csv形式で読み込んで使用してください。
使用したデータ(CSV形式)
年月日,平均気温(℃),最高気温(℃),最低気温(℃) 2017/8/1,26.3,31,22.7 2017/8/2,22.9,25.4,20.9 2017/8/3,24.3,28.9,20.2 2017/8/4,25.6,29.2,22 2017/8/5,27.8,31.9,24.6 2017/8/6,29,33.5,26.3 2017/8/7,28.7,33.2,25.9 2017/8/8,29.3,33.9,26.9 2017/8/9,30,37.1,25.9 2017/8/10,25.7,28.4,22.4 2017/8/11,22.9,24.8,21.7 2017/8/12,24.1,29.3,21 2017/8/13,26.9,31.2,23.1 2017/8/14,24.4,25.2,23.4 2017/8/15,23.7,26.3,22.4 2017/8/16,21.9,22.8,21.1 2017/8/17,24.2,28.2,20.9 2017/8/18,26.5,30.2,24 2017/8/19,26,30.3,22.4 2017/8/20,25.3,29.3,22.4 2017/8/21,27,31.5,24.1 2017/8/22,27.8,31.9,24.4 2017/8/23,29.4,33.7,24.7 2017/8/24,29.9,34.8,26.4 2017/8/25,30.4,34.9,25.8 2017/8/26,28.9,33.6,26.1 2017/8/27,26.6,30.6,23.2 2017/8/28,26.4,31.4,22.3 2017/8/29,28.7,32.2,25.2 2017/8/30,27.7,32.9,24.1 2017/8/31,21.6,24.2,20
[code]
Sub macro()
Range("A1").AutoFilter _
Field:=2, Criteria1:=">=25"
End Sub
[/code]
このサンプルコードでは、2列目の平均気温が25度以上のデータを表示するように設定しています。
複数条件やで絞り込む方法
And条件やOr条件など複数の条件で絞り込む場合は、引数Operatorの定数を指定します。
Operator:x=xlAnd
と指定すると複数の条件をすべて満足するデータを表示します。
Operator:x=xlOr
と指定すると複数の条件のいずれかを満足するデータを表示します。それでは、サンプルコードで確認しましょう。
Sub macro1() Range("A1").AutoFilter _ Field:=2, Criteria1:=">=25", _ Operator:=xlAnd, Criteria2:="<30" End Sub
このサンプルコードでは、2列目の平均気温が25度以上でかつ30度未満のデータを表示するように設定しています。
部分一致条件で絞り込む方法
文字列の一部分を含む条件でデータの絞り込みを行いたい場合は、ワイルドカードを使います。ワイルドカードとは、あるパターンにマッチするように表現した文字列のことです。例えば「*」(アスタリスク)を使うと0文字以上の任意の文字を指定することができます。
使い方をサンプルコードで確認しましょう。
Sub macro() Range("A1").AutoFilter _ Field:=1, Criteria1:="*藤*" End Sub
このサンプルでは、ワイルドカード文字「*」(アスタリスク)を使って「藤」を含む文字列に絞り込んで表示しています。ちなみに、ワイルドカードの使い方については、こちらで詳しく解説しています。
ワイルドカードでは「*」(アスタリスク)や「?」を使いますが、これらの文字を含むパターンでデータを絞り込みたい場合の記述方法についても説明しています。ぜひ、参考にしてください。
解除する方法
オートフィルタを解除するには、AutoFilterを引数なしで記述します。サンプルコードで確認しましょう。
Sub macro2() Range("A1").AutoFilter End Sub
日付を条件とする場合の注意点
日付を条件とする場合は、注意が必要です。標準の日付の表示形式と同じ場合は、Excel2007以前とExcel2010以降で記述が異なります。Excel2007以前の場合は以下のように記述します。
Criteria1:=DateValue("2017/8/1")
Excel2010以降の場合は以下のように記述します。
Criteria1:="2017/8/1"
サンプルコードで確認しましょう。サンプルコードはExcel2016で実行結果を確認しています。
Sub macro3() Range("A1").AutoFilter _ Field:=1, Criteria1:=">=2017/8/10", _ Operator:=xlAnd, Criteria2:="<2017/8/20" End Sub
このサンプルコードでは、8月10日から8月20日より前のデータを表示するように設定しています。
抽出されたデータをコピーする方法
抽出されたデータは可視セルですので、可視セルをコピーして貼り付けます。アクティブセル領域に対して、SpecialCellsメソッドで可視セルのみを選択します。サンプルコードで確認しましょう。
Sub macro4() Range("A1").AutoFilter _ Field:=1, Criteria1:=">=2017/8/10", _ Operator:=xlAnd, Criteria2:="<2017/8/20" Range("A1").CurrentRegion. _ SpecialCells(xlCellTypeVisible).Copy Range("A34") End Sub
抽出されたデータを昇順に並び替える方法
抽出されたデータを昇順で並び替えるには、AutoFilterオブジェクトのSortプロパティを使用します。抽出されたデータの中でソートが行われます。サンプルコードで確認しましょう。
Sub macro5() Range("A1").AutoFilter _ Field:=2, Criteria1:=">=25", _ Operator:=xlAnd, Criteria2:="<30" With ActiveSheet.AutoFilter.Sort With .SortFields .Clear .Add Key:=Range("C1"), _ Order:=xlAscending End With .Apply End With End Sub
このサンプルコードでは、平均気温のデータに対して25度以上30度以下の条件でデータの抽出を行っています。さらに、最高気温のデータで昇順にソートしています。
ただしオートフィルタが解除されても並び順は元に戻りませんので、注意しましょう!なお、オブジェクトのSortプロパティを使ってソートする方法については、こちらで詳しく解説しています。ぜひ参考にしてください。
抽出されたデータの件数を取得する方法
VBAでは、オートフィルタで抽出されたデータの件数を取得するプロパティやメソッドがありません。ここではExcelシートの数式で使用するワークシート関数のSABTOTAL関数を使う方法をご紹介します。
Sub macro6() Range("A1").AutoFilter _ Field:=1, Criteria1:=">=2017/8/10", _ Operator:=xlAnd, Criteria2:="<2017/8/20" Dim num As Integer num = Application.WorksheetFunction.Subtotal _ (2, Range("A1").CurrentRegion.Columns(1)) MsgBox num & "件" End Sub
ここでは、ワークシート関数のSABTOTAL関数を使って数値を含むセル数を取得しています。SABTOTAL関数は第1引数で、集計方法を整数値で指定します。以下のような集計が可能です。
値 | 説明 |
---|---|
1 | 平均 |
2 | 数値を含むセル数 |
3 | 空白でないセル数 |
4 | 最大値 |
5 | 最小値 |
6 | 積 |
7 | 標本標準偏差 |
8 | 標準偏差 |
9 | 合計 |
10 | 不偏分散 |
11 | 標本分散 |
また、ワークシート関数の使い方については、こちらで詳しく解説していますので、ぜひ参考にしてください。
まとめ
ここでは、オートフィルタの使い方について説明しました。表のデータの中から注目したいデータだけを抽出することができるので便利です。使いこなすことができるように、この記事を何度も参考にして下さいね!