Excelのテーブル(ListObject)は、表形式のデータ管理に便利なだけでなく、フィルタ機能と組み合わせることで分析や抽出作業を大幅に効率化できます。
VBAを使えば「特定の列を条件で絞り込む」「複数条件でフィルタする」といった操作を自動化でき、日々の作業を効率化できます。
本記事では、テーブルでのフィルタの基本操作から応用的な使い方まで、サンプルコード付きで解説します。
目次
1. テーブルにおけるフィルタの基本
テーブル(ListObject)は、Excel上で既にフィルタ機能が有効になっています。
VBAから制御する場合は以下の方法があります。
- ListObject.AutoFilter → テーブル専用のフィルタを利用
- Range.AutoFilter → 通常のセル範囲に対するフィルタを利用
どちらも有効ですが、テーブルに対してはListObjectを使ったほうが保守性が高いのがポイントです。
2. 特定列を条件でフィルタする
例として、以下のような「Table1」があるとします。
| 担当者 | 商品 | 数量 | 日付 |
|---|---|---|---|
| 佐藤 | 商品A | 10 | 2025/10/01 |
| 鈴木 | 商品B | 20 | 2025/10/01 |
| 田中 | 商品A | 30 | 2025/10/02 |
このテーブルで「商品=商品A」だけを抽出するコードは以下です。
Sub テーブルフィルタ_特定列()
Dim ws As Worksheet
Dim lo As ListObject
Set ws = ThisWorkbook.Sheets("Sheet1")
Set lo = ws.ListObjects("Table1")
'商品列に「商品A」のフィルタを適用
lo.Range.AutoFilter Field:=lo.ListColumns("商品").Index, Criteria1:="商品A"
End Sub
ポイント
lo.Range.AutoFilterを使用してフィルタを設定Field:=lo.ListColumns("商品").Index→ 「商品」列を列番号で指定(列名で動的に参照できるため便利)Criteria1:="商品A"→ 抽出条件
3. 複数条件でのフィルタ
商品列に対して 「商品A」または「商品B」 を抽出する場合は、Criteria1 と Criteria2 を併用します。
Sub テーブルフィルタ_複数条件()
Dim ws As Worksheet
Dim lo As ListObject
Set ws = ThisWorkbook.Sheets("Sheet1")
Set lo = ws.ListObjects("Table1")
'商品列で「商品A」と「商品B」を抽出
lo.Range.AutoFilter _
Field:=lo.ListColumns("商品").Index, _
Criteria1:="商品A", _
Operator:=xlOr, _
Criteria2:="商品B"
End Sub
ポイント
Operator:=xlOrを使うと「OR条件」で抽出Operator:=xlAndを使えば「AND条件」(数値の範囲など)を実現可能
4. 数値や日付での応用例
数量が 10以上50以下 のデータを抽出するコードです。
Sub テーブルフィルタ_数値条件()
Dim ws As Worksheet
Dim lo As ListObject
Set ws = ThisWorkbook.Sheets("Sheet1")
Set lo = ws.ListObjects("Table1")
'数量が10以上50以下の行を抽出
lo.Range.AutoFilter _
Field:=lo.ListColumns("数量").Index, _
Criteria1:=">=10", _
Operator:=xlAnd, _
Criteria2:="<=50"
End Sub
同様に、日付の範囲指定も可能です。
5. フィルタを解除する
設定したフィルタを解除する場合は以下のように書きます。
Sub テーブルフィルタ解除()
Dim ws As Worksheet
Dim lo As ListObject
Set ws = ThisWorkbook.Sheets("Sheet1")
Set lo = ws.ListObjects("Table1")
'全フィルタを解除
lo.AutoFilter.ShowAllData
End Sub
6. Range.AutoFilterとの使い分け
- ListObject.AutoFilter(推奨)
→ テーブルに適用する場合に便利。列の追加や位置変更に強い。 - Range.AutoFilter
→ 通常の範囲を指定してフィルタをかけたい場合に使う。ws.Range("A1:D10").AutoFilter Field:=2, Criteria1:="商品A"
テーブルを使う場合は、基本的に ListObjectを経由して指定したほうが保守性が高くエラーも少なくなります。
7. まとめ
- テーブルのフィルタは Range.AutoFilter を用いて制御できる
- 列は
lo.ListColumns("列名").Indexで参照すると位置が変わっても安全 - 複数条件の設定(
Criteria1とCriteria2)や、数値・日付の範囲指定も可能 - フィルタ解除は
lo.AutoFilter.ShowAllDataを使う
コメント