VBA のループと終了ループ
コンピュータプログラミングのループは非常に重要です。最小限のコード行で反復的なタスクを実行できます。コンピューターでのループの必要性は、実行するタスクに応じていくつかの理由で発生します。
それらは非常に強力ですが、コンテキストと構文は単純です。
VBA には、利用できる 3つのループがあります。
For
ループ-事前定義または固定された制限内でループしますDo While
ループ-条件がTrue
である間ループします。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つの数値は、サブルーチンのパラメーターである upperbound
と lowerbound
の整数値の間でランダムに生成されます。生成された除数(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.