Excel VBA | 超初心者(Excel操作+マクロ体験):Excelオブジェクト基礎 - AutoFilter

Excel VBA VBA
スポンサーリンク

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
VB

AutoFilterMode が 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
VB

CurrentRegion は「空白行・空白列で囲まれた“かたまり”」を表すので、
ヘッダー行から表全体をつかむときによく使われます。


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)を使い分ける

タイトルとURLをコピーしました