【VBA入門】オートフィルタでデータ抽出(データのコピー、ソート)

オートフィルタって使っていますか?VBAでオートフィルタを使うとExcelシート上の表で条件に当てはまるデータだけ表示することができて便利です。

この記事では、オートフィルタについてオートフィルタとはなんなのかやオートフィルタの使い方といった基本的な内容から

  • 抽出されたデータをコピーする方法
  • 抽出されたデータを昇順に並び替える方法
  • 抽出されたデータの件数を取得する方法

など応用的な内容についても解説していきます。今回はオートフィルタについて、使い方をわかりやすく解説します!

目次

オートフィルタとは

オートフィルタとは、Excelシート上の表で条件に当てはまるデータを表示し、他のデータは非表示にします。

オートフィルタの使い方

オートフィルタを使うためには、以下のように記述します。

オブジェクト名.AutoFilter(Field, [Criteria1[, Operator[, Criteria2[, VisibleDropDown]]]])

オブジェクト名には対象となるRangeオブジェクトを指定します。引数の[ ]内は省略可能です。

条件を設定する方法

引数の使って条件を設定します。設定についての説明は以下の表のとおりです。

引数定数(値)説明
Fieldフィルタの対象となるフィールド番号を整数で指定。
表の左端列が「1」
Criteria1抽出条件となる文字列を指定。
"=" と指定すると、空白セルが抽出。
"" と指定すると空白以外のフィールドが抽出。
省略すると、抽出条件はALL。
OperatorxlAnd(1)And条件(デフォルト値)
xlOr(2)Or条件
xlTop10Items(3)上位トップ10
xlBottom10Items(4)下位ワースト10
xlTop10Percent(5)上位トップ10%
xlBottom10Percent(6)下位ワースト10%
Criteria22 番目の抽出条件となる文字列を指定
VisibleDropDownTrueフィールドにドロップダウン矢印を表示
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]

AutoFilter07

画像:実行結果

このサンプルコードでは、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

AutoFilter01

画像:実行結果

このサンプルコードでは、2列目の平均気温が25度以上でかつ30度未満のデータを表示するように設定しています。

部分一致条件で絞り込む方法

文字列の一部分を含む条件でデータの絞り込みを行いたい場合は、ワイルドカードを使います。ワイルドカードとは、あるパターンにマッチするように表現した文字列のことです。例えば「*」(アスタリスク)を使うと0文字以上の任意の文字を指定することができます。

使い方をサンプルコードで確認しましょう。

Sub macro()
    Range("A1").AutoFilter _
        Field:=1, Criteria1:="*藤*"
End Sub

AutoFilter08

画像:実行結果 オートフィルタ適用前

AutoFilter09

画像:実行結果 オートフィルタ適用後

このサンプルでは、ワイルドカード文字「*」(アスタリスク)を使って「藤」を含む文字列に絞り込んで表示しています。ちなみに、ワイルドカードの使い方については、こちらで詳しく解説しています。

ワイルドカードでは「*」(アスタリスク)や「?」を使いますが、これらの文字を含むパターンでデータを絞り込みたい場合の記述方法についても説明しています。ぜひ、参考にしてください。

解除する方法

オートフィルタを解除するには、AutoFilterを引数なしで記述します。サンプルコードで確認しましょう。

Sub macro2()
    Range("A1").AutoFilter
End Sub

AutoFilter02

画像:実行結果

日付を条件とする場合の注意点

日付を条件とする場合は、注意が必要です。標準の日付の表示形式と同じ場合は、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

AutoFilter03

画像:実行結果

このサンプルコードでは、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

AutoFilter04

画像:実行結果

抽出されたデータを昇順に並び替える方法

抽出されたデータを昇順で並び替えるには、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

AutoFilter05

画像:実行結果

このサンプルコードでは、平均気温のデータに対して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

AutoFilter06

画像:実行結果

ここでは、ワークシート関数のSABTOTAL関数を使って数値を含むセル数を取得しています。SABTOTAL関数は第1引数で、集計方法を整数値で指定します。以下のような集計が可能です。

説明
1平均
2数値を含むセル数
3空白でないセル数
4最大値
5最小値
6
7標本標準偏差
8標準偏差
9合計
10不偏分散
11標本分散

また、ワークシート関数の使い方については、こちらで詳しく解説していますので、ぜひ参考にしてください。

まとめ

ここでは、オートフィルタの使い方について説明しました。表のデータの中から注目したいデータだけを抽出することができるので便利です。使いこなすことができるように、この記事を何度も参考にして下さいね!

この記事を書いた人

熊本在住のフリープログラマ兼ライターです。C/C++/C#、Java、Python、HTML/CSS、PHPを使ってプログラミングをしています。専門は画像処理で最近は機械学習、ディープラーニングにはまっています。幅広くやってきた経験を活かしてポイントをわかりやすくお伝えしようと思います。
お問合せはこちらでも受け付けています。
info@sss-lab.com

目次