和風スパゲティのレシピ

日本語でコーディングするExcelVBA

繰り返し(ループ)処理 - Do Loop

繰り返し(ループ)処理を行う方法を解説します。

条件を満たすまで処理を繰り返すには、
Do Loopステートメントを使用します。

基本構文

Do Loop文

Do
    繰り返す処理
Loop

Do~Loopの間に書いた処理を繰り返します。

このままでは永遠に繰り返されるため、
通常はExit DoやWhile・Untilと組み合わせて使用します。

Exit Do使用

Do

    繰り返す処理

    If 終了条件 Then Exit Do

Loop

Exit Doを実行すると、
その時点でDo Loopを終了します。

While使用

Do While 継続条件

    繰り返す処理

Loop

Whileに指定した条件を満たしている間、
処理を繰り返します。

Until使用

Do Until 終了条件

    繰り返す処理

Loop

Untilに指定した条件を満たすまで、
処理を繰り返します。

サンプルコード

2行目からデータの最終行までループして、
A列の値をイミディエイトウィンドウへ出力してみます。

Exit Do使用版

Dim ws対象シート As Worksheet
Set ws対象シート = Worksheets("Sheet1")

Const C対象列 As Long = 1

Dim RLast As Long
RLast = ws対象シート.Cells(ws対象シート.Rows.Count, C対象列).End(xlUp).Row

Dim R As Long: R = 2

Do

    If R > RLast Then Exit Do

    Debug.Print ws対象シート.Cells(R, C対象列)

    R = R + 1

Loop

While使用版

Dim ws対象シート As Worksheet
Set ws対象シート = Worksheets("Sheet1")

Const C対象列 As Long = 1

Dim RLast As Long
RLast = ws対象シート.Cells(ws対象シート.Rows.Count, C対象列).End(xlUp).Row

Dim R As Long: R = 2

Do While R <= RLast

    Debug.Print ws対象シート.Cells(R, C対象列)

    R = R + 1

Loop

Until使用版

Dim ws対象シート As Worksheet
Set ws対象シート = Worksheets("Sheet1")

Const C対象列 As Long = 1

Dim RLast As Long
RLast = ws対象シート.Cells(ws対象シート.Rows.Count, C対象列).End(xlUp).Row

Dim R As Long: R = 2

Do Until R > RLast

    Debug.Print ws対象シート.Cells(R, C対象列)

    R = R + 1

Loop

For使用版

Dim ws対象シート As Worksheet
Set ws対象シート = Worksheets("Sheet1")

Const C対象列 As Long = 1

Dim RLast As Long
RLast = ws対象シート.Cells(ws対象シート.Rows.Count, C対象列).End(xlUp).Row

Dim R As Long

For R = 2 To RLast

    Debug.Print ws対象シート.Cells(R, C対象列)

Next

利用例

While使用版 - データが空でない間ループ

Whileは、
「○○である間、繰り返す」という処理と相性が良いです。

例えばA列のデータが空になるまで処理する場合は、
以下のように書けます。

Dim ws対象シート As Worksheet
Set ws対象シート = Worksheets("Sheet1")

Dim R As Long: R = 2

Do While ws対象シート.Cells(R, 1) <> ""

    Debug.Print ws対象シート.Cells(R, 1)

    R = R + 1

Loop

Until使用版 - フォルダ内のすべてのファイルをループ

Untilは、
「○○になるまで、繰り返す」という処理と相性が良いです。

Dir関数でファイルが見つからなくなるまで処理する場合は、
以下のように書けます。

Dim 対象フォルダパス As String
対象フォルダパス = "C:\Sample\"

Dim ファイル名 As String
ファイル名 = Dir(対象フォルダパス & "*")

Do Until ファイル名 = ""

    Debug.Print ファイル名

    ファイル名 = Dir

Loop

解説

Do Loopステートメントは、
終了するタイミングを条件で判断するループ処理に使用します。

WhileとUntilは似ていますが、

・Do While 条件 → 条件を満たしている「間」繰り返す
・Do Until 条件 → 条件を満たす「まで」繰り返す

という違いです。


条件はLoop側に書くこともできます。

Do
    繰り返す処理
Loop While 継続条件

Do
    繰り返す処理
Loop Until 終了条件

Do側に条件を書く場合は処理を始める前に条件判定するため、
最初から条件を満たさなければ1回も実行されません。

対してLoop側に書いた場合は処理後に判定するため、
最低でも1回は処理が実行されます。


Do Loopでありがちなミスが、
終了条件がいつまでも成立せず無限ループになることです。

例えば、

Dim R As Long: R = 2

Do While R <= 100

    Debug.Print R

Loop

ではRの値が変わらないため、
いつまでもループが終了しません。

R = R + 1

のように、
終了条件に使用している値がループ内で正しく変化するか確認してください。

Exit Doを使用する場合も同様に、
どこかで必ず終了条件を満たせるようにしておきましょう。

使い分け

まず、
Forで書ける処理ならForを使用するのがおすすめです。

サンプルコードの「2行目から最終行まで」のように、
開始位置と終了位置が最初から分かっている処理をDo Loopで書く必要はほとんどありません。

For R = 2 To RLast
    処理
Next

これだけで書けるため、
Forの方が終了条件も分かりやすくなります。


一方、

・「○○である間、続ける」と表現できる → Do While
・「○○になるまで、続ける」と表現できる → Do Until

と考えると使い分けやすいです。

それ以上に終了条件が複雑な場合は、

Do

    処理A

    If 終了条件A Then Exit Do

    処理B

    If 終了条件B Then Exit Do

Loop

のように、
Do~Loopの中でExit Doを使用すると読みやすく書けます。

For → Do While / Do Until → Do + Exit Do

くらいの順番で、
なるべく簡単に書けるループ構文を選ぶとよいでしょう。