VBA 中的循环和退出循环
 
计算机编程中的循环非常重要。它们允许用最少的代码行执行重复性任务。取决于要执行的任务,计算机中对循环的需求有几个原因。
尽管它们非常强大,但它们在上下文和语法上都很简单。
在 VBA 中,可以使用三个循环。
- 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 ] | 可选的。强制循环停止并退出循环代码块 | 
| [ 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!
在 VBA 中使用 Exit 命令强制停止循环
在处理循环时,它们与循环在完成时将继续执行的条件绑定。然而,一个常见的场景是我们需要退出循环,即使条件仍然满足。一个典型的应用是在处理错误处理方法时,搜索时停止技术。需要立即退出循环以防止进一步的错误或节省执行时间。
下面的代码块将演示使用 Exit 命令强制循环在 Do 循环中停止。
此代码块旨在在两个数字的商为 1 时停止循环。这两个数字是在子程序的参数 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 输出(第四次试):
-2 
 0 
-3 
 1 
Done! One is achieved.
下面的代码块将演示使用 Exit 命令强制循环在 For 循环中停止。
在这个例子中,StopWhenNegative 子程序需要两个参数。首先是 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.