これは セルごとにループするのではなく、配列に一括読み込み → 条件判定 → 一括書き戻し というパターンを使うと爆速になります。
基本パターン(例:金額=0 のセルを「未入力」に書き換え)
Sub 条件一致セル高速書換()
Dim ws As Worksheet
Dim rng As Range
Dim arr As Variant
Dim i As Long
Set ws = ActiveSheet
' 対象範囲(例:C列)
Set rng = ws.Range("C2:C1000")
' 一括読み込み
arr = rng.Value
' 配列内で条件判定&書き換え
For i = 1 To UBound(arr, 1)
If arr(i, 1) = 0 Then
arr(i, 1) = "未入力"
End If
Next i
' 一括書き戻し
rng.Value = arr
End Sub
VB👉 ポイントは セルごとに直接処理しない こと。配列に読み込んでからまとめて書き戻すと、数千行でも一瞬で処理できます。
応用例1:背景色が黄色のセルだけクリア
Sub 背景色黄色セルクリア()
Dim ws As Worksheet
Dim rng As Range, c As Range
Set ws = ActiveSheet
Set rng = ws.Range("A2:A1000")
' 条件一致セルを「SpecialCells」で抽出
On Error Resume Next
Set rng = rng.SpecialCells(xlCellTypeAllFormatConditions)
On Error GoTo 0
If Not rng Is Nothing Then
For Each c In rng
If c.Interior.Color = vbYellow Then
c.ClearContents
End If
Next c
End If
End Sub
VB👉 背景色など「値以外の条件」は SpecialCells やループで抽出してから処理。
応用例2:複数シートの「売上列」を一括で NG→OK に変換
Sub 複数シート売上列高速変換()
Dim ws As Worksheet
Dim rng As Range
Dim arr As Variant
Dim i As Long
For Each ws In ThisWorkbook.Worksheets
If ws.Name Like "*月" Then ' 月別シートだけ対象
Set rng = ws.Range("D2:D" & ws.Cells(ws.Rows.Count, "D").End(xlUp).Row)
arr = rng.Value
For i = 1 To UBound(arr, 1)
If arr(i, 1) = "NG" Then
arr(i, 1) = "OK"
End If
Next i
rng.Value = arr
End If
Next ws
End Sub
VBポイントまとめ
- 値条件なら配列処理が最速
- 書式条件なら SpecialCells やループで抽出
- 複数シートも同じパターンで一括処理可能
- 離れたセルでも「Areas」や「Union」でまとめて処理
練習課題
- 「金額がマイナス」のセルだけ赤文字に書き換えるコードを作る
- 「エラーチェック NG」のセルを一括で「修正済」に置き換えるコードを作る
- 複数列(A列とC列)を同時に配列処理して高速変換するコードを作る
こうしたパターンを組み合わせると、条件一致セルを自動検出して高速で一括書き換えが可能になります。


