繰り返し(ループ)処理を行う方法を解説します。
条件を満たすまで処理を繰り返すには、
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
くらいの順番で、
なるべく簡単に書けるループ構文を選ぶとよいでしょう。