Excel VBA 逆引き集 | 特殊セルで高速化

Excel VBA
スポンサーリンク

特殊セルで高速化

Excel VBAで大量データを扱うとき「フィルタ後の特定セルだけ処理したい」「数式セルや定数セルだけ対象にしたい」といった場面があります。
通常のループで1行ずつ判定すると遅くなりますが、SpecialCells を使えば一気に対象セルを抽出できるので高速化できます。初心者向けに、コード例やテンプレートをかみ砕いて説明します。


基本の考え方

  • SpecialCells で対象セルを一括抽出
    • xlCellTypeConstants → 入力値セル
    • xlCellTypeFormulas → 数式セル
    • xlCellTypeBlanks → 空白セル
    • xlCellTypeVisible → フィルタや非表示を無視して「見えているセル」だけ
  • AutoFilter で条件を絞り込み → SpecialCells でさらに対象を限定
  • メリット:
    • 1行ずつ判定不要 → 高速化
    • コードがシンプルになる

テンプレ1:フィルタ後の定数セルだけ色付け

Sub FastFilter_Constants()
    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 constRg As Range
    On Error Resume Next
    Set constRg = rg.SpecialCells(xlCellTypeConstants).SpecialCells(xlCellTypeVisible)
    On Error GoTo 0

    If Not constRg Is Nothing Then
        constRg.Interior.Color = vbYellow
    End If

    ' フィルタ解除
    ws.AutoFilterMode = False
End Sub
VB
  • ポイント:
    • フィルタで「東京」だけ表示。
    • さらに「定数セルだけ黄色」に。

テンプレ2:フィルタ後の数式セルだけ赤文字に

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

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

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

    If Not formulaRg Is Nothing Then
        formulaRg.Font.Color = vbRed
    End If

    ' フィルタ解除
    ws.AutoFilterMode = False
End Sub
VB
  • ポイント:
    • フィルタで「100以上」だけ表示。
    • さらに「数式セルだけ赤文字」に。

テンプレ3:フィルタ後の空白セルに「未入力」と書き戻し

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

    ' C列で空白セルをフィルタ
    rg.AutoFilter Field:=1, Criteria1:="="

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

    If Not blankRg Is Nothing Then
        For Each c In blankRg
            If c.Row > 1 Then
                c.Value = "未入力"
            End If
        Next c
    End If

    ' フィルタ解除
    ws.AutoFilterMode = False
End Sub
VB
  • ポイント:
    • フィルタで「空白セル」だけ表示。
    • 空白セルに「未入力」と書き戻し。

テンプレ4:フィルタ後のエラーセルを「0」に置き換え

Sub FastFilter_Errors()
    Dim ws As Worksheet: Set ws = Worksheets("Data")
    Dim rg As Range: Set rg = ws.Range("D1:D20")

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

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

    If Not errRg Is Nothing Then
        For Each c In errRg
            c.Value = 0
        Next c
    End If

    ' フィルタ解除
    ws.AutoFilterMode = False
End Sub
VB
  • ポイント:
    • フィルタで「大阪」だけ表示。
    • 表示されているエラーセルを「0」に置き換え。

例題で練習

'例1:フィルタ後の定数セルだけ色付け
Sub Example1()
    FastFilter_Constants
End Sub

'例2:フィルタ後の数式セルだけ赤文字
Sub Example2()
    FastFilter_Formulas
End Sub

'例3:フィルタ後の空白セルに「未入力」
Sub Example3()
    FastFilter_Blanks
End Sub

'例4:フィルタ後のエラーセルを「0」に置き換え
Sub Example4()
    FastFilter_Errors
End Sub
VB

初心者向けポイント

  • 特殊セルの種類を覚える
    • xlCellTypeConstants → 入力値
    • xlCellTypeFormulas → 数式
    • xlCellTypeBlanks → 空白
    • xlCellTypeFormulas, xlErrors → エラーセル
  • AutoFilterと組み合わせると強力 → 条件で絞り込んだ後に対象セルだけ処理可能。
  • 高速化の理由 → 1行ずつ判定せず、一括で対象セルを抽出できるから。
  • エラー処理を忘れない → 対象セルがないとエラーになる。

👉 この「SpecialCells / AutoFilter × 特殊セル高速化テンプレ」を覚えておけば、Excel VBAで フィルタ後の特定セルだけを安全かつ高速に処理 できるようになります。

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