VBAで自動化 VBA一覧 フィルター操作 抽出・検索処理

【VBA】オートフィルタのリストを取得する方法|抽出結果を自在に扱う実務テクニック

Excelでデータを絞り込むときによく使う「オートフィルタ」。
しかし、抽出後に「表示されている行だけを取得したい」「抽出結果を別シートへ転記したい」と思ったことはないでしょうか?

実は、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

🔹 処理の流れ

  1. A1:C10の範囲にフィルターを設定
  2. A列(部署)で「営業部」を抽出
  3. 抽出後、SpecialCells(xlCellTypeVisible) で可視セルだけを取得
    参考:【VBA】Findを使って複数条件で検索する方法|実務で役立つ応用サンプル
  4. 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

💡ポイント


🔹 実務での応用例

このコードをボタンに割り当てれば、
「条件を選択 → 抽出 → 別シートに転記」という処理をワンクリックで自動化できます。

たとえば:

  • 月次ごとの「営業部」データをレポート化
  • 商品カテゴリ別の一覧を出力
  • 部署ごとの成績表を自動作成

✅ 抽出リストを配列に格納して使う

コピーせず、プログラム内で抽出結果を扱いたい場合は、可視セルを配列に変換する方法が便利です。


🔹 コード例:可視セルを配列に格納

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 NextAutoFilterMode=False で安全に処理

オートフィルタの結果をVBAで扱えるようになれば、
Excelの手動分析を完全自動化し、日次・月次レポートをボタンひとつで作成できる環境が整います。

-VBAで自動化, VBA一覧, フィルター操作, 抽出・検索処理