For…Nextステートメントを使用した繰り返し処理の書き方
基本のFor…Nextステートメントの書き方は下のように書きます。
counterというのは繰り返し回数をカウントするための変数で数値型の変数であれば名前はなんでも大丈夫です。
よく例文などで使用されるのは「i」ですが、行を繰り返す場合は「row」でもいいですし、分かりやすい変数名でOKです。最後のNextのあとのCounterは省略可能です。
数値型の変数はInteger型とLong型がありますが、Integerは最大値が32,767なのでループ処理中にこれを超えてしまうとエラーが発生していまいますので場合によって使い分けてください。
startとEndには数値を入れて1~10まで繰り返すなど、開始と終了の数値を設定します。
ここも変数にしたり、例えばendを最終行までとしたりすることも可能です。
サンプルマクロを用意しましたので実際にFor…Nextのループ処理を実行してみます。
下のような表があり、2行目から11行目まで数値が入っています。
A列の数値AとB列の数値Bを足して、合計値をC列に出力する処理を作成してみます。
サンプルマクロで実行している内容
① カウント用変数の宣言
② 2行目~11行目まで繰り返す
③ A列とB列の値を足してC列に出力する
Sub sample1()
'カウント用変数の宣言…⓵
Dim i As Integer
'2行目~11行目まで繰り返す…⓶
For i = 2 To 11
'A列とB列の値を足してC列に出力する…⓷
Cells(i, 3) = Cells(i, 1) + Cells(i, 2)
Next
End Sub
マクロ実行後、C列に合計値が出力されました。
カウント用変数「i」に最初に「2」がセットされ、2行目のA列とB列の値を足してC列に出力します。
そのあとnextで「i」変数が1つカウントアップされ、3行目の処理、4行目の処理…と11行目までを繰り返して終了します。
For…Nextで1行置きに繰り返し実行する方法(Step)
次は数行置きに繰り返し処理を実行したい場合について説明していきます。
(行で説明していますが列に置き換えて考えていただいても同じです。)
例えば下の表のようにセルが結合されていて2行分が1つのセルになっている表があったとします。
この場合は最初に説明した基本的なFor…Nextの処理では繰り返し処理が作成できないですよね。。
3行目あとを4行目ではなく、3行目⇒5行目⇒7行目⇒9行目と1行飛ばして繰り返し処理を作成する必要があります。
このようにいくつかスキップして繰り返したいときは「Step」という引数を設定します。
カウント変数を+1ずつカウントアップさせたい場合は「Step 1」ですがこれは省略可能なので通常は書きません。
+2ずつカウントアップさせたい場合は「Step 2」、+4ずつカウントアップさせたい場合は「Step 4」という風に設定します。
サンプルマクロで実行している内容
① カウント用変数の宣言
② 3行目~17行目まで繰り返す(+2ずつカウントアップさせる)
③ A列とB列の値を足してC列に出力する
Sub sample2()
'カウント用変数の宣言…⓵
Dim i As Integer
'3行目~17行目まで繰り返す(+2ずつカウントアップさせる)…⓶
For i = 3 To 17 Step 2
'A列とB列の値を足してC列に出力する…⓷
Cells(i, 3) = Cells(i, 1) + Cells(i, 2)
Next
End Sub
マクロ実行後、3行目~17行目まで合計値が出力されました。
この場合は3からスタートして+2ずつカウントアップさせているので、3行目⇒5行目⇒7行目…と最後の17行目まで繰り返して終了します。
【応用】引数Stepにマイナス値を設定して大きい数値から順に繰り返す
応用編で引数Stepにはマイナス値を設定することも可能です。
For…Nextループは開始~終了の値を大きい数値~小さい数値に設定して、Stepでマイナス1する、マイナス2するなどを設定しておくと大きい数値から始まり、NextでカウントアップするのではなくStepで指定した分マイナス処理をして繰り返してくれます。
下の例では50からスタートして-1ずつ繰り返していくので50⇒49⇒48…と最後の1まで繰り返しを行います。
For…Nextループを途中で抜ける(ExitFor)
Forループは開始~終了の数値までを繰り返しますが、途中で何かを判定して処理を抜けることも可能です。
下の表を例にして、2行目から11行目までを繰り返し処理を行いますがA列の数値Aの値が80以上になたったら繰り返し処理を終了する、という風に作成してみます。
サンプルマクロで実行している内容
① カウント用変数の宣言
② 2行目~11行目まで繰り返す
③ A列の値が80以上になったらループ処理を抜ける
④ A列とB列の値を足してC列に出力する
Sub sample3()
'カウント用変数の宣言…⓵
Dim i As Integer
'2行目~11行目まで繰り返す…⓶
For i = 2 To 11
’A列の値が80以上になったらループ処理を抜ける…⓷
If Cells(i, 1) >= 80 Then
Exit For
End If
'A列とB列の値を足してC列に出力する…⓸
Cells(i, 3) = Cells(i, 1) + Cells(i, 2)
Next
End Sub
For…Nextループで1行ずつカウントアップして処理を行う点は同じですが、合計値を計算する前にIf関数を使用してA列の値が80以上かどうかを判定しています。
何かを判定して処理を抜けたい場合はIf関数を使用して判定し、「ExitFor」でループ処理から抜けることが可能です。
サンプルマクロを実行すると2行目から処理を開始して9行目に来た時にA列の値が「80」になっているため、「80以上だったら処理を抜ける」の条件に一致し、繰り返し処理が終了しています。
結果を見ると9行目以降は処理がされず、合計値は手前の8行目まで出力されています。
※コードのコピー利用について
・コードのコピーは自由におこなっていただけます。
・気を付けて作成はしていますがコードには誤りがある可能性があります。
・自身の環境で動作確認をしていますが、すべての方の環境で同様に動くことは保証できません。
・データの破損等の責任は負いかねますのでご自身の責任のもとお使いください。