プログラミング初心者向けのVBA入門講座第12回です。
→過去の入門講座目次はこちら
前回、前々回で条件分岐のステートメントを紹介してきました。
今回は繰り返し処理のステートメントを紹介します。
For..Next ステートメントの基本
For..Next ステートメントは決められた回数を繰り返すときに用いるステートメントで次のように記述します。
For カウンタ変数名 開始値 To 終了値 [Step 増減値]
処理
Next カウンタ変数名
カウンタ変数名はよく i , j ,k , cnt などが用いられることが多いですが、好きな変数名を指定することができます。
カウンタ変数は数値を扱うのでLong 型やInteger 型で宣言します。
[Step 増減数] は省略可能で省略したときはカウンタ変数がループの度に1ずつ増加します。
例えば次のマクロを実行するとメッセージの表示を3回繰り返します。
カウンタ変数 i は 1→2→3 と変化します。
Sub test1()
Dim i As Long
For i = 1 To 3
MsgBox i & "回目"
Next i
End Sub
実際に使ってみよう
基本的な書き方がわかったところで実際にFor..Nextステートメントを使ったマクロを作成してみましょう。
For..Nextステートメントはよくセルを1行ずつ処理するときなどに用いられることが多いです。
セルの指定方法としてCellsプロパティを用いた
Cells(行番号, 列番号)
というものがありますが、この行番号や列番号にカウンタ変数をあてはめればセルを1行ずつ、または1列ずつ処理することができます。

これはCells.Item(行番号, 列番号)のItemプロパティを省略した記述でしたね。詳しくは入門講座第7回を参照ください。
次のマクロはセルのA1~A10にそれぞれ10~100の数字を入力します。
Sub test2()
Dim i As Long
For i = 1 To 10
Cells(i, 1).Value = i * 10
Next i
End Sub

また Step で増減数を指定すれば奇数行のみに処理をすることもできます。
次のマクロではA~D列の1~10行のうち奇数行のセルの背景色を赤色にします。
( iの値は 1 → 3 → 5 → 7 → 9 と 2 ずつ増加します)
Sub test3()
Dim i As Long
For i = 1 To 10 Step 2
Range(Cells(i, 1), Cells(i, 4)).Interior.ColorIndex = 3
Next i
End Sub


ここではRangeプロパティの引数に2つのセルを指定してセル範囲を取得しています。→ Range(Cell1, Cell2 )
このマクロでは i 行目の1~4列(すなわちA~D列)を指定しています。
( i = 1 のときは A1~D1 )

Interior.ColorIndex でオブジェクトの内部を表す Interior オブジェクトの背景色を ColorIndex プロパティでカラーパレットインデックス番号で色を指定しています。
応用編
条件分岐のステートメントと同じく、繰り返し処理のステートメントもネスト(入れ子)構造にすることができます。
次のマクロでは行のループ処理(カウンタ変数 i )の中に列のループ処理(カウンタ変数 j )をネストにしています。
Sub test4()
Dim i As Long
Dim j As Long
For i = 1 To 5
For j = 1 To 3
Cells(i, j).Value = i + j - 1
Next j
Next i
End Sub

またループ処理の中に If ステートメントを入れることで条件が成立したときだけ処理を実行することができます。
次のマクロではA列の値が60以上のときに同じ行のB列に「合格」の文字を入力します。
Sub test5()
Dim i As Long
For i = 1 To 5
If Cells(i, 1).Value >= 60 Then
Cells(i, 2).Value = "合格"
End If
Next i
End Sub

また条件が成立したときにループを抜け出すこともできます。
ループを抜けるときは 「 Exit For 」を記述します。
次のマクロでは1行目から順に10行目までループ処理で計算しますが、途中でA列の値が空白だった場合はメッセージを表示した後でループを抜けて計算を中止します。
Sub test6()
Dim i As Long
For i = 1 To 10
If Cells(i, 1).Value = "" Then
MsgBox "セルA" & i & "が空白です"
Exit For
Else
Cells(i, 2).Value = Cells(i, 1).Value / 2
End If
Next i
End Sub

まとめ
今回は繰り返し処理の For..Next ステートメントを紹介しました。
繰り返し処理は条件分岐処理と並んでプログラミングで多用する基本構文なのでしっかり覚えて使えるようにしましょう。
繰り返し処理のステートメントは他にもあります。次回以降で紹介していきます。
コメント