フィルタ後のデータ読み取り
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で フィルタ後のデータを安全に読み取って処理 できるようになります。
