Excel VBA 逆引き集 | オートフィルタの設定

Excel VBA
スポンサーリンク

オートフィルタの設定

フィルタは「条件で必要な行だけを見せる」機能。VBAでは Range.AutoFilter を使って、文字・数値・日付・複数条件(AND/OR)まで柔軟に絞り込めます。初心者でも迷わないように、最短コードから定番テンプレート、テーブル対応、可視行の後処理までを整理しました。


基本構造と最短コード

Sub AutoFilter_Basic()
    '見出しが A1、表は A1 からの連続領域(CurrentRegion)
    Dim rg As Range
    Set rg = Range("A1").CurrentRegion

    'B列(Field:=2)で「営業A」を抽出
    rg.AutoFilter Field:=2, Criteria1:="=営業A"
End Sub
VB
  • 対象範囲: 見出しセルから CurrentRegion を取ると安全。見出しの行が含まれていることが重要。
  • Field番号: 見出し左端を1として数える。B列なら Field:=2。
  • 条件指定: 文字は “=”, 数値は比較演算(>= など)、日付も直接指定可能。

目的別テンプレート(文字・数値・日付・複数条件)

'文字一致(例:担当が「営業A」)
Sub Filter_Text_Equal()
    Range("A1").CurrentRegion.AutoFilter Field:=2, Criteria1:="=営業A"
End Sub

'部分一致(例:「緊急」を含む)
Sub Filter_Text_Contains()
    Range("A1").CurrentRegion.AutoFilter Field:=5, Criteria1:="=*緊急*"
End Sub

'数値しきい値(例:金額が10万以上)
Sub Filter_Number_GreaterEqual()
    Range("A1").CurrentRegion.AutoFilter Field:=6, Criteria1:=">=100000"
End Sub

'数値の範囲(AND)(例:10万〜50万)
Sub Filter_Number_Between()
    Range("A1").CurrentRegion.AutoFilter _
        Field:=6, Criteria1:=">=100000", Operator:=xlAnd, Criteria2:="<=500000"
End Sub

'OR条件(同一列で複数値)(例:東京、大阪、福岡)
Sub Filter_Text_OR_Array()
    Range("A1").CurrentRegion.AutoFilter _
        Field:=3, Criteria1:=Array("東京", "大阪", "福岡"), Operator:=xlFilterValues
End Sub

'日付の範囲(例:開始〜終了)
Sub Filter_Date_Range()
    Dim rg As Range, d1 As Date, d2 As Date
    Set rg = Range("A1").CurrentRegion
    d1 = DateSerial(2025, 1, 1)
    d2 = DateSerial(2025, 12, 31)
    rg.AutoFilter Field:=4, Criteria1:=">=" & d1, Operator:=xlAnd, Criteria2:="<=" & d2
End Sub

'列をまたいだ AND(例:部門=営業 AND 金額>=10万)
Sub Filter_MultiColumn_AND()
    Dim rg As Range: Set rg = Range("A1").CurrentRegion
    rg.AutoFilter Field:=2, Criteria1:="=営業"
    rg.AutoFilter Field:=6, Criteria1:=">=100000"
End Sub
VB
  • 文字の部分一致: ワイルドカードを使う(*任意文字、?任意1文字)。
  • ORの配列指定: Operator:=xlFilterValues をセット。リスト型の一致に強い。
  • 日付: 文字列ではなく Date を結合。シリアル値で比較されるため安定。

テーブル(ListObject)にフィルタを設定

Sub AutoFilter_ListObject_ByName()
    Dim lo As ListObject
    Set lo = ActiveSheet.ListObjects("売上テーブル")

    '列名で指定して絞り込み(担当=営業A、金額>=10万)
    lo.Range.AutoFilter Field:=lo.ListColumns("担当").Index, Criteria1:="=営業A"
    lo.Range.AutoFilter Field:=lo.ListColumns("金額").Index, Criteria1:=">=100000"
End Sub
VB
  • 列名で特定: ListColumns(“列名”).Index が定番。列順が変わっても壊れにくい。
  • 対象範囲: lo.Range を使うと見出し含むテーブル全体に安定してフィルタできる。

可視行だけの後処理(コピー・削除・集計)

'可視行だけコピー(データ部のみ)
Sub Copy_VisibleRows()
    Dim rg As Range, vis As Range
    Set rg = Range("A1").CurrentRegion
    rg.AutoFilter Field:=2, Criteria1:="=営業A"

    On Error Resume Next
    Set vis = rg.Offset(1).Resize(rg.Rows.Count - 1).SpecialCells(xlCellTypeVisible)
    On Error GoTo 0

    If Not vis Is Nothing Then
        vis.Copy Destination:=Range("H2")
    End If
