フィルタ高速テンプレ
Excelで大量データを扱うとき「フィルタをかけて表示されたセルだけ処理したい」場面はよくあります。
通常のループでは非表示行も含まれてしまうため、AutoFilter + SpecialCells(xlCellTypeVisible) を組み合わせると高速に処理できます。初心者向けに、コード例やテンプレートをかみ砕いて説明します。
基本の考え方
- AutoFilter → 条件で絞り込み。
- SpecialCells(xlCellTypeVisible) → フィルタ後の「見えているセル」だけ取得。
- For Eachループ → 可視セルだけ処理。
- エラー処理が必須 → 可視セルがない場合はエラーになるので
On Error Resume Nextを入れる。
テンプレ1:フィルタ後の可視セルを一括処理(色付け)
Sub FastFilter_Color()
Dim ws As Worksheet: Set ws = Worksheets("Data")
Dim rg As Range: Set rg = ws.Range("A1:C100")
' 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.Interior.Color = vbYellow
End If
' フィルタ解除
ws.AutoFilterMode = False
End Sub
VB- ポイント:
- フィルタで「東京」だけ表示。
- 表示されたセルだけ黄色に。
テンプレ2:フィルタ後の数値を一括更新(10%増)
Sub FastFilter_Update()
Dim ws As Worksheet: Set ws = Worksheets("Data")
Dim rg As Range: Set rg = ws.Range("B1:B100")
' B列で「>100」をフィルタ
rg.AutoFilter Field:=1, Criteria1:=">100"
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.Cells
If IsNumeric(c.Value) And c.Row > 1 Then
c.Value = c.Value * 1.1
End If
Next c
End If
' フィルタ解除
ws.AutoFilterMode = False
End Sub
VB- ポイント:
- フィルタで「100以上」の行だけ表示。
- 表示された数値を10%増やして書き戻し。
テンプレ3:フィルタ後の可視セルを配列に読み込み(高速処理)
Sub FastFilter_ToArray()
Dim ws As Worksheet: Set ws = Worksheets("Data")
Dim rg As Range: Set rg = ws.Range("A1:D100")
' C列で「>0」をフィルタ
rg.AutoFilter Field:=3, 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
Dim arr As Variant
arr = visRg.Value
Dim i As Long
For i = 2 To UBound(arr, 1) ' ヘッダー除外
Debug.Print arr(i, 1), arr(i, 2), arr(i, 3), arr(i, 4)
Next i
End If
' フィルタ解除
ws.AutoFilterMode = False
End Sub
VB- ポイント:
- フィルタ後の可視セルを配列に読み込む。
- 一括処理で高速化。
テンプレ4:フィルタ後の可視セルをコピー
Sub FastFilter_Copy()
Dim ws As Worksheet: Set ws = Worksheets("Data")
Dim rg As Range: Set rg = ws.Range("A1:C100")
' 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- ポイント: フィルタ後の表示セルだけコピー。
例題で練習
'例1:フィルタ後の可視セルを色付け
Sub Example1()
FastFilter_Color
End Sub
'例2:フィルタ後の数値を更新
Sub Example2()
FastFilter_Update
End Sub
'例3:フィルタ後のデータを配列に読み込み
Sub Example3()
FastFilter_ToArray
End Sub
'例4:フィルタ後のデータをコピー
Sub Example4()
FastFilter_Copy
End Sub
VB初心者向けポイント
- AutoFilterで絞り込み → SpecialCells(xlCellTypeVisible)で取得 が高速処理の基本。
- エラー処理を忘れない → 可視セルがないとエラーになる。
- 配列に読み込むとさらに高速 → 一括処理が可能。
- 用途は多彩 → 色付け、更新、コピー、集計など。
👉 この「フィルタ高速テンプレ」を覚えておけば、Excel VBAで フィルタ後のデータを安全かつ高速に処理 できるようになります。
