この記事では、VBAでの繰り返し処理に使用する、Do Loopステートメントの使用方法を解説します。
条件記述の Do While構文と Do Until構文の、前・後判定の記述方法などを解説します。
また、Exit Do ステートメントなどの、ループを抜ける方法についても解説していきます。
*Do LoopステートメントはDo Loop文とも呼ばれますが、この記事ではDo Loopと表記します。
VBA関連解説
Do Loopステートメントの構文
VBAでは、繰り返し回数が判っていない場合に、条件の成立状態を判定し繰り返し処理をする、Do Loop ステートメントがよく使用されます。
Do Loopは、条件が成立中か成立後か、判定が前か後かの4パターンで、その記述方法が異なります。
基本的な記述方法を、例示しながら解説していきます。
ワークシート上のセルに対して、処理を実行した結果も示していきます。
処理実行用サンプル
Do While構文
Do Loop に、Whileを使用すると条件が真の間、処理が繰り返されます。
前判定
Do_While_Loop 構文
Do While 条件1 処理1 Loop
Do_While_Loop 例
Dim i As Long i = 1 Do While Cells(i, 1).Value <> "" Cells(i, 2).Value = i i = i + 1 Loop
For Nextと異なり、カウンター変数の増減は記述が必要です。
処理実行結果
A列にデータがある間、処理が実行されます。
後判定
Do_Loop_While 構文
Do 処理1 Loop While 条件1
Do_Loop_While 例
Dim i As Long i = 1 Do Cells(i, 2).Value = i i = i + 1 Loop While Cells(i, 1).Value = ""
For Nextと異なり、カウンター変数の増減は記述が必要です。
処理実行結果
初めから条件は偽ですが、1回だけ処理が実行されます。
Do Until構文
Do Loop に、Untilを使用すると条件が真になるまで、処理が繰り返されます。
前判定
Do_Until_Loop 構文
Do Until 条件1 処理1 Loop
Do_Until_Loop 例
Dim i As Long i = 1 Do Until Cells(i, 1).Value = "" Cells(i, 2).Value = i i = i + 1 Loop
For Nextと異なり、カウンター変数の増減は記述が必要です。
処理実行結果
A列にデータがなくなるまで、処理が実行されます。
後判定
Do_Loop_Until 構文
Do 処理1 Loop Until 条件1
Do_Loop_Until 例
Dim i As Long i = 1 Do Cells(i, 2).Value = i i = i + 1 Loop Until Cells(i, 1).Value <> ""
For Nextと異なり、カウンター変数の増減は記述が必要です。
処理実行結果
初めから条件は真ですが、1回だけ処理が実行されます。
Step構文
Do Loopには、For Nextステートメントにある Step のような引数はありませんので、カウンター変数の増減記述の部分で増減数を変えます。
Do_While_Loop 例
Dim i As Long i = 1 Do While Cells(i, 1).Value <> "" Cells(i, 2).Value = i i = i + 2 '←増減数変更 Loop
カウンター変数の増減記述部分で増減数を変更します。
処理実行結果
奇数の時だけ、処理が実行されます。
ネスト(入れ子)
Do Loopステートメントの繰り返し処理の中で、さらに繰り返し処理をすることをネスト(入れ子)といいます。
Do Loopステートメントの中にDo Loopステートメントを追加していきます。
Do _While_(Do_While_Loop)_Loop 構文
Do While 条件1 Do While 条件2 処理1 Loop Loop
Do _While_(Do_While_Loop)_Loop 例
Dim i As Long Dim j As Long i = 1 Do While Cells(i, 1).Value <> "" j = 2 Do While j <= 4 Cells(i, j).Value = i + j j = j + 1 Loop i = i + 1 Loop
Do Loop の中に Do Loop を記述します。
処理実行結果
ループを抜ける方法
Exit Doステートメント
Exit Doステートメントは、Do Loopのループの途中で、ループを抜ける構文です。
Do_(Exit Do)_Loop 構文
Sub TEST() Do While 条件1 処理1 If 条件2 Then Exit Do '→ここからスキップ End Loop 後続処理 '←ここまでスキップ End Sub
Do Loopステートメントの中に記述されるExit Doステートメントは、Ifステートメントと組み合わせて使われ、条件が成り立った場合にループを抜け、後続処理に移ります。
GoToステートメント
GoToステートメントは、GoTo後述の処理名:の記述部分まで、プログラムをスキップさせる構文です。
Do_(GoTo)_Loop 構文
Sub TEST() Do While 条件1 処理1 If 条件2 Then Go To 処理名 '→ここからスキップ End Loop 後続処理 処理名: 処理2 '←ここまでスキップ End Sub
Do Loop ステートメントの中に記述されるGoTo ステートメントは、If ステートメントと組み合わせて使われ、条件が成り立った場合にループを抜け、後続処理も飛ばして、処理名:の記述部分までスキップします。
GoToステートメントは、GoTo記述の前にもスキップできますが、処理が分離してしまうので、可読性の観点からも、適度な使用をこころがけましょう。
Exit Sub ステートメント
Exit Subステートメントは、プロシージャを抜けてサブプロシージャの呼び出し元にスキップさせる構文です。End Subにスキップするのではなく、プロシージャ自体を抜けます。
Do_(Exit Sub)_Loop 構文
Sub TEST() Do While 条件1 処理1 If 条件2 Then Exit Sub '→ここからスキップ End Loop 後続処理 End Sub '←ここまでスキップ
Do Loop ステートメントの中に記述されるExit Sub ステートメントは、If ステートメントと組み合わせて使われ、条件が成り立った場合にループを抜け、プロシージャ自体も抜けます。
無限ループを抜ける方法
While構文で偽にならない、Until構文で真にならないような条件を設定しまったとき、処理が止まらず無限ループになるときがあります。
無限ループが発生した場合は、[ESC] または [Ctrl] + [Break] を押して、強制終了させましょう。
上記の方法でループが止まらないときは、タスクマネージャーでExcel自体を強制終了させるしかないでしょう。
注意点等
For Nextステートメントの注意点等を確認していきます。
While Not 構文
Do Loop ステートメントを使用するとき、While構文とUntil構文のどちらを使用するか迷う場合があります。また、Not演算子を使用すると、While Not = Until の関係となるので、更に迷いが深まります。
VBAのコード記述は、シンプルで可読性の高いものを目指し、条件が真の間か・真になるまでかを基準に判り易い記述をしましょう。
ステップイン
Do Loop ステートメントをデバッグする方法に、ステップインがあります。Do Loop に限らず頻繁に使用するので、使用方法を覚えておきましょう。
VBAコードを1行ずつ実行することを、ステップインといいます。
実行したいプロシージャの、Sub からEnd Subまでの間にカーソルをおき、"F8"を押すとステップインが開始されます。
"F8"を押すごとに、黄色に表示された行のコードが実行され、次の行に移っていきます。
変数などにカーソルを合わせると格納された値が表示されます。
▶︎実行ボタンを押すと、End Sub まで、または、設定されたブレークポイントまで、プログラムが実行されます。
(▶︎実行ボタンの代わりに、"Ctrl"+"F8"(ステップアウト)を押しても同様の動作をします。)
■リセットボタンを押すとステップインは終了します。
回数が判っているときの繰り返し処理
Do Loop ステートメントは、繰り返し回数が不明のときに使用しますが、繰り返し回数が判っているときは、For Next ステートメントがよく使われます。
下記の記事では、VBAでの繰り返し処理に使用する、For Next ステートメントの使用方法を解説していますので、参考にしてください。
コレクション・配列の繰り返し処理
VBAでは、コレクションに含まれるオブジェクトや、配列に含まれる要素を順に取り出す場合の繰り返し処理に、For Each Nextステートメントがよく使用されます。
下記の記事では、VBAでの繰り返し処理に使用する、For Each Next ステートメントの使用方法を解説していますので、参考にしてください。
演算子
Do Loop ステートメントの構文例ででてきた、"=" や "<" などは演算子とよばれ、値の比較などに使われます。
演算子には、"=" "<" などの比較演算子、その他、算術演算子や論理演算子、文字列比較に使われるLike演算子などがあります。
演算子の詳細は下記の記事で解説していますので、記事を参考に演算子の使い方を理解して、さまざまな条件を設定できるようになりましょう。
概要解説に戻る