VBA のループと終了ループ

Glen Alfaro 2023年1月30日
  1. VBA For ループ
  2. VBA Do Until ループ
  3. VBA Do While ループ
  4. Exit コマンドを使用して VBA のループを強制的に停止する
VBA のループと終了ループ

コンピュータプログラミングのループは非常に重要です。最小限のコード行で反復的なタスクを実行できます。コンピューターでのループの必要性は、実行するタスクに応じていくつかの理由で発生します。

それらは非常に強力ですが、コンテキストと構文は単純です。

VBA には、利用できる 3つのループがあります。

  1. For ループ-事前定義または固定された制限内でループします
  2. Do While ループ-条件が True である間ループします。
  3. Do Until ループ-条件が True になるまでループします。

VBA For ループ

構文:

For [ counter ] = [start] To [end]  Step [ step ]
    [ statements ]
    [ Exit For ]
Next [ counter ]

パラメーター:

[ counter ] 必須。通常、カウンターの現在の値を保持する整数または長い変数
[ start ] 必須。カウンターの開始値
[end] 必須。カウンターの終了値
[ statements ] ループ内で実行するコードブロック
[ Exit For ] オプション。ループを強制的に停止し、ループコードブロックを終了します
[ step ] オプション。反復ごとのカウンターの増分。宣言されていない場合、値は 1 です。

For ループの例:

このコードブロックは、開始番号として整数値を受け入れ、For ループを使用してゼロになるまで数値を減らします。各反復の結果を出力します。

Sub ReduceToZero(numStart As Integer)

Dim i As Integer

For i = numStart To 0 Step -1


    Debug.Print "The number is now " & i
    If i = 0 Then

        Debug.Print ("Done!")

    End If

Next i

End Sub

Sub testSub()

Call ReduceToZero(10)

End Sub

出力:

The number is now 10
The number is now 9
The number is now 8
The number is now 7
The number is now 6
The number is now 5
The number is now 4
The number is now 3
The number is now 2
The number is now 1
The number is now 0
Done!

VBA Do Until ループ

構文:

Do Until [condition]
    [statements]
    [Exit Do]
Loop

パラメーター:

[condition] 必須。一度真になるとコードブロックを終了する条件
[statements] 必須。実行するコードブロック
[Exit Do] オプション。ループを強制的に停止し、コードブロックを終了します

Do Until ループの例:

このコードブロックは、開始番号として整数値を受け入れ、Do Until ループを使用して数値を 10 まで増やします。各反復の結果を出力します。

Sub IncrementToTen(numStart As Integer)

Dim i As Integer

i = numStart

Do Until i = 10 + 1

    Debug.Print "The number is now " & i
    i = i + 1
Loop

End Sub

Sub testSub()

Call IncrementToTen(-5)

End Sub

testSub 出力:

The number is now -5
The number is now -4
The number is now -3
The number is now -2
The number is now -1
The number is now 0
The number is now 1
The number is now 2
The number is now 3
The number is now 4
The number is now 5
The number is now 6
The number is now 7
The number is now 8
The number is now 9
The number is now 10
Done!

VBA Do While ループ

構文:

Do while [condition]
    [statements]
    [Exit Do]
Loop

パラメーター:

[condition] 必須。コードブロックを実行するために真である必要がある条件。
[statements] 必須。実行するコードブロック
[Exit Do] オプション。ループを強制的に停止し、コードブロックを終了します

Do While ループの例:

このコードブロックは、開始番号として整数値を受け入れ、Do While ループを使用して 10 まで番号を増やします。各反復の結果を出力します。

Sub IncrementToTen(numStart As Integer)

Dim i As Integer
i = numStart
Do While i < 10 + 1

Debug.Print "The number is now " & i
i = i + 1
Loop
Debug.Print "Done!"
End Sub

Sub testSub()

Call IncrementToTen(-9)

End Sub

testSub 出力:

The number is now -9
The number is now -8
The number is now -7
The number is now -6
The number is now -5
The number is now -4
The number is now -3
The number is now -2
The number is now -1
The number is now 0
The number is now 1
The number is now 2
The number is now 3
The number is now 4
The number is now 5
The number is now 6
The number is now 7
The number is now 8
The number is now 9
The number is now 10
Done!

Exit コマンドを使用して VBA のループを強制的に停止する

ループを処理する場合、ループが実行されたときにループが実行され続けるという条件にバインドされます。ただし、一般的なシナリオは、条件がまだ満たされている場合でも、ループを終了する必要があるというものです。このための典型的なアプリケーションは、エラー処理メソッド、Stop-when-search テクニックを扱う場合です。さらなるエラーを防止したり、実行時間を節約したりするには、ループをすぐに終了する必要があります。

以下のコードブロックは、Exit コマンドを使用してループを強制的に Do ループで停止する方法を示しています。

このコードブロックは、2つの数値の商が 1 の場合にループを停止することを目的としています。これらの 2つの数値は、サブルーチンのパラメーターである upperboundlowerbound の整数値の間でランダムに生成されます。生成された除数(divis)がゼロの場合、ゼロによる除数は許可されていないため、エラーが発生します。この発生を回避するために、Exit コマンドを使用してループを終了します。

Sub StopWhenQuotientIsOne(upperbound As Integer, lowerbound As Integer)

Dim divid As Integer
Dim divis As Integer
Dim isOne As Boolean

divid = Int((upperbound - lowerbound + 1) * Rnd + lowerbound)
divis = Int((upperbound - lowerbound + 1) * Rnd + lowerbound)

Do Until isOne = True

    If divis = 0 Then
        Debug.Print "Illegal divisor. Exiting the Loop"
        Exit Do
    End If

Debug.Print divid / divis

If divid / divis = 1 Then

    isOne = True
    Debug.Print "Done! One is achieved."

End If

divid = Int((upperbound - lowerbound + 1) * Rnd + lowerbound)
divis = Int((upperbound - lowerbound + 1) * Rnd + lowerbound)

Loop


End Sub

Sub testSub()

Call StopWhenQuotientIsOne(4, -4)

End Sub

testSub 出力(最初の試行):

-4 
-0 
-0.666666666666667 
Illegal divisor. Exiting the Loop

testSub 出力(4 回目の試行):

-2 
 0 
-3 
 1 
Done! One is achieved.

以下のコードブロックは、Exit コマンドを使用して、ループを For ループで強制的に停止する方法を示しています。

この例では、StopWhenNegative サブルーチンには 2つのパラメーターが必要です。最初は startNum、次に EndNum です。ループは startNum から EndNum まで繰り返されます。カウンターが負になると、ループは Exit コマンドによって終了します。

Sub StopWhenNegative(startNum As Integer, EndNum As Integer)

Dim i As Integer
 
For i = startNum To EndNum Step -1
 
    If i < 0 Then
        Debug.Print "Opps, negative values detected. Exiting loop."
        Exit For
    End If
Debug.Print "The current number is :" & i
Next i

End Sub

Sub testSub()

Call StopWhenNegative(10, -5)

End Sub

testSub 出力:

The current number is :10
The current number is :9
The current number is :8
The current number is :7
The current number is :6
The current number is :5
The current number is :4
The current number is :3
The current number is :2
The current number is :1
The current number is :0
Opps, negative values detected. Exiting loop.