【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標本分散

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

まとめ

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

この記事を書いた人

【プロフィール】
DX認定取得事業者に選定されている株式会社SAMURAIのマーケティング・コミュニケーション部が運営。「質の高いIT教育を、すべての人に」をミッションに、IT・プログラミングを学び始めた初学者の方に向け記事を執筆。
累計指導者数4万5,000名以上のプログラミングスクール「侍エンジニア」、累計登録者数1万8,000人以上のオンライン学習サービス「侍テラコヤ」で扱う教材開発のノウハウ、2013年の創業から運営で得た知見に基づき、記事の執筆だけでなく編集・監修も担当しています。
【専門分野】
IT/Web開発/AI・ロボット開発/インフラ開発/ゲーム開発/AI/Webデザイン

目次