Excel VBAの繰り返し:For Next

VBA の For Next 文は繰り返し処理を行うための構文です。ここでは、For Next 文の使い方について説明します。

For Next の使い方

For Next の最もシンプルな構文は以下の通りです。

For カウンタ変数 = 初期値 To 終了値
    何らかの処理
Next

For Next 文では、以下の順序で処理が行われます。

  1. カウンタ変数に初期値に設定した値を代入します。
  2. カウンタ変数と終了値を比較し、終了値以下ならブロック内の処理を実行します。
  3. カウンタ変数に1を加算します。

1は初回のみ実行されます。2〜3はカウンタ変数が終了値より大きくなるまで繰り返し実行されます。

たとえば、次のように「こんにちは!」と5回繰り返す処理があるとします。

' イミディエイトウィンドウに「こんにちは!」を5回表示
Debug.Print "こんにちは!"
Debug.Print "こんにちは!"
Debug.Print "こんにちは!"
Debug.Print "こんにちは!"
Debug.Print "こんにちは!"

For Next を使うと次のように記述することができます。

Dim i As Integer
For i = 1 To 5
    Debug.Print "こんにちは!"
Next

上の例では、繰り返しは5回実行されます。上の2つのコードは、どちらも同程度の記述量になりますが、もしこの繰り返しを1000回繰り返す場合には For Next を使った方が、より簡潔に記述することができます。

カウンタ変数を参照する

カウンタ変数はブロック内の処理で参照することができます。

以下はカウンタ変数を利用して回数を表示する例です。

Dim i As Integer
For i = 1 To 5
    Debug.Print i & "回目"
Next

実行結果

1回目
2回目
3回目
4回目
5回目

カウンタ変数の名前は慣習的に i, j, k を使うことが多いです。

カウンタの増減値を変更する:Step

カウンタ変数はデフォルトでは繰り返しのたびに1ずつ加算されていきますが、Step を使うことで繰り返しで加算されていく増減値を変えることもできます。

For カウンタ変数 = 初期値 To 終了値 Step 増減値
    [何らかの処理]
Next

以下の例では i が2ずつ加算されていきます。

' 1から10までの奇数を表示
Dim i As Integer
For i = 1 To 10 Step 2
    Debug.Print i
Next

実行結果

1
3
5
7
9

Step にマイナスの値を設定した場合は、初期値から値が終了値より小さくなるまで繰り返し処理が実行されます。

' 5から0までカウントダウンしてみる
Dim i As Integer
For i = 5 To 0 Step -1
    Debug.Print i
Next

実行結果

5
4
3
2
1
0

繰り返し処理を途中で終了する:Exit For

For Next の繰り返し処理を途中で終わりたい場合は、Exit For を使います。

例えば1から100まで値を足していき、100を超える場合は計算をやめるという処理を実装してみます。

Dim sum As Integer
sum = 0

Dim i As Integer
For i = 1 To 100
    sum = sum + i     ' sum に i を加算していく  
    If sum > 100 Then ' sumが100を超えたかどうか判定
        Exit For
    End If
Next

' iの値とsumの値を表示
Debug.Print "iの値:" & i, "合計値:" & sum

実行結果

iの値:14      合計値:105

For Nextでセルを編集

ここまで Debug.Print を使い処理の説明をしてきましたが、実際のプログラムではセルの値を編集するために For Next を使うことが多いです。

Cells とカウンタ変数を使い、指定した行と列のセルに値を代入します。以下のようにセルを指定することができます。

Cells(行番号, 列番号)

以下は行と列のセルに値を設定する例です。

Dim i As Integer
For i = 1 To 5
    Cells(i, 1) = i
    Cells(i, 2) = i * i ' iの2乗
Next

vba_for_next1

For Next で配列を操作する

配列を操作する場合にも For Next は便利です。配列の場合 UBound(配列変数名)  で配列の最大値が取得でき、それを終了値の値と設定することで配列の要素数だけ繰り返すことができます。

' 動物の配列を準備
Dim animals(5) As String
animals(0) = "ぞう"
animals(1) = "きりん"
animals(2) = "うま"
animals(3) = "いぬ"
animals(4) = "ねこ"

' 繰り返し処理でセルに値を代入
Dim i As Integer
For i = 0 To UBound(animals)
    Cells(i + 1, 1) = animals(i)
Next

配列のインデックスは0から、Cells のインデックスは1から始まるので、注意してください。

vba_for_next2