
エクセルで作られた毎日の売り上げデータをチェックしているんだけど、
いちいちフィルタを作成して絞り込みするのがめんどう…。
マクロでササっとフィルタを自動化できないの?

なるほど…。
単純な作業ほど、数をこなすのがめんどうですよね…。
では今回は、「VBAコードを使ったマクロでフィルタを自動化する方法」を
VBAマクロ歴3年の私が、できるだけわかりやすく解説いたします。
エクセルのフィルタを自動化する方法(VBAマクロ)
「AutoFilter」を使います。
まずは実行見本をどうぞ。
実行見本
ひとまず全コードと実行結果をご覧ください。
解説は後ほど行います。
全コード
まずはフィルタのみ設定するコードです。
Sub フィルタを設定()
Sheets("Sheet1").Range("A1").AutoFilter
End Sub
※値の絞り込みまで自動化する方法は後述(フィルタの使い方いろいろ)
実行結果

解説
※わかりやすさを重視しております。厳密には解釈が異なる場合がありますことをご了承ください。
プロシージャの作成
Sub フィルタを設定()
End Sub
プロシージャなど、マクロの基礎は下記記事でわかりやすく解説しております。
コードだけではなく、開発タブの表示からマクロの保存まで知りたい方はご参考ください。
フィルタを設定
Sheets("Sheet1").Range("A1").AutoFilter
上記コードにて、フィルタを設定しております。
フィルタを設定したいシート(今回はSheet1)とA1セルを指定し、「.AutoFilter」を書いて完了です。
「AutoFilter」は大文字と小文字が混ざっていますのでご注意ください(AとFが大文字)
マクロが完成したら、実行して動作を確認してみましょう。

エクセル内に作成した自作のボタンを押してマクロを実行させることも可能です。
ボタンの作り方は、下記記事でわかりやすく解説しております。
こんなときはどうする?
エクセルで作られた表というのは、不要な行や余計なタイトルが入っていることが多いです。
よくあるパターンを2つ挙げ、対処法を解説いたします。
1行目に空白行がある

上図のとおり1行目に空白行がある場合、どうなるのでしょうか。
実は自動で空白行を判定して除外してくれます。
フィルタは下図のとおり、2行目以降に設定されますので安心してください。

1行目にタイトル行がある

では上図のとおり、1行目にタイトル行がある場合はどうなるのでしょうか。
普通にフィルターをかけると、下図のとおり1行目にフィルターが設定されてしまいます。

そんなときは、下記のコードを実行してください。
Sub フィルタを設定_2行目()
Sheets("Sheet1").Range("A2", "E2").AutoFilter
End Sub
「A2~E2」など、フィルターの範囲を指定することで、2行目以降にフィルターが設定されます。

フィルタの使い方いろいろ
前項ではフィルタを設定する方法のみを紹介いたしましたが、ここからは値を絞り込む方法やフィルタを解除する方法を紹介いたします。
値の絞り込み・並び替え
値の絞り込み方などもいろいろあり、今回はよく使う5つの方法を紹介いたします。
- 条件を指定して値を絞り込む
- 複数条件で値を絞り込む
- 特定の値を除外する
- 範囲で絞り込む
- 並び替えをする
条件を指定して値を絞り込む
Sub フィルタを設定()
Sheets("Sheet1").Range("A1").AutoFilter Field:=1, Criteria1:="A4"
End Sub
コードの2行目に注目してください。途中(AutoFilter)までは前項と同じです。
「Field」で絞り込みたい値がある列を指定します。
今回のように「Field:=1」ならA列を指定します。
B列を絞り込みたいなら、「Field:=2」といった具合です。
「Criteria1」で絞り込む値を指定します。
今回は「A4」という値のみを表示させます。
値は「”(ダブルクォーテーション)」で囲ってください。
これで、フィルタの作成と値の絞り込み(A列のA4表示)を同時に行うことができます。

複数条件で値を絞り込む
Sub フィルタを複数条件で設定()
Sheets("Sheet1").Range("A1").AutoFilter Field:=1, Criteria1:="A2", Criteria2:="A4", Operator:=xlOr
End Sub
上記コードを実行することで、複数条件で値を絞り込むことができます。
今回はA列の「A2」または「A4」を表示させます。
「Criteria1」に1つ目の値である「A2」を、
「Criteria2」に2つ目の値である「A4」を指定します。
そして、「Operator」に「または」という意味を持つ「xlOr」を指定して完了です。

「xlOr」の「O」は大文字ですのでご注意ください。
特定の値を除外する
特定の値を除外することも可能です。
A列にある「A2・A3・A4・A5」という値のうち、「A3」のみを非表示にしてみましょう。
そのコードが下記です。
Sub フィルタで値を除外()
Sheets("Sheet1").Range("A1").AutoFilter Field:=1, Criteria1:="<>A3"
End Sub
「Criteria1」に「A3」を指定するのですが、「<>A3」というふうに指定します。
これで「A3」を除外、つまりA3以外の値をすべて表示させることができます。

範囲で絞り込む
「3~5」のように、範囲で値を絞り込むこともできます。
Sub 範囲で絞り込む()
Sheets("Sheet1").Range("A1").AutoFilter Field:=1, Criteria1:=">=3", Criteria2:="<=5", Operator:=xlAnd
End Sub
「Criteria1」に「>=3」、「Criteria2」に「<=5」というふうに指定します。
「Operator」には、どちらの条件も満たす意味の「xlAnd」を指定してください。
これで、3以上5以下の値をすべて表示させることができます。

【範囲指定】
- >=5:5以上
- <=5:5以下
- >5:5を超える
- <5:5未満
- <>5:5以外
並び替えをする
Sub フィルタと昇順ソート()
Sheets("Sheet1").Range("A1").AutoFilter
With Sheets("Sheet1").Sort
.SortFields.Clear
.SortFields.Add2 Key:=Sheets("Sheet1").Range("B2"), Order:=xlAscending
.SetRange Sheets("Sheet1").Range("A1").CurrentRegion
.Header = xlYes
.Apply
End With
End Sub
上記コードを実行することで、B列の値を「昇順(小さい順)」に並び替えすることができます。

「降順(大きい順)」に並び替えたい場合は、「Order」の「xlAscending」を「xlDescending」に変えてください。
- Order:=xlAscending:昇順
- Order:=xlDescending:降順
フィルタを解除する
Sub フィルタを解除()
Sheets("Sheet1").AutoFilterMode = False
End Sub
上記コードを実行することで、フィルタを解除することができます。
うまく動作しないときの対処法
エラーが発生する
コンパイルエラー・実行時エラー
コードに問題がある場合が多いです。
「”」や()など、2つセットの記号が片方だけになっていないかなど、コードを再確認しましょう。
セル名を「”」で囲っていない場合でもエラーが発生します。
警告表示

上記の表示が出た場合は、マクロが無効になっています。
エクセルに表示された「コンテンツの有効化」をクリックするか、下記記事を参考にセキュリティ設定を変更してください。
最後に
VBAコードを使ったマクロでフィルタを自動化する方法を解説いたしました。
当ブログでは、VBAマクロやPythonなど、時間を生み出すプログラミング術を公開しております。
この記事がわかりやすいと感じた方は、他の記事も読んでいってください。
最後までお読みいただき、ありがとうございました。がんばってください!