この記事では、VBAでの抽出処理に使用する、AutoFilterメソッドの使用方法を解説します。
基本的な記述方法から、使用方法・抽出結果の加工例まで、例示しながら解説していきます。
VBA関連解説
Excelのオートフィルター機能
AutoFilterメソッドは、Excelのオートフィルターの抽出機能を再現したものともいえます。
Excelのオートフィルターはデータタブの並べ替えとフィルターにある、フィルターボタンで設定できます。
フィルターボタンをクリックすると、リストのヘッダー部に矢印ボタンが表示されます。
矢印ボタンをクリックすると、オートフィルター機能が使用できます。
VBAでは、これらのオートフィルター機能のうち抽出に関する機能が、AutoFilterメソッドで再現できます。
AutoFilterメソッドの構文
VBAでは、データの抽出にAutoFilterメソッドを使用します。
基本構文
AutoFilret メソッドは、リストデータを指定の条件で抽出します。
AutoFilter 構文
Range("A1").AutoFilter Field, Criteria1, Operator, Criteria2
構文例では、Range("A1")を指定していますが、指定するセルは、リストデータの中のセルを指定すれば、表全体にオートフィルターが設定されます。
引数の設定は下表のようになります。
AutoFilter 引数
使用方法
使用方法については、下記サンプルを実際に処理した結果とともに解説します。
抽出サンプル
設定解除
AutoFilter 設定解除
Sub AutoFilter_SET() Range("A1").AutoFilter End Sub
.AutoFilterを記述すると、オートフィルターが設定されてない時は設定し、設定されている時は解除するコードとなります。
基本例
AutoFilter 基本例
Sub AutoFilter_BASE() Range("A1").AutoFilter 1, "山田" End Sub
抽出結果
上記コードは、1列目を山田で抽出する、AutoFilterメソッドの最もシンプルな例です。
引数は左から順に指定していきますので、引数名は省略しています。
あいまい条件
AutoFilter あいまい条件
Sub AutoFilter_WILD() Range("A1").AutoFilter 1, "*田*" End Sub
抽出結果
上記コードは、1列目を田を含むで抽出する、AutoFilterメソッドの例です。
サンプルのように、条件にはワイルドカードが使用可能です。
AND条件
AutoFilter AND条件
Sub AutoFilter_AND() Range("A1").AutoFilter 2, ">=80", xlAnd, "<=85" End Sub
抽出結果
上記コードは、2列目を80以上かつ85以下で抽出する、AutoFilterメソッドの例です。
引数 Operator には xlAnd を指定します。
OR条件
AutoFilter OR条件
Sub AutoFilter_OR() Range("A1").AutoFilter 1, "太田", xlOr, "田中" End Sub
抽出結果
上記コードは、1列目を太田または田中で抽出する、AutoFilterメソッドの例です。
引数 Operator には xlOr を指定します。
複数条件
AutoFilter 複数条件
Sub AutoFilter_配列() Dim A(2) As String A(0) = "佐藤" A(1) = "鈴木" A(2) = "斎藤" Range("A1").AutoFilter 1, A, xlFilterValues End Sub
抽出結果
上記コードは、配列を使用して複数条件で抽出する、AutoFilterメソッドの例です。
引数 Operator には xlFilterValuesを指定します。
抽出結果の加工例
件数の取得
AutoFilter 件数
Sub AutoFilter_COUNT() Range("A1").AutoFilter 1, "*田*" Range("D2").Value = WorksheetFunction.Subtotal(3, Range(Cells(1, 2), Cells(Rows.Count, 2).End(xlUp))) - 1 Range("A1").AutoFilter End Sub
抽出結果
上記コードは、1列目を田を含むで抽出し、D2セルに件数を出力する例です。
SUBTOTAL関数は引数3で件数を計算します。ヘッダーもカウントされるので、結果を-1します。
3行目の .AutoFilter でオートフィルターを解除します。
合計の取得
AutoFilter 合計
Sub AutoFilter_TOTAL() Range("A1").AutoFilter 1, "*田*" Range("D2").Value = WorksheetFunction.Subtotal(9, Range(Cells(1, 2), Cells(Rows.Count, 2).End(xlUp))) Range("A1").AutoFilter End Sub
抽出結果
上記コードは、1列目を田を含むで抽出し、D2セルに合計を出力する例です。
SUBTOTAL関数は引数9で合計を計算します。
3行目の .AutoFilter でオートフィルターを解除します。
平均の取得
AutoFilter 平均
Sub AutoFilter_AVERAGE() Range("A1").AutoFilter 1, "*田*" Range("D2").Value = WorksheetFunction.Subtotal(1, Range(Cells(1, 2), Cells(Rows.Count, 2).End(xlUp))) Range("A1").AutoFilter End Sub
抽出結果
上記コードは、1列目を田を含むで抽出し、D2セルに平均を出力する例です。
SUBTOTAL関数は引数1で平均を計算します。
3行目の .AutoFilter でオートフィルターを解除します。
抽出結果のコピー
AutoFilter COPY
Sub AutoFilter_COPY() Range("A1").AutoFilter 1, "*田*" Range("A1").CurrentRegion.Copy Range("D1") Range("A1").AutoFilter End Sub
抽出結果
上記コードは、1列目を田を含むで抽出し、D1セルを基準に抽出結果を出力する例です。
CurrentRegion を使用し抽出結果の表全体を選択することがポイントです。
3行目の .AutoFilter でオートフィルターを解除します。
詳細設定(フィルターオプション)
オートフィルターでは、データを直に加工して抽出結果を取得しますが、データを直接加工したくない場面もあります。
そこで、抽出領域を作成して抽出結果を取得する方法として、詳細設定(フィルターオプション)の機能があります。
下記の記事では、フィルターオプションの使用方法を解説していますので、参考にしてください。
www.minizaiko.com
概要解説に戻る