VBAでフィルターを自動化する方法|AutoFilter・Date・xlOrの使い方

Excelのフィルター機能は便利ですが、毎回手動で条件を設定するのは手間がかかります。「今日発送する商品だけ表示したい」「特定の商品を複数まとめて絞り込みたい」という作業が毎日発生するなら、マクロでワンクリック化するのが効果的です。

この記事では、AutoFilter を使ったフィルター自動化の基本パターンと、複数条件・事前チェックの応用例を解説します。

今日の日付でフィルターをかけるには?

C列(発送日)に今日の日付が入っているデータだけを抽出するマクロです。

Sub FilterTodayShipment()
    Dim ws As Worksheet
    Set ws = Sheets("発送データ")

    ' 先にフィルターをクリア
    If ws.AutoFilterMode = True Then
        ws.AutoFilterMode = False
    End If

    ' 発送日が今日のデータのみ抽出
    ws.Range("A1").AutoFilter Field:=3, Criteria1:=Date

    MsgBox "本日発送のデータのみを抽出しました。"
End Sub

Field:=3 は3列目(C列)を条件列として指定します。Criteria1:=Date は「今日の日付」という条件です。毎日実行しても自動的に当日の日付で絞り込まれます。

複数の条件(OR条件)でフィルターをかけるには?

「商品A」または「商品B」のどちらかに一致する行を抽出するマクロです。

Sub FilterMultipleItems()
    Dim ws As Worksheet
    Set ws = ThisWorkbook.Sheets("商品リスト")

    If ws.AutoFilterMode = True Then
        ws.AutoFilterMode = False
    End If

    ' 商品名が「商品A」または「商品B」のデータを抽出
    ws.Range("A1").AutoFilter Field:=2, _
        Criteria1:="商品A", Operator:=xlOr, Criteria2:="商品B"

    MsgBox "商品A・商品Bのデータを抽出しました。"
End Sub

Operator:=xlOr が「または(OR条件)」の指定です。Criteria1Criteria2 に別々の値を指定し、xlOr で組み合わせます。AND条件にしたい場合は xlAnd を使います。

データが存在しないときに事前チェックするには?

フィルターをかける前にデータの有無を確認する処理を入れておくと、空のシートに対して実行した場合でも安全に止められます。

If Application.WorksheetFunction.CountA(ws.Range("A1").CurrentRegion) = 0 Then
    MsgBox "データがありません"
    Exit Sub
End If

CurrentRegion でA1セルを含むデータ範囲全体を参照し、CountA で値の件数を確認します。0件なら処理を中止します。

まとめ

  • AutoFilter Field:=列番号, Criteria1:=条件 でフィルターをかける
  • 実行前にAutoFilterMode = False で既存のフィルターをクリアする
  • Criteria1:=Date で毎回自動的に「今日の日付」を条件にできる
  • 複数条件は Operator:=xlOr(または)・xlAnd(かつ)で組み合わせる
  • 毎日繰り返す絞り込み作業ほどマクロによる自動化の効果が大きい

よくある質問

フィルターを解除(全件表示に戻す)するマクロはどう書きますか?

ws.AutoFilterMode = False でフィルターを完全に解除できます。フィルターは残したまま条件だけをクリアしたい場合は ws.Range("A1").AutoFilter Field:=列番号 と条件なしで実行します。

3つ以上の条件でフィルターをかけることはできますか?

AutoFilter 単体では2条件までが上限です。3つ以上の条件を扱いたい場合は、AutoFilter を複数回かける方法か、ループでデータを処理して別シートにコピーする方法が現実的です。

Field番号はどうやって調べればいいですか?

A列が1、B列が2、C列が3と、左から数えた列番号がそのまま Field の値になります。フィルター対象の列を確認してから番号を指定してください。

フィルター実行後に抽出件数を表示させることはできますか?

できます。ws.Range("A1").CurrentRegion.SpecialCells(xlCellTypeVisible).Rows.Count - 1 で可視行の件数を取得し、MsgBoxで表示できます。

特定の文字列を含む行を抽出(部分一致)するにはどうすればいいですか?

Criteria1:="*キーワード*" のようにアスタリスク(*)で囲むことで部分一致フィルターになります。前方一致なら "キーワード*"、後方一致なら "*キーワード" です。


動画で学びたい方へ

「記事を読んでも、実際に自分で書けるか不安…」という方には、動画で基礎からじっくり学べる講座がおすすめです。

VBAが初めての方を前提に、つまずきやすいポイントを先回りして解説しています。サンプル動画は無料でご覧いただけます。

動画で学ぶExcelマクロ|JIMOVEオンラインスクール

コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

上部へスクロール