Excelでデータを絞り込むときによく使う「オートフィルタ」。
しかし、抽出後に「表示されている行だけを取得したい」「抽出結果を別シートへ転記したい」と思ったことはないでしょうか?
実は、VBAを使うとオートフィルタの抽出結果(可視セル)を簡単に取得・活用できます。
この記事では、基本の「抽出リストの取得」から「コピー」「ループ処理」「応用例」まで、実務ですぐに使える形で徹底解説します。
目次
- ✅ VBAでオートフィルタ結果を扱う基本構造
- 🔹 可視セルだけを取得する構文
- 🔹 例:抽出結果をコピーする基本構文
- ✅ オートフィルタの結果を取得する基本コード
- 🔹 サンプルデータ
- 🔹 コード例:営業部だけを抽出し、結果を取得
- ✅ フィルター結果を別シートに出力する方法
- 🔹 コード例:抽出リストを別シートにコピー
- 🔹 実務での応用例
- ✅ 抽出リストを配列に格納して使う
- 🔹 コード例:可視セルを配列に格納
- 💡 応用例:抽出データを合計
- ✅ 抽出条件(AutoFilterの状態)を取得する
- 🔹 コード例:フィルター条件を確認
- ✅ フィルター解除とエラー対策
- 🔹 フィルター解除テンプレート
- 🔹 エラー回避テンプレート
- ✅ 実務で役立つ応用例
- ① 抽出結果を日付フォルダに自動保存
- ② 抽出リストをメール送信
- ③ 定期レポート自動生成
- ■ まとめ:オートフィルタのリストを取得すればVBAの可能性が広がる
✅ VBAでオートフィルタ結果を扱う基本構造
オートフィルタを使うと、Excelの見た目上ではデータが絞り込まれます。
しかし、VBA上では「非表示になっている行」も含まれているため、単純にRangeをループしても正確に抽出結果を取得できません。
そのため、「可視セルだけを対象にする」ことが重要です。
🔹 可視セルだけを取得する構文
Range("範囲").SpecialCells(xlCellTypeVisible)
この構文を使うと、オートフィルタなどで表示されているセル(非表示を除く)だけを取得できます。
つまり、フィルター後のリストを正確に扱うための基本構文となります。
🔹 例:抽出結果をコピーする基本構文
Range("A1:D100").SpecialCells(xlCellTypeVisible).Copy
このコードは、現在フィルターで表示されている行だけをコピーします。
元データ全体ではなく、可視セルのみが対象になる点がポイントです。
参考:【VBA】条件に一致するセルを複数取得する方法|Find・For Each・SpecialCells
✅ オートフィルタの結果を取得する基本コード
ここから、実際に「フィルター条件を設定 → 抽出結果を取得」するVBAコードを紹介します。
🔹 サンプルデータ
部署 | 氏名 | 売上 |
---|---|---|
営業部 | 田中 | 120 |
開発部 | 鈴木 | 90 |
営業部 | 佐藤 | 150 |
総務部 | 伊藤 | 70 |
🔹 コード例:営業部だけを抽出し、結果を取得
Sub GetFilterList()
Dim rng As Range
Dim c As Range
' フィルターを設定
Range("A1:C10").AutoFilter Field:=1, Criteria1:="営業部"
' 抽出結果(可視セル)を取得
On Error Resume Next
Set rng = Range("A2:A10").SpecialCells(xlCellTypeVisible)
On Error GoTo 0
' 抽出結果を表示
If Not rng Is Nothing Then
For Each c In rng
Debug.Print c.Value
Next c
End If
' フィルター解除
ActiveSheet.AutoFilterMode = False
End Sub
🔹 処理の流れ
- A1:C10の範囲にフィルターを設定
- A列(部署)で「営業部」を抽出
- 抽出後、
SpecialCells(xlCellTypeVisible)
で可視セルだけを取得
参考:【VBA】Findを使って複数条件で検索する方法|実務で役立つ応用サンプル Debug.Print
で結果をイミディエイトウィンドウに出力
🔹 出力結果
営業部
営業部
このように、抽出された「営業部」のみが出力されます。
Debug.Print
の代わりに、別シートへ書き出すことも簡単に可能です。
✅ フィルター結果を別シートに出力する方法
抽出結果を「レポートシート」や「結果シート」にまとめたいときは、
可視セルをコピーして貼り付けるだけでOKです。
🔹 コード例:抽出リストを別シートにコピー
Sub CopyFilteredList()
Dim wsSrc As Worksheet
Dim wsDst As Worksheet
Dim rngVisible As Range
Set wsSrc = Sheets("データ")
Set wsDst = Sheets("結果")
' 既存データをクリア
wsDst.Cells.ClearContents
' フィルターを設定
wsSrc.Range("A1:C100").AutoFilter Field:=1, Criteria1:="営業部"
' 可視セルをコピー
On Error Resume Next
Set rngVisible = wsSrc.Range("A1:C100").SpecialCells(xlCellTypeVisible)
On Error GoTo 0
If Not rngVisible Is Nothing Then
rngVisible.Copy Destination:=wsDst.Range("A1")
Else
MsgBox "条件に一致するデータがありません。"
End If
wsSrc.AutoFilterMode = False
End Sub
💡ポイント
SpecialCells(xlCellTypeVisible)
は見出し行も含むため、コピー先でそのまま貼り付け可能Destination
を使えば貼り付け位置も自由に指定できる
参考:【VBA】コピーデータを貼り付ける場所を指定:Destinationパラメータ- 抽出結果が存在しない場合のエラー回避も含まれている
🔹 実務での応用例
このコードをボタンに割り当てれば、
「条件を選択 → 抽出 → 別シートに転記」という処理をワンクリックで自動化できます。
たとえば:
- 月次ごとの「営業部」データをレポート化
- 商品カテゴリ別の一覧を出力
- 部署ごとの成績表を自動作成
✅ 抽出リストを配列に格納して使う
コピーせず、プログラム内で抽出結果を扱いたい場合は、可視セルを配列に変換する方法が便利です。
🔹 コード例:可視セルを配列に格納
Sub GetFilteredArray()
Dim rng As Range
Dim arr() As Variant
Dim i As Long
' フィルター設定
Range("A1:C100").AutoFilter Field:=1, Criteria1:="営業部"
' 可視セル(データ部分のみ)
On Error Resume Next
Set rng = Range("B2:B100").SpecialCells(xlCellTypeVisible)
On Error GoTo 0
If Not rng Is Nothing Then
arr = rng.Value
For i = 1 To UBound(arr, 1)
Debug.Print arr(i, 1)
Next i
End If
ActiveSheet.AutoFilterMode = False
End Sub
🔹 解説
- 抽出された可視セルの値を配列に格納
- ループで順に処理できる(例:集計・検証・別処理など)
- 配列化することで、表示せずにバックグラウンドで処理できる
💡 応用例:抽出データを合計
Sub SumFilteredData()
Dim rng As Range
Dim arr() As Variant
Dim total As Double
Dim i As Long
Range("A1:C100").AutoFilter Field:=1, Criteria1:="営業部"
Set rng = Range("C2:C100").SpecialCells(xlCellTypeVisible)
arr = rng.Value
For i = 1 To UBound(arr, 1)
total = total + arr(i, 1)
Next i
MsgBox "営業部の合計売上は " & total & " です。"
ActiveSheet.AutoFilterMode = False
End Sub
このようにすれば、フィルター結果の集計を自動化することも可能です。
✅ 抽出条件(AutoFilterの状態)を取得する
現在どんな条件でフィルターされているかを確認する方法もあります。
これはデバッグや自動レポート作成で役立ちます。
🔹 コード例:フィルター条件を確認
Sub ShowFilterCondition()
Dim f As Filter
Dim ws As Worksheet
Dim msg As String
Set ws = ActiveSheet
If Not ws.AutoFilter Is Nothing Then
For Each f In ws.AutoFilter.Filters
If f.On Then
msg = msg & "列" & f.Parent.Range.Cells(1, f.Index).Value & _
" の条件:" & f.Criteria1 & vbCrLf
End If
Next f
MsgBox msg
Else
MsgBox "フィルターは設定されていません。"
End If
End Sub
🔹 結果例
列 部署 の条件:営業部
現在のフィルター条件を動的に取得できるため、
「どんな条件で抽出されたか」をログとして残すことも可能です。
✅ フィルター解除とエラー対策
抽出結果の取得後は、必ずフィルターを解除しましょう。
また、SpecialCells
は対象が存在しないとエラーを返すため、エラー制御が重要です。
🔹 フィルター解除テンプレート
If ActiveSheet.AutoFilterMode Then
ActiveSheet.AutoFilterMode = False
End If
参考:【VBA】フィルター解除を全て実行する方法|複数シート・複数フィルター対応の完全自動化解説
🔹 エラー回避テンプレート
On Error Resume Next
Set rng = Range("A2:A100").SpecialCells(xlCellTypeVisible)
On Error GoTo 0
この2つをセットで使うことで、
「抽出結果がゼロでもマクロが止まらない」堅牢な処理になります。
✅ 実務で役立つ応用例
① 抽出結果を日付フォルダに自動保存
- 可視セルを取得 → CSV形式で保存
- 日付をファイル名に自動付与
② 抽出リストをメール送信
rng.VisibleRange
をHTMLBodyに変換してメール送信(Outlook連携)
③ 定期レポート自動生成
- AutoFilterで条件抽出
- 結果を別ブックに転記して保存
- 集計表とグラフを自動作成
■ まとめ:オートフィルタのリストを取得すればVBAの可能性が広がる
SpecialCells(xlCellTypeVisible)
で可視セルだけを取得- 抽出結果はコピー・配列・ループ処理など自在に活用できる
- フィルター条件は
AutoFilter.Filters
で取得可能 - 結果を別シートやファイルに出力してレポート自動化も可能
On Error Resume Next
とAutoFilterMode=False
で安全に処理
オートフィルタの結果をVBAで扱えるようになれば、
Excelの手動分析を完全自動化し、日次・月次レポートをボタンひとつで作成できる環境が整います。