VBA 中的循环和退出循环
计算机编程中的循环非常重要。它们允许用最少的代码行执行重复性任务。取决于要执行的任务,计算机中对循环的需求有几个原因。
尽管它们非常强大,但它们在上下文和语法上都很简单。
在 VBA 中,可以使用三个循环。
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.