Excel VBA 逆引き集 | フィルタ高速テンプレ

Excel VBA
スポンサーリンク

フィルタ高速テンプレ

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で フィルタ後のデータを安全かつ高速に処理 できるようになります。

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