For 〜 Next
「決めた回数だけ同じ処理を繰り返す」ための基本ループが For…Next。開始値から終了値まで、Stepで増減幅を指定でき、途中終了は Exit For。初心者でも迷わない最短コードと実務テンプレートでまとめます。
基本構文と最短コード
Sub ForNext_Basic()
Dim i As Long
For i = 1 To 10
Cells(i, 1).Value = i
Next i
End Sub
VB- 構文の要点: For ループ変数 = 開始値 To 終了値 [Step 増減幅] … Next。Step を省略すると 1 ずつ増える。減少させたい時は Step に負数を指定する。
- ループ変数: 行カウント等には数値型を使う。大きめの範囲を回すなら Long が安全(Integer は 32767 が上限)。
Step(間隔)と逆方向ループ
Sub ForNext_StepAndReverse()
Dim i As Long
'2行おきに処理
For i = 2 To 20 Step 2
Cells(i, "B").Value = "偶数"
Next i
'下から上へ逆順処理(削除などに安全)
Dim last As Long
last = Cells(Rows.Count, "A").End(xlUp).Row
For i = last To 2 Step -1
If Cells(i, "A").Value = "" Then Rows(i).Delete
Next i
End Sub
VB- 間隔指定: Step で 2, 3… と「間引き」できる。逆方向は Step に負数(例: -1)。
- 削除処理のセオリー: 下から上へ回すと、行削除でインデックスがずれても安全。
Exit For(途中終了)と条件分岐
Sub ForNext_ExitEarly()
Dim i As Long
For i = 2 To 1000
If Cells(i, "E").Value > 1000000 Then
Cells(i, "F").Value = "しきい値超過"
Exit For
End If
Next i
End Sub
VB- 途中終了: 条件を満たした時点でループを抜ける。検索や最初のヒットのみ扱う場面に有効。
ネスト(入れ子)で多次元を回す
Sub ForNext_Nested()
Dim r As Long, c As Long
For r = 2 To 20
For c = 2 To 6
Cells(r, c).Value = Cells(r, c).Value & "✓"
Next c
Next r
End Sub
VB- 入れ子: 行×列など二重ループで格子状範囲を処理。外側が行、内側が列の順が分かりやすい。
実務テンプレート(行単位の定番)
'1) 最終行まで、安全に一括計算(C*D を E へ)
Sub Loop_ToLastRow_Calc()
Dim last As Long, i As Long
last = Cells(Rows.Count, "A").End(xlUp).Row
For i = 2 To last
Cells(i, "E").Value = Cells(i, "C").Value * Cells(i, "D").Value
Next i
End Sub
'2) 条件でフラグ付け(F列=重要なら行を強調)
Sub Loop_FlagAndFormat()
Dim last As Long, i As Long
last = Cells(Rows.Count, "F").End(xlUp).Row
For i = 2 To last
If Cells(i, "F").Value = "重要" Then
Rows(i).Font.Bold = True
Rows(i).Interior.Color = RGB(255, 235, 156)
End If
Next i
End Sub
'3) 2行おきにサンプリングしてコピー(Step)
Sub Loop_StepCopy()
Dim i As Long
For i = 2 To 50 Step 2
Range("H" & i & ":I" & i).Value = Range("C" & i & ":D" & i).Value
Next i
End Sub
VB- 最終行の取得+ループ: Rows.Count→End(xlUp) の定番パターンで「あるだけ」回す。配列化せずに直書きで十分。
- Step活用: 周期的な抽出・サンプリングに便利。
速度最適化と安全運用
Sub ForNext_SpeedWrap()
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
Dim i As Long
For i = 2 To 50000
'必要最小限のプロパティだけ触る
Cells(i, "G").Value = Val(Cells(i, "E").Value) + Val(Cells(i, "F").Value)
Next i
Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True
End Sub
VB- 描画と再計算の制御: 大量行の処理は ScreenUpdating/Calculation をオフ→オンで体感速度向上。
- 型と範囲: ループ変数は Long、対象範囲は明示的に。Select/Activate は不要で遅い。
例題で練習
'例題1:A列に1〜100を連番で入れる
Sub Example_FillSequence()
Dim i As Long
For i = 1 To 100
Cells(i, "A").Value = i
Next i
End Sub
'例題2:範囲外チェック付きで途中終了(Exit For)
Sub Example_FindFirstOverThreshold()
Dim i As Long, last As Long
last = Cells(Rows.Count, "E").End(xlUp).Row
For i = 2 To last
If Val(Cells(i, "E").Value) > 500000 Then
Cells(i, "F").Value = "最初の超過"
Exit For
End If
Next i
End Sub
'例題3:逆順で空行削除(安全な削除テンプレ)
Sub Example_DeleteBlankRowsReverse()
Dim i As Long, last As Long
last = Cells(Rows.Count, "A").End(xlUp).Row
For i = last To 2 Step -1
If Application.WorksheetFunction.CountA(Rows(i)) = 0 Then Rows(i).Delete
Next i
End Sub
VB- For…Nextの型: 始値→終値の単純反復に最適。条件成立で即終了したい時は Exit For を組み合わせる。
よくある疑問の要点
- Stepを省略すると? 1ずつ増える。2行おきなどは Step 2 のように指定する。
- ループ変数名は何でも良い? 数値型なら任意。i, j のほか、row など意味が分かる名前が可読性を上げる。
- For Eachとの使い分けは? 回数が決まっているなら For…Next、要素集合(Range, Collection)をなめるなら For Each が直感的。
