Excel VBA 逆引き集 | For 〜 Next

Excel VBA
スポンサーリンク

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 が直感的。

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