可視セルのみ処理
フィルタや手動で非表示にした行・列を「飛ばして、見えているセルだけ処理したい」場面はよくあります。これを高速・安全に実現するのが 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 ErrorとNothingチェックを必ず入れる。
行単位で処理(列を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 SubVB2) 可視セルの空白だけ「未入力」で埋める
'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
VB3) 可視セルの数式だけ値化
'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