特殊セルで高速化
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で フィルタ後の特定セルだけを安全かつ高速に処理 できるようになります。
