Excel VBA 逆引き集 | フィルタ後のデータ書き戻し

Excel VBA
スポンサーリンク

フィルタ後のデータ書き戻し

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で フィルタ後のデータを安全に加工・更新 できるようになります。

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