オートフィルタの設定
フィルタは「条件で必要な行だけを見せる」機能。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+列名指定が堅牢。
