Excel VBA 逆引き集 | フィルタ後のデータ読み取り

Excel VBA
スポンサーリンク

フィルタ後のデータ読み取り

Excelでフィルタをかけた後に「表示されているデータだけを読み取りたい」場面はよくあります。
通常の Range.Value では非表示行も含まれてしまうため、SpecialCells(xlCellTypeVisible) を使うのがポイントです。初心者向けに、コード例やテンプレートをかみ砕いて説明します。


基本の考え方

  • AutoFilter で条件を絞り込む。
  • SpecialCells(xlCellTypeVisible) で「表示されているセル」だけを取得。
  • For Eachループ配列に読み込み で処理する。
  • エラー処理が必須 → 可視セルが存在しない場合はエラーになるので On Error Resume Next を入れる。

テンプレ1:フィルタ後の可視セルを読み取ってメッセージ表示

Sub ReadVisibleData()
    Dim ws As Worksheet: Set ws = Worksheets("Data")
    Dim rg As Range: Set rg = ws.Range("A1:C20")

    ' A列で「東京」だけフィルタ
    rg.AutoFilter Field:=1, Criteria1:="東京"

    Dim visRg As Range, c As Range
    On Error Resume Next
    Set visRg = rg.SpecialCells(xlCellTypeVisible)
    On Error GoTo 0

    If Not visRg Is Nothing Then
        For Each c In visRg.Columns(2).Cells ' B列のデータを読み取り
            If c.Row > 1 Then ' ヘッダー行を除外
                Debug.Print "顧客=" & c.Value
            End If
        Next c
    End If

    ' フィルタ解除
    ws.AutoFilterMode = False
End Sub
VB
  • ポイント:
    • フィルタで「東京」だけ表示。
    • B列の顧客名だけ読み取って出力。

テンプレ2:フィルタ後の可視セルを配列に格納

Sub VisibleDataToArray()
    Dim ws As Worksheet: Set ws = Worksheets("Data")
    Dim rg As Range: Set rg = ws.Range("A1:C20")

    ' B列で「>100」をフィルタ
    rg.AutoFilter Field:=2, Criteria1:=">100"

    Dim visRg As Range
    On Error Resume Next
    Set visRg = rg.SpecialCells(xlCellTypeVisible)
    On Error GoTo 0

    If Not visRg Is Nothing Then
        Dim arr As Variant
        arr = visRg.Value

        Dim i As Long
        For i = 2 To UBound(arr, 1) ' 1行目はヘッダー
            Debug.Print arr(i, 1), arr(i, 2), arr(i, 3)
        Next i
    End If

    ' フィルタ解除
    ws.AutoFilterMode = False
End Sub
VB
  • ポイント:
    • フィルタ後の可視セルを配列に読み込み。
    • ループで一気に処理できる。

テンプレ3:フィルタ後の可視セルを別シートにコピー

Sub CopyVisibleData()
    Dim ws As Worksheet: Set ws = Worksheets("Data")
    Dim rg As Range: Set rg = ws.Range("A1:C20")

    ' A列で「大阪」だけフィルタ
    rg.AutoFilter Field:=1, Criteria1:="大阪"

    Dim visRg As Range
    On Error Resume Next
    Set visRg = rg.SpecialCells(xlCellTypeVisible)
    On Error GoTo 0

    If Not visRg Is Nothing Then
        visRg.Copy Destination:=Worksheets("Result").Range("A1")
    End If

    ' フィルタ解除
    ws.AutoFilterMode = False
End Sub
VB
  • ポイント:
    • フィルタ後の表示セルだけコピー。
    • 非表示行はコピーされない。

テンプレ4:フィルタ後の可視セルを集計

Sub SumVisibleData()
    Dim ws As Worksheet: Set ws = Worksheets("Data")
    Dim rg As Range: Set rg = ws.Range("C2:C50")

    ' C列で「>0」をフィルタ
    rg.AutoFilter Field:=1, Criteria1:=">0"

    Dim visRg As Range
    On Error Resume Next
    Set visRg = rg.SpecialCells(xlCellTypeVisible)
    On Error GoTo 0

    If Not visRg Is Nothing Then
        MsgBox "フィルタ後の合計=" & WorksheetFunction.Sum(visRg)
    End If

    ' フィルタ解除
    ws.AutoFilterMode = False
End Sub
VB
  • ポイント: フィルタ後の可視セルだけ合計。

例題で練習

'例1:フィルタ後の顧客名を読み取る
Sub Example1()
    ReadVisibleData
End Sub

'例2:フィルタ後のデータを配列に格納
Sub Example2()
    VisibleDataToArray
End Sub

'例3:フィルタ後のデータをコピー
Sub Example3()
    CopyVisibleData
End Sub

'例4:フィルタ後のデータを集計
Sub Example4()
    SumVisibleData
End Sub
VB

初心者向けポイント

  • SpecialCells(xlCellTypeVisible) → フィルタや非表示を無視して「見えているセル」だけ対象。
  • AutoFilterと組み合わせると強力 → 条件で絞り込んだ後に処理可能。
  • エラー処理を忘れない → 可視セルがないとエラーになる。
  • 用途は多彩 → 読み取り、コピー、集計、配列化など。

👉 この「SpecialCells / AutoFilter × フィルタ後のデータ読み取りテンプレ」を覚えておけば、Excel VBAで フィルタ後のデータを安全に読み取って処理 できるようになります。

タイトルとURLをコピーしました