Excel VBA_繰り返し処理の構文について
この記事ではVBAの繰り返し処理についてまとめます。代表的な4つの構文とその具体例を整理していきます。
- For〜Nextステートメント
- Stepによる増減値の指定
- 2重ループ
- Do~Loopステートメント
- While、Untilの違い
- 実行のタイミングを後に
For〜Nextステートメント
For〜Nextステートメントは指定された回数だけ処理を繰り返します。繰り返す回数が分かっている場合にこちらの構文を使用します。
For 変数 = 初期値 To 終了値
処理
Next
下記の例ではセル"A1"~"A10"に1~10の値を出力します。
Dim i
For i = 1 To 10
Cells(i, 1).Value = i
Next
変数の値は1ずつ加算されていき、終了値を超えると処理が終了する仕組みとなっています。
Stepによる増減値の指定
For~Next構文はStep
によって増減値を指定することもできます。(元々Step
は省略が可能であり、省略した場合は変数の値が1ずつ加算されていました。)
For 変数 = 初期値 To 終了値 Step 増減値
処理
Next
下記の例ではA列のセルと値が2飛ばしで入力されていきます。
Dim i
For i = 1 To 10 Step 2
Cells(i, 1).Value = i
Next
逆に値を1ずつ減少させていくこともできます。
Dim i
For i = 10 To 1 Step -1
Cells(i, 1).Value = i
Next
初期値は10からスタートして1ずつ減少していき、1になると処理が終了します。
2重ループ
For~Nextのループの中で、また更に別のループを回すことも可能です。下記のコードではセル"A1"~"I9"に掛け算の九九表を出力しました。
Dim i, j
For i = 1 To 9
For j = 1 To 9
Cells(i, j).Value = i * j
Next
Next
Range
ではなくCells
を使うことで行と列を同時に使うことができます。
Do~Loopステートメント
For〜Nextは回数を指定した繰り返し処理の仕組みです。一方で現実には繰り返す回数がわからないケースもあります。その場合に使うのがDo~Loopステートメントです。Do~Loopでは条件によって繰り返し処理を指定することが可能であり、具体的な回数が分からない場合にはこちらが使われます。
ステートメント | 判定のタイミング | 繰り返し処理 |
---|---|---|
Do While~Loop | 実行前 | 条件が真の間 |
Do~Loop While | 実行後 | 条件が真の間 |
Do Until~Loop | 実行前 | 条件が真になるまで |
Do~Loop While | 実行後 | 条件が真になるまで |
Do~Loopステートメントには全部で4種類の組み合わせ(パターン)があります。まずは大枠のWhile
とUntil
の違いから学んでいきます。
WhileとUntilの違い
まずは2つの基本的な構文を比較します。
Do While 条件
処理
Loop
Do Until 条件
処理
Loop
構文はほとんど同じですが下記のような違いがあります。
While:条件が真の間繰り返す
Until:条件が真になるまで繰り返す
「iの値が5以下である」という条件で比較
具体的に「iの値が5以下である」という条件で2つの構文を比べてみましょう。
Sub loop_while()
Dim i: i = 1
Do While i <= 5
Cells(i, 1).Value = i
i = i + 1
Loop
End Sub
Untilを使ったプログラムは何も出力されません。しかしWhileを使った方はセル"A1"~"A5"に1~5の値が出力されます。WhileとUntilの部分が異なるだけなのですがなぜでしょうか?
Sub loop_until()
Dim i: i = 1
Do Until i <= 5
Cells(i, 1).Value = i
i = i + 1
Loop
End Sub
Whileは指定された条件の間であれば処理が繰り返されます。スタートの時点でiの値は5以下(i = 1)だったので、処理は実行されました。しかしUntilの場合、条件を満たせば処理は終了します。初めからiの値は5以下の条件は満たしていたため、何も処理が実行されることはありませんでした。条件が真の間は繰り返すのがWhile、条件が真になるまで繰り返すのがUntil..といった違いとなっています。
判定のタイミングを後に
処理を先に実行して、判定のタイミングを後回しにすることもできます。While(Until) 条件
よりもDo 処理
が先に来ている点に注目して下さい。
Do 処理
Loop While 条件
Do 処理
Loop Until 条件
これによって判定より前に必ず一度は(条件が成立しない場合でも)処理が実行されるようになります。
Discussion