VBAでエクセルのオートフィルタ機能を使用してデータを絞り込む方法についてご紹介します。
文字列・数値(以上・以下)・日付範囲の絞込み方法、表の範囲の指定方法(最終行・最終列を取得する方法)など詳細に説明していますので、下の見出しをクリックしてご覧ください。
文字列で絞り込む方法
まずは基本的なオートフィルタの設定方法について。
下のような販売データの表があったとします。A列の分類が「魚」のものだけを絞り込みたい場合の例で説明します。
左の図が実行前、右の図が実行後で「魚」で絞込みがされています。
AutoFilterメソッドは以下のように記述します。
A1セルの表範囲に対して、オートフィルタを設置します。
「field:=1」は1列目を表していて「Criteria1:=”魚”」で「魚」という文字列で絞り込んでいます。
'範囲指定:A1の表範囲
'絞込み列:1列目
'絞込みの値:魚
ActiveSheet.Range("A1").AutoFilter field:=1, Criteria1:="魚"
ちなみに「魚」以外のもので絞り込みたい場合は下のように書きます。
「<>」で除外するということを表しています。
「ActiveSheet.Range(“A1″).AutoFilter field:=1, Criteria1:=”<>魚”」
数値で絞り込む方法(以上・以下)
次の例ではC列の販売数の数字で「100」以上のデータで絞り込んでいます。
数値で絞り込む場合は、特定の値(例えば「100」)で絞り込む場合は「Range(“A1”).AutoFilter 3, 100」の書き方で良いですが、よくあるのは~以上や~以下で絞り込みたい場合が多いです。その場合は文字列のように””で囲んで指定します。
'<数値データの絞込み>
'範囲指定:A1の表範囲
'絞込み列:3列目(販売数)
'絞込みの値:100以上
Range("A1").AutoFilter 3, ">=100"
日付期間で絞り込む方法
日付データを期間で絞り込みたい場合について。
左の図のようなデータがあり、C列の入荷日の列に2024/8/1~8/12までの日付が入っています。
右の図は2024/8/4~2024/8/6の期間で絞り込んだ後です。
日付の範囲で絞り込みたい場合は以下のように記述します。
カンマ区切りで「xlAnd」を使用して2024/8/4以上で且つ2024/8/6以下の日付で絞り込んでいます。
'<日付データの絞込み>
'範囲指定:A1の表範囲
'絞込み列:3列目(入荷日)
'絞込みの値:2024/8/4~2024/8/6まで
Range("A1").AutoFilter 3, ">=2024/8/4", xlAnd, "<=2024/8/6"
オートフィルタの設定(表の範囲の指定方法)
範囲の指定方法は1つのセルを指定して、そのセルが含まれる表の範囲を指定する方法と、表の範囲をどこから~どこまでと行列位置を指定する方法があります。
A1セルの表の範囲を指定して設定する場合は以下のようにVBAコードを書きます。
※1番シンプルな書き方ですが、間に空白の行が入っているとその上までの部分しか表範囲として認識してくれないので注意が必要です。
'範囲指定:A1の表範囲
'絞込み列:1列目
'絞込みの値:魚
ActiveSheet.Range("A1").AutoFilter field:=1, Criteria1:="魚"
左の図が絞り込む前の図です。8行目に空白の行があるのでA1セルの表範囲を指定するとC7セルまでの範囲しか認識してくれません。
表の範囲の方法を列数・行数を指定して書く場合は以下のように書きます。
この表の場合は1行目~13行目まで、1列目~3列目までを指定しています。
'<表の範囲を数値で指定>
'1列目が「魚」のもので絞込み
'範囲指定(列・行数指定)
ActiveSheet.Range(Cells(1, 1), Cells(13, 3)).AutoFilter field:=1, Criteria1:="魚"
間に空白行が含まれていない場合はどちらも同じ結果になります。
オートフィルタの設定(最終行・最終列を取得して範囲を指定)
表の範囲を自動取得して設定したい場合は以下のように最終行・最終列を調べてから範囲の指定に使用します。
'<表の範囲を最終列・最終行で指定>
'範囲指定:最終行・最終列
'絞込み列:1列目
'絞込みの値:魚
Dim LastCol As Integer
Dim LastRow As Integer
'1行目の最終列数を取得(LastColに3が代入される)
LastCol = ActiveSheet.Cells(1, Columns.Count).End(xlToLeft).Column
'1列目の最終行数を取得(LastRowに13が代入される)
LastRow = ActiveSheet.Cells(Rows.Count, 1).End(xlUp).Row
'フィルタで絞込み
ActiveSheet.Range(Cells(1, 1), Cells(LastRow, LastCol)).AutoFilter field:=1, Criteria1:="魚"
▽絞込み前と絞込み後のイメージ
複数条件(1列の中で複数の条件に一致)で絞り込む
1つの列の中で複数の条件で絞込みを行いたい場合は以下のように記述します。
例えばA列の分類が「野菜」と「魚」ものだけを絞り込みたい場合。
カンマ区切りで「xlOr」を挟んで条件を追加すると複数の条件での絞込みが可能です。
'<1つの列で複数条件の絞込み>
'範囲指定:A1の表範囲
'絞込み列:1列目
'絞込みの値(複数条件):「魚」or「野菜」
ActiveSheet.Range("A1").AutoFilter 1, "魚", xlOr, "野菜"
▽絞込み前と絞込み後のイメージ
複数条件(複数列)で絞り込む
複数の列で絞込みを行いたい場合についてです。
A列の分類が「野菜」か「魚」のもので、C列の販売数が100以上の商品のみに絞り込みたい場合は以下のように書きます。
複数の列で絞込みを行う場合はまとめて記述した方が見やすいため、Withで囲んで記述しています。
'<複数列で絞込み・数が○○以上>
'範囲指定:A1の表範囲
'絞込み条件①:1列目の分類が「野菜」or「魚」
'絞込み条件②:3列目の販売数が100以上のもの
With ActiveSheet.Range("A1")
.AutoFilter 1, "野菜", xlOr, "魚*" '条件①
.AutoFilter 3, ">100" '条件②
End With
▽絞込み前と絞込み後のイメージ
文字列の部分一致(ワイルドカード)で絞り込む
絞り込みたい文字列を「~の文字を含む」のようなあいまい条件することも可能です。
A列の「分類」の値が「野」の文字を含むものだけに絞り込みたい場合は以下のようにアスタリスク「*」で調べたい文字を囲んで条件を設定します。
'<あいまい条件(ワイルドカード)>
'範囲指定:A1の表範囲
'絞込み列:1列目
'絞込みの値:「野」の文字を含む
ActiveSheet.Range("A1").AutoFilter 1, "*野*"
▽絞込み前と絞込み後のイメージ
オートフィルタの関連記事
オートフィルタを使用したデータの並び替えや、すべて選択・解除させる方法、絞込み後のデータ操作方法については↓の記事で紹介していますのでこちらもよかったらご覧ください。
※コードのコピー利用について
・コードのコピーは自由におこなっていただけます。
・気を付けて作成はしていますがコードには誤りがある可能性があります。
・自身の環境で動作確認をしていますが、すべての方の環境で同様に動くことは保証できません。
・データの破損等の責任は負いかねますのでご自身の責任のもとお使いください。