【ExcelVBA】オートフィルタでデータ抽出
目次
抽出編
テスト対象のテーブル
テスト対象テーブルを使いたい場合は、↓テーブルをコピーしてエクセルの A1 に貼り付けてください。
商品名 | 個数 |
---|---|
りんご | 4 |
みかん | 3 |
めろん | 5 |
いちご | 2 |
みかん | 1 |
データ抽出(単数)
Sub Sample() ThisWorkbook.ActiveSheet.Range("A1").AutoFilter _ Field:=1, _ Criteria1:="みかん" End Sub※「 Field:=1 」は A列 です。
結果
実行前のテーブル
データ抽出(複数)
パターン1:配列を使う方法Sub Sample() ThisWorkbook.ActiveSheet.Range("A1").AutoFilter _ Field:=1, _ Criteria1:=Array("みかん", "りんご"), _ Operator:=xlFilterValues End Sub※「 Field:=1 」は A列 です。
パターン2:配列を使う方法(配列変数を宣言)
Sub Sample() Dim Target(1) As String Target(0) = "みかん" Target(1) = "りんご" ThisWorkbook.ActiveSheet.Range("A1").AutoFilter _ Field:=1, _ Criteria1:=Target, _ Operator:=xlFilterValues End Sub※「 Field:=1 」は A列 です。
パターン3:Criteriaプロパティを使う方法
Sub Sample() ThisWorkbook.ActiveSheet.Range("A1").AutoFilter _ Field:=1, _ Criteria1:="みかん", _ Operator:=xlOr, _ Criteria2:="りんご" End Sub※「 Field:=1 」は A列 です。
結果
実行前のテーブル
複数条件一致でデータ抽出
下は、B列が「2以上」かつ「3以下」のデータ抽出例Sub Sample() ThisWorkbook.ActiveSheet.Range("A1").AutoFilter _ Field:=2, _ Criteria1:=">=2", _ Operator:=xlAnd, _ Criteria2:="<=3" End Sub※「 Field:=2 」は B列 です。
結果
実行前のテーブル
複合条件一致でデータ抽出
Sub Sample() ThisWorkbook.ActiveSheet.Range("A1").AutoFilter _ Field:=1, _ Criteria1:="みかん" ThisWorkbook.ActiveSheet.Range("A1").AutoFilter _ Field:=2, _ Criteria1:="=3" End Sub※「 Field:=1 」は A列 です。
※「 Field:=2 」は B列 です。
結果
実行前のテーブル
否定条件でデータ抽出
Sub Sample() ThisWorkbook.ActiveSheet.Range("A1").AutoFilter _ Field:=1, _ Criteria1:="<>みかん" End Sub※「 Field:=1 」は A列 です。
結果
実行前のテーブル
否定条件でデータ抽出(否定条件複数)
パターン1:Criteriaプロパティを使う方法Sub Sample() ThisWorkbook.ActiveSheet.Range("A1").AutoFilter _ Field:=1, _ Criteria1:="<>みかん", _ Operator:=xlAnd, _ Criteria2:="<>りんご" End Sub※「 Field:=1 」は A列 です。
パターン2:Transpose関数とFilter関数を併用する方法
Sub Sample() Dim Target As Variant Target = Application.Transpose(ThisWorkbook.ActiveSheet.Range("A2:A" & Cells(Rows.Count, 1).End(xlUp).Row)) Target = Filter(Target, "みかん", False) Target = Filter(Target, "りんご", False) ActiveSheet.Range("A1").AutoFilter _ Field:=1, _ Criteria1:=Target, _ Operator:=xlFilterValues End Sub※「 Field:=1 」は A列 です。
結果
実行前のテーブル
抽出結果から行番号を取得
※行番号を Debug.Print で イミディエイトウィンドウに表示させます。Sub Sample() 'オートフィルタ ThisWorkbook.ActiveSheet.Range("A1").AutoFilter _ Field:=1, _ Criteria1:="みかん" Dim MaxRow As Long Dim r As Long MaxRow = ThisWorkbook.ActiveSheet.Range("A1").CurrentRegion.Rows.Count '行番号取得 For r = 2 To MaxRow If ThisWorkbook.ActiveSheet.Cells(r, 1).EntireRow.Hidden = False Then Debug.Print r & " 行目 " & Cells(r, 1) End If Next End Sub※「 Field:=1 」は A列 です。
結果のイミディエイトウィンドウ
3 行目 みかん
6 行目 みかん
実行前のテーブル
その他編
Criteria プロパティでの条件指定例
条件例 | 結果例 |
---|---|
Criteria1:="みかん" | みかん |
Criteria1:="<>みかん" | みかん以外 |
Criteria1:="=" | (空白)のみ |
Criteria1:="<>" | (空白)以外 |
Criteria1:="*かん" | みかん、きょうかん、あくだいかん、etc |
Criteria1:="?かん" | みかん、やかん、じかん、おかん、etc |
Criteria1:="5" | 5 |
Criteria1:="=5" | 5 |
Criteria1:="<=5" | 5以下 |
Criteria1:=">=5" | 5以上 |
Criteria1:="<5" | 5未満 |
Criteria1:=">5" | 5超過 |
Criteria1:="2019/5/26" | 2016/5/26の日付 |
Criteria1:="=2019/5/26" | 2016/5/26の日付 |
Criteria1:=">=2019/5/26" | 2016/5/26以降の日付 |
Criteria1:="<=2019/5/26" | 2019/5/26以前の日付 |
Criteria1:=">2019/5/26" | 2019/5/26より後の日付 |
Criteria1:="<2019/5/26" | 2019/5/26より前の日付 |
日付指定の注意点
セルの書式は「日付」であること。また、セルの表示形式が 2019/5/26 であれば、Criteria1:="2019/5/26" の記述にします。 セルの表示形式が 2019/05/26 であれば、Criteria1:="2019/05/26" の記述にします。表示形式に相違があるだけでフィルタにヒットしないためご注意ください。
抽出データを他シートへコピー&ペースト
下の記事をご参考までに。オートフィルタでデータ集計
下の記事をご参考までに。XlAutoFilterOperator クラスの説明
フィルタによって適用される 2 つの条件を関連付けるために使用する演算子を指定します。名前 | 説明 |
---|---|
xlor | 引数 criteria1 または Criteria2 の論理和 |
xland | 引数 criteria1 および Criteria2 の論理積 |
xlfiltervalues | フィルターの値 |
xlBottom10Items | 表示される最低値項目 (引数 criteria1 で指定されているアイテムの数) |
xlBottom10Percent | 表示される最低値項目 (引数 criteria1 で指定される割合) |
xlfiltercellcolor | セルの色 |
xlfilterdynamic | 動的フィルター |
xlfilterfontcolor | フォントの色 |
xlfiltericon | フィルター アイコン |
xlTop10Items | 表示される最高値項目 (引数 criteria1 で指定されているアイテムの数) |
xlTop10Percent | 表示される最高値項目 (引数 criteria1 で指定される割合) |
ディスカッション
コメント一覧
AutoFilterメソッドによる使用例があまりなかったため、
大変参考になりました。
2.1.Criteria プロパティでの条件指定例について、
13~15件 2016と2019で相違があると思われます。