Excel VBA | For…Next文

VBA
スポンサーリンク

1. 基本の考え方(イメージ)

For…Next は「カウンタ変数」が初期値から最終値まで一定の増分(=Step)で変わるたびに、ブロック内の処理を繰り返す構文です。

For カウンタ = 初期値 To 最終値 [Step 増分]
    繰り返したい処理
Next [カウンタ]
VB
  • カウンタ:繰り返しの回数を数える変数(例:i
  • 初期値 → 最終値:カウンタがこの範囲を移動
  • Step:省略すると 1。負の値も可(逆向きループ)

2. 例題 1:1〜10 の合計(基本)

Sub Example1_Sum1to10()
    Dim i As Long
    Dim total As Long
    total = 0

    For i = 1 To 10
        total = total + i
        Debug.Print "i=" & i & "  total=" & total
    Next i

    MsgBox "合計は " & total
End Sub
VB

出力(イメージ — Immediate ウィンドウの Debug.Print):

i=1  total=1
i=2  total=3
...
i=10 total=55

解説:i が 1→10 まで増え、total に順に加算される。最後に合計 55 を表示。


3. Step を使う例:奇数だけ(1,3,5…)

Sub Example2_Step()
    Dim i As Long
    For i = 1 To 9 Step 2
        Debug.Print i
    Next i
End Sub
VB

出力:

1
3
5
7
9

解説:Step 2 によって i が 2ずつ増える。


4. 逆向きループ(10→1)/負の Step

Sub Example3_Reverse()
    Dim i As Long
    For i = 10 To 1 Step -1
        Debug.Print i
    Next i
End Sub
VB

出力: 10 9 8 ... 1
ポイント:初期値最終値 より大きいときは Step を負にする(逆に、負の Step で初期値 < 最終値だとループは1回も回らない)。


5. 実践例:シートの1行目〜10行目の A列値を足す

Sub Example4_SumColumnA()
    Dim i As Long
    Dim total As Double
    total = 0

    For i = 1 To 10
        total = total + NzToZero(Cells(i, "A").Value)
    Next i

    MsgBox "A1〜A10 の合計 = " & total
End Sub

' セルが空白だったら 0 を返す簡易関数
Function NzToZero(val As Variant) As Double
    If IsNumeric(val) Then
        NzToZero = val
    Else
        NzToZero = 0
    End If
End Function
VB

解説:実際のシートの値を処理する典型的な使い方。セル参照は Cells(行, 列) で行う。


6. ネストした For(多次元的に繰り返す) — 乗算表を作る

Sub Example5_MultiplicationTable()
    Dim r As Long, c As Long
    For r = 1 To 9
        For c = 1 To 9
            Cells(r, c).Value = r * c
        Next c
    Next r
    MsgBox "1〜9 の乗算表をシートに作成しました。"
End Sub
VB

イメージ(シート):

1 2 3 4 5 6 7 8 9
2 4 6 8 10 12 14 16 18
...
9 18 ... 81

解説:外側の For r が行、内側の For c が列を処理する。ネスト回数は必要に応じて増やせるが、深すぎると複雑になる。


7. Exit For の使い方(途中終了)

Sub Example6_ExitFor()
    Dim i As Long
    For i = 1 To 100
        If i = 7 Then
            MsgBox "7 を見つけたのでループを抜けます。"
            Exit For
        End If
    Next i
End Sub
VB

解説:条件が満たされたら早めにループを抜ける。パフォーマンスの面や条件発見時に有効。


8. 注意点・よくあるミス

  • 初期化忘れ:合計用変数を 0 に初期化しないと前の値が残る。Option Explicit を使って宣言漏れを防ぐ。
  • Step の符号:逆順にするなら Step -1 のように負にする。正の Step で初期値 > 最終値だと一度も実行されない。
  • カウンタの型:ループ回数が大きいと Integer は溢れる(上限 32767)。Long を推奨。
  • 重い処理は注意:セルを毎回読む/書く重い処理は Application.ScreenUpdating = False 等で高速化を検討。
  • For Each と混同しない:配列やコレクションを順に巡るときは For Each が便利(後述)。

9. For Each と For i = ... の違い(簡単)

  • For i = 1 To n:カウンタで「何回」繰り返すかを指定。インデックスで参照する処理向き。
  • For Each item In Collection:配列や Range 内の各要素に対して使う(要素自体が欲しいときに便利)。

例:選択範囲のセルを順に処理

Sub Example7_ForEachRange()
    Dim cell As Range
    For Each cell In Selection
        If IsNumeric(cell.Value) Then
            cell.Value = cell.Value * 2
        End If
    Next cell
End Sub
VB

10. 練習問題(初心者向け 8問)+模範解答

必要ならさらに問題を増やします。まず 8問で練習してみましょう。

問1:1〜20 の奇数だけを Debug.Print するマクロを書きなさい。

解答(コード):

Sub Q1()
    Dim i As Long
    For i = 1 To 20 Step 2
        Debug.Print i
    Next i
End Sub
VB

問2:1〜50 の偶数の合計を求めて MsgBox で表示しなさい。

解答:

Sub Q2()
    Dim i As Long, s As Long
    s = 0
    For i = 2 To 50 Step 2
        s = s + i
    Next i
    MsgBox "合計 = " & s
End Sub
VB

問3:A1〜A10 のセルに入っている数値の平均を計算してセル B1 に書き出しなさい(空白は無視)。

解答:

Sub Q3()
    Dim i As Long, cnt As Long
    Dim sum As Double
    sum = 0: cnt = 0
    For i = 1 To 10
        If IsNumeric(Cells(i, "A").Value) Then
            sum = sum + Cells(i, "A").Value
            cnt = cnt + 1
        End If
    Next i
    If cnt > 0 Then
        Cells(1, "B").Value = sum / cnt
    Else
        Cells(1, "B").Value = "データなし"
    End If
End Sub
VB

問4:Sheet の 1行目に「1〜12」の月名を横に並べる(1行目の1列目から)。

解答:

Sub Q4()
    Dim i As Long
    For i = 1 To 12
        Cells(1, i).Value = i & "月"
    Next i
End Sub
VB

問5:2重ループで 1〜5 の掛け算表(5×5)をセル A1:E5 に作成しなさい。

解答(上で示した乗算表の縮小版):

Sub Q5()
    Dim r As Long, c As Long
    For r = 1 To 5
        For c = 1 To 5
            Cells(r, c).Value = r * c
        Next c
    Next r
End Sub
VB

問6:1〜100 の中で最初に 37 が見つかったらループを抜けるデモ(Exit For を使う)。

解答:

Sub Q6()
    Dim i As Long
    For i = 1 To 100
        If i = 37 Then
            Debug.Print "見つかった: " & i
            Exit For
        End If
    Next i
End Sub
VB

問7:A列に文字列が入っている最初の空白行のインデックスを取得して MsgBox で表示しなさい。

解答:

Sub Q7()
    Dim i As Long
    For i = 1 To 1000
        If Trim(Cells(i, "A").Value) = "" Then
            MsgBox "最初の空白行は " & i
            Exit For
        End If
    Next i
End Sub
VB

問8:For Each を使って選択範囲内のセルの文字列を左トリム(前後の空白を削る)して戻しなさい。

解答:

Sub Q8()
    Dim c As Range
    For Each c In Selection
        If Not IsEmpty(c) Then c.Value = Trim(c.Value)
    Next c
End Sub
VB

11. 追加のコツ(上達を早める小ワザ)

  • Option Explicit をモジュールの先頭に書いて変数宣言を必須にする。スペルミスのバグを激減。
  • 長いループでは Application.ScreenUpdating = False、処理完了後に True に戻すと速くなる。
  • 配列処理や Find を併用すればセルのアクセス回数を減らして高速化できる。
  • デバッグは Debug.Print を多用して、ループ中の変数の変化を確認する。
VBA
スポンサーリンク
シェアする
@lifehackerをフォローする
スポンサーリンク
タイトルとURLをコピーしました