End Sub

'可視行だけ削除(要注意:元データが消えます)
Sub Delete_VisibleRows()
    Dim rg As Range, vis As Range
    Set rg = Range("A1").CurrentRegion
    rg.AutoFilter Field:=6, Criteria1:="=0" '金額=0

    On Error Resume Next
    Set vis = rg.Offset(1).Resize(rg.Rows.Count - 1).SpecialCells(xlCellTypeVisible)
    On Error GoTo 0

    If Not vis Is Nothing Then
        vis.EntireRow.Delete
    End If
End Sub

'可視セルだけ合計(E列)
Sub Sum_VisibleAmount()
    Dim rg As Range, vis As Range, s As Double, c As Range
    Set rg = Range("A1").CurrentRegion
    rg.AutoFilter Field:=2, Criteria1:="=営業A"

    On Error Resume Next
    Set vis = rg.Offset(1).Resize(rg.Rows.Count - 1).Columns(5).SpecialCells(xlCellTypeVisible)
    On Error GoTo 0

    If Not vis Is Nothing Then
        For Each c In vis
            s = s + Val(c.Value)
        Next
        Range("G2").Value = s
    End If
End Sub
VB
  • データ部に限定: Offset(1) と Resize で見出しを除去して対象にするのが定番。
  • 0件対策: SpecialCells はヒット0件でエラー。On Error と Nothing チェックで安全運用。

例題で練習(実務シナリオ)

'例題1:営業Aの今月分だけ表示(担当=営業A、日付=今月)
Sub Example_Month_Filter()
    Dim rg As Range: Set rg = Range("A1").CurrentRegion
    Dim d1 As Date, d2 As Date
    d1 = DateSerial(Year(Date), Month(Date), 1)
    d2 = DateSerial(Year(Date), Month(Date) + 1, 0)

    rg.AutoFilter Field:=2, Criteria1:="=営業A"                      '担当
    rg.AutoFilter Field:=4, Criteria1:=">=" & d1, Operator:=xlAnd, _  '日付
                       Criteria2:="<=" & d2
End Sub

'例題2:都市が東京/大阪/名古屋、かつ金額30万以上
Sub Example_OR_AND()
    Dim rg As Range: Set rg = Range("A1").CurrentRegion
    rg.AutoFilter Field:=3, Criteria1:=Array("東京", "大阪", "名古屋"), Operator:=xlFilterValues
    rg.AutoFilter Field:=6, Criteria1:=">=300000"
End Sub

'例題3:フィルタを安全にかけ直し→可視行にフラグ列を付与
Sub Example_ResetApplyFlag()
    Dim ws As Worksheet: Set ws = ActiveSheet
    Dim rg As Range, vis As Range, c As Range
    Set rg = ws.Range("A1").CurrentRegion

    If ws.FilterMode Then ws.ShowAllData              '解除
    rg.AutoFilter Field:=5, Criteria1:="=*重要*"      '再適用

    On Error Resume Next
    Set vis = rg.Columns(1).SpecialCells(xlCellTypeVisible) '見出し列に限定
    On Error GoTo 0

    If Not vis Is Nothing Then
        For Each c In vis
            If c.Row > rg.Row Then Cells(c.Row, "G").Value = "対象"
        Next
    End If
End Sub
VB
  • 月の範囲: DateSerialで月初・月末を作ると定番の月フィルタが簡単。
  • OR+AND: 同一列はOR配列、別列はANDとしてフィルタを重ねる。
  • 安全運用: 既存フィルタの解除→再設定→可視セル処理の順が安定。

実務の落とし穴と対策

  • 対象範囲の誤り: 見出しを含む範囲に対して AutoFilter する。CurrentRegion 基準が安全。
  • Field番号のズレ: 見出し左端が1。列文字ではなく「見出しからの列番号」で指定する。
  • OR配列の使い分け: 文字一致のORは Criteria1:=Array(…), Operator:=xlFilterValues。範囲比較と混同しない。
  • 0件エラー: SpecialCells は0件でエラー。On Error と Nothing チェックをテンプレート化。
  • フィルタの解除忘れ: ShowAllData で初期化してから新条件を適用すると誤動作が減る。
  • テーブルとの違い: 通常範囲は Range.AutoFilter、テーブルは lo.Range.AutoFilter+列名指定が堅牢。
タイトルとURLをコピーしました