AutoFilter は「表に“絞り込み”をかけるための仕組みをコードで操作するもの」
まずイメージから。
AutoFilter は、シート上の“表”に対して「この条件に合う行だけ表示して」と絞り込みをかける機能です。
普段、リボンの「フィルター」ボタンを押して、列の▼から条件を選んでいますよね。
あれを VBA でやるのが Range.AutoFilter です。
ポイントは次の3つです。
- どの範囲を「表」とみなすか(ヘッダー行を含む範囲)
- どの列を基準にフィルターするか(Field)
- どんな条件で絞り込むか(Criteria)
この3つをセットで考えられるようになると、一気に扱いやすくなります。
一番基本:ヘッダー付きの表にフィルターをかける
「A1:D20 を表」として、C列が「完了」の行だけ表示する
Sub SampleAutoFilterBasic()
Dim ws As Worksheet
Dim rng As Range
Set ws = ThisWorkbook.Worksheets("入力")
' A1:D20 を「ヘッダー付きの表」として指定
Set rng = ws.Range("A1:D20")
' C列(3列目)で「完了」の行だけ表示
rng.AutoFilter Field:=3, Criteria1:="完了"
End Sub
VBここでやっていることを分解します。
rngは「表全体の範囲」。必ずヘッダー行(項目名の行)を含めます。Field:=3は「表の左から数えて3番目の列」、つまり C列を意味します。Criteria1:="完了"は「その列の値が“完了”の行だけ表示して」という条件です。
重要なのは、「Field は“表の中での列番号”」ということです。
シート上で C列だから 3、ではなく、「rng の左から 3 番目」という数え方をします。
AutoFilter の基本パラメータをしっかり押さえる
Field(どの列で絞るか)
Field:=1 → 表の1列目(rng の左端の列)Field:=2 → 表の2列目Field:=3 → 表の3列目
というように、「表の中での列番号」で指定します。
A列だから 1、B列だから 2、というのと結果的には同じことが多いですが、
「必ず“表の左から何番目か”で考える」と覚えておくと混乱しません。
Criteria1(どんな条件か)
一番シンプルなのは「完全一致」です。
rng.AutoFilter Field:=3, Criteria1:="完了"
VBこのほかにも、次のような書き方ができます。
Criteria1:=">100"(100より大きい)Criteria1:="<=0"(0以下)Criteria1:="=*東京*"(「東京」を含む文字列)
文字列のあいまい検索では *(ワイルドカード)をよく使います。
よくあるパターン:複数条件・複数列でのフィルター
同じ列で「A または B」を絞り込む(OR 条件)
Sub SampleAutoFilterMultiCriteria()
Dim ws As Worksheet
Dim rng As Range
Set ws = ThisWorkbook.Worksheets("入力")
Set rng = ws.Range("A1:D20")
' C列が「完了」または「保留」
rng.AutoFilter Field:=3, Criteria1:="完了", Operator:=xlOr, Criteria2:="保留"
End Sub
VBここでは、
- Field:=3 → C列
- Criteria1:=”完了”
- Criteria2:=”保留”
- Operator:=xlOr → 「どちらかに一致すれば表示」
という意味になります。
別の列と組み合わせる(AND 条件)
AutoFilter は「列ごとに条件を設定」するイメージです。
例えば、「C列が完了」かつ「D列が 100 以上」の行だけ表示したい場合。
Sub SampleAutoFilterMultiField()
Dim ws As Worksheet
Dim rng As Range
Set ws = ThisWorkbook.Worksheets("入力")
Set rng = ws.Range("A1:D20")
' まず C列で「完了」
rng.AutoFilter Field:=3, Criteria1:="完了"
' 次に D列で「100以上」
rng.AutoFilter Field:=4, Criteria1:=">=100"
End Sub
VB同じ rng.AutoFilter を、Field を変えて複数回呼ぶことで、
「列ごとの条件」を積み重ねていくイメージです。
フィルターを解除する・全部表示に戻す
AutoFilter を解除する(フィルター自体をオフ)
Sub SampleAutoFilterOff()
Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets("入力")
If ws.AutoFilterMode Then
ws.AutoFilterMode = False
End If
End Sub
VBAutoFilterMode が True のときに False を入れると、
そのシートのフィルター機能自体がオフになります(▼も消える)。
条件だけクリアして、フィルターは残す(全件表示)
「フィルター機能は残したまま、条件だけ解除して全部表示したい」場合は、
ヘッダー行の AutoFilter を「条件なし」で呼びます。
Sub SampleAutoFilterShowAll()
Dim ws As Worksheet
Dim rng As Range
Set ws = ThisWorkbook.Worksheets("入力")
Set rng = ws.Range("A1").CurrentRegion ' 表全体を自動認識する例
If ws.AutoFilterMode Then
rng.AutoFilter ' 引数なしで呼ぶと「全件表示」に近い動き
End If
End Sub
VBCurrentRegion は「空白行・空白列で囲まれた“かたまり”」を表すので、
ヘッダー行から表全体をつかむときによく使われます。
AutoFilter を使うときに意識してほしい重要ポイント
「表の範囲」と「Field の番号」を常にセットで考える
AutoFilter で一番混乱しやすいのは、「Field の番号」です。
ここをミスると、全然違う列でフィルターされてしまいます。
必ず、頭の中でこう整理してください。
- まず「表全体の範囲」を決める(ヘッダー行を含める)
- その表の左から何番目の列を絞り込みたいかを数える
- その番号を Field に入れる
例えば、表が B2:E100 にあるなら、
- B列 → Field:=1
- C列 → Field:=2
- D列 → Field:=3
- E列 → Field:=4
という対応になります。
「どのシートの、どの表にフィルターをかけているか」を明示する
避けたい書き方の例です。
Range("A1:D20").AutoFilter Field:=3, Criteria1:="完了"
VBこれは「アクティブなシートの A1:D20」を前提にしているので、
シートが変わると意図しない表にフィルターをかけてしまうリスクがあります。
超初心者のうちから、あえてこう書く癖をつけてください。
ThisWorkbook.Worksheets("入力").Range("A1:D20").AutoFilter Field:=3, Criteria1:="完了"
VBあるいは変数を使って:
Dim ws As Worksheet
Dim rng As Range
Set ws = ThisWorkbook.Worksheets("入力")
Set rng = ws.Range("A1:D20")
rng.AutoFilter Field:=3, Criteria1:="完了"
VB「どのブック → どのシート → どの範囲(表) → どの列 → どんな条件」
という順番を崩さない書き方は、AutoFilter でもとても大事です。
まとめ:AutoFilter は「表に対する“絞り込み操作”をコードで再現するためのメソッド」
AutoFilter の本質は、
「ヘッダー付きの表(Range)に対して、“どの列をどんな条件で絞り込むか”を指定して、表示行を制御する」
ことです。
押さえておきたいポイントをコンパクトにまとめると、
- AutoFilter は「表全体の Range」に対して呼ぶ(ヘッダー行を含める)
- Field は「表の左から何番目の列か」で指定する
- Criteria1 で条件を指定し、必要に応じて Operator・Criteria2 で複数条件も書ける
- フィルター解除(AutoFilterMode=False)と、条件だけクリア(rng.AutoFilter)を使い分ける

