Excel VBA 逆引き集 | 可視セルのみ処理

Excel VBA
スポンサーリンク

可視セルのみ処理

フィルタや手動で非表示にした行・列を「飛ばして、見えているセルだけ処理したい」場面はよくあります。これを高速・安全に実現するのが Range.SpecialCells(xlCellTypeVisible) です。初心者向けに最短コードから応用例まで整理しました。


基本:可視セルだけループ処理

Sub VisibleCells_Basic()
    Dim vis As Range, c As Range
    On Error Resume Next
    Set vis = Range("A2:A100").SpecialCells(xlCellTypeVisible)
    On Error GoTo 0

    If Not vis Is Nothing Then
        For Each c In vis
            c.Value = "対象"   '見えているセルだけ処理
        Next c
    End If
End Sub
VB
  • ポイント:
    • xlCellTypeVisible → フィルタや非表示を除外して「見えているセル」だけ取得。
    • 該当なしだとエラーになるので On ErrorNothing チェックを必ず入れる。

行単位で処理(列を1本に絞るのが定石)

Sub VisibleRows_Only()
    Dim rg As Range, vis As Range, c As Range
    Set rg = Range("A1").CurrentRegion
    rg.AutoFilter Field:=2, Criteria1:="営業A" '例:B列で抽出

    On Error Resume Next
    Set vis = rg.Offset(1).Resize(rg.Rows.Count - 1).Columns(1).SpecialCells(xlCellTypeVisible)
    On Error GoTo 0

    If Not vis Is Nothing Then
        For Each c In vis
            Cells(c.Row, "G").Value = Cells(c.Row, "C").Value * Cells(c.Row, "D").Value
        Next c
    End If
End Sub
VB
  • ポイント:
    • 行単位処理は「列を1本に限定」して Row番号で展開する。
    • これで「同じ行を複数回処理してしまう」重複を防げる。

一括処理:可視セルだけ値化・書式変更

Sub VisibleCells_ConvertToValues()
    Dim vis As Range
    On Error Resume Next
    Set vis = Range("C2:D200").SpecialCells(xlCellTypeVisible)
    On Error GoTo 0
    If Not vis Is Nothing Then vis.Value = vis.Value '数式を値に固定
End Sub

Sub VisibleCells_Highlight()
    Dim vis As Range
    On Error Resume Next
    Set vis = Range("E2:E200").SpecialCells(xlCellTypeVisible)
    On Error GoTo 0
    If Not vis Is Nothing Then vis.Interior.Color = RGB(198, 239, 206) '緑で強調
End Sub
VB
  • ポイント:
    • 一括代入や書式変更は「対象集合」に対してまとめて適用できる。
    • ループ不要で高速。

実務テンプレート

1) 可視セルだけコピーして別シートへ

'1) 可視セルだけコピーして別シートへ
Sub CopyVisibleCells()
    Dim vis As Range
    On Error Resume Next
    Set vis = Range("A1").CurrentRegion.SpecialCells(xlCellTypeVisible)
    On Error GoTo 0
    If Not vis Is Nothing Then vis.Copy Destination:=Worksheets("Report").Range("A1")
End Sub
VB

2) 可視セルの空白だけ「未入力」で埋める

'2) 可視セルの空白だけ「未入力」で埋める
Sub FillVisibleBlanks()
    Dim vis As Range, blanks As Range
    On Error Resume Next
    Set vis = Range("B2:B200").SpecialCells(xlCellTypeVisible)
    On Error GoTo 0
    If Not vis Is Nothing Then
        On Error Resume Next
        Set blanks = vis.SpecialCells(xlCellTypeBlanks)
        On Error GoTo 0
        If Not blanks Is Nothing Then blanks.Value = "未入力"
    End If
End Sub
VB

3) 可視セルの数式だけ値化

'3) 可視セルの数式だけ値化
Sub VisibleFormulas_ToValues()
    Dim vis As Range, formulas As Range
    On Error Resume Next
    Set vis = Range("C2:C200").SpecialCells(xlCellTypeVisible)
    On Error GoTo 0
    If Not vis Is Nothing Then
        On Error Resume Next
        Set formulas = vis.SpecialCells(xlCellTypeFormulas)
        On Error GoTo 0
        If Not formulas Is Nothing Then formulas.Value = formulas.Value
    End If
End Sub
VB

例題で練習

例題1:フィルタ後の「営業A」行だけ計算結果を出す

Sub Example_CalcVisibleSales()
    Dim rg As Range, vis As Range, c As Range
    Set rg = Range("A1").CurrentRegion
    rg.AutoFilter Field:=2, Criteria1:="営業A"

    On Error Resume Next
    Set vis = rg.Offset(1).Resize(rg.Rows.Count - 1).Columns(1).SpecialCells(xlCellTypeVisible)
    On Error GoTo 0

    If Not vis Is Nothing Then
        For Each c In vis
            Cells(c.Row, "H").Value = Cells(c.Row, "C").Value * Cells(c.Row, "D").Value
        Next c
    End If
End Sub
VB

例題2:可視セルだけ背景色をリセット

Sub Example_ClearVisibleColor()
    Dim vis As Range
    On Error Resume Next
    Set vis = Range("A2:F200").SpecialCells(xlCellTypeVisible)
    On Error GoTo 0
    If Not vis Is Nothing Then vis.Interior.ColorIndex = xlNone
End Sub
VB

例題3:選択範囲の可視セルだけ「処理済」と書き込む

Sub Example_FlagVisibleSelection()
    Dim vis As Range, c As Range
    On Error Resume Next
    Set vis = Selection.SpecialCells(xlCellTypeVisible)
    On Error GoTo 0
    If Not vis Is Nothing Then
        For Each c In vis
            c.Value = "処理済"
        Next c
    End If
End Sub
VB

実務の落とし穴と対策

  • 0件エラー: SpecialCells は対象がないとエラー。必ず On Error と Nothing チェックを入れる。
  • 行重複: 可視セル集合をそのまま回すと「列数分」同じ行を処理してしまう。列を1本に絞って Row番号で展開するのが定石。
  • CurrentRegionの限界: 空行で途切れる。必要なら最終行・列を計算して範囲を組み立てる。
  • 速度最適化: 一括代入・書式変更を優先。大量データでは ScreenUpdating/Calculation を一時オフに。
Sub SpeedWrap_Visible()
    Application.ScreenUpdating = False
    Application.Calculation = xlCalculationManual

    '…可視セルの一括処理…

    Application.Calculation = xlCalculationAutomatic
    Application.ScreenUpdating = True
End Sub
VB
タイトルとURLをコピーしました