ous">

小さな在庫管理

在庫管理導入からシステム作成まで詳細解説!

VBA 繰り返し処理 Do Loopステートメントについて詳細解説! [VBA関連解説#12]

この記事では、VBAでの繰り返し処理に使用する、Do Loopステートメントの使用方法を解説します。

条件記述の Do While構文と Do Until構文の、前・後判定の記述方法などを解説します。
また、Exit Do ステートメントなどの、ループを抜ける方法についても解説していきます。

*Do LoopステートメントはDo Loop文とも呼ばれますが、この記事ではDo Loopと表記します。


VBA関連解説

Do Loopステートメントの構文

VBAでは、繰り返し回数が判っていない場合に、条件の成立状態を判定し繰り返し処理をする、Do Loop ステートメントがよく使用されます。

Do Loopは、条件が成立中か成立後か、判定が前か後かの4パターンで、その記述方法が異なります。

DoLoop構文

基本的な記述方法を、例示しながら解説していきます。

ワークシート上のセルに対して、処理を実行した結果も示していきます。

処理実行用サンプル

 

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演算子などがあります。

演算子の詳細は下記の記事で解説していますので、記事を参考に演算子の使い方を理解して、さまざまな条件を設定できるようになりましょう。

 

概要解説に戻る