フィルタ後のデータ書き戻し
Excelでフィルタをかけた後に「表示されているデータだけを加工して書き戻したい」場面があります。
例えば「フィルタで絞った行の数値を更新する」「可視セルだけに印を付ける」といったケースです。
このとき便利なのが SpecialCells(xlCellTypeVisible) と AutoFilter の組み合わせです。初心者向けに、コード例やテンプレートをかみ砕いて説明します。
基本の考え方
- AutoFilter で条件を絞り込む。
- SpecialCells(xlCellTypeVisible) で「表示されているセル」だけを取得。
- For Eachループ で可視セルを処理し、値を書き戻す。
- エラー処理が必須 → 可視セルが存在しない場合はエラーになるので
On Error Resume Nextを入れる。
テンプレ1:フィルタ後の可視セルに印を付ける
Sub WriteBackVisibleCells()
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(3).Cells ' C列のデータを書き戻し
If c.Row > 1 Then ' ヘッダー行を除外
c.Value = c.Value & "★"
End If
Next c
End If
' フィルタ解除
ws.AutoFilterMode = False
End Sub
VB- ポイント:
- フィルタで「東京」だけ表示。
- C列の可視セルに「★」を追記。
テンプレ2:フィルタ後の数値を一括更新(10%増)
Sub UpdateVisibleNumbers()
Dim ws As Worksheet: Set ws = Worksheets("Data")
Dim rg As Range: Set rg = ws.Range("B1:B20")
' 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 ' 10%増
End If
Next c
End If
' フィルタ解除
ws.AutoFilterMode = False
End Sub
VB- ポイント:
- フィルタで「100以上」の行だけ表示。
- 表示されている数値を10%増やして書き戻し。
テンプレ3:フィルタ後の空白セルに「未入力」と書き戻し
Sub FillVisibleBlanks()
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 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 c.Row > 1 And IsEmpty(c.Value) Then
c.Value = "未入力"
End If
Next c
End If
' フィルタ解除
ws.AutoFilterMode = False
End Sub
VB- ポイント:
- フィルタで「空白セル」だけ表示。
- 空白セルに「未入力」と書き戻し。
テンプレ4:フィルタ後のエラーセルを「0」に置き換え
Sub ReplaceVisibleErrors()
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 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 IsError(c.Value) And c.Row > 1 Then
c.Value = 0
End If
Next c
End If
' フィルタ解除
ws.AutoFilterMode = False
End Sub
VB- ポイント:
- フィルタで「東京」だけ表示。
- 表示されているエラーセルを「0」に置き換え。
例題で練習
'例1:フィルタ後の可視セルに印を付ける
Sub Example1()
WriteBackVisibleCells
End Sub
'例2:フィルタ後の数値を一括更新
Sub Example2()
UpdateVisibleNumbers
End Sub
'例3:フィルタ後の空白セルに「未入力」と書き戻し
Sub Example3()
FillVisibleBlanks
End Sub
'例4:フィルタ後のエラーセルを「0」に置き換え
Sub Example4()
ReplaceVisibleErrors
End Sub
VB初心者向けポイント
- SpecialCells(xlCellTypeVisible) → フィルタや非表示を無視して「見えているセル」だけ対象。
- AutoFilterと組み合わせると強力 → 条件で絞り込んだ後に処理可能。
- 書き戻しはループで行う →
For Each c In visRg.Cells。 - エラー処理を忘れない → 可視セルがないとエラーになる。
- 用途は多彩 → 値の更新、空白補完、エラー修正、印付けなど。
👉 この「SpecialCells / AutoFilter × フィルタ後のデータ書き戻しテンプレ」を覚えておけば、Excel VBAで フィルタ後のデータを安全に加工・更新 できるようになります。
