目录
使用 Do...Loop 语句
直到条件为 True 时重复语句
直到条件变成 True 才重复语句
从循环内退出 Do...Loop 语句
使用 For...Next 语句
使用 For Each...Next 语句
对某范围的单元格做循环
在完成前退出 For Each...Next 循环
使用 Do...Loop 语句
可以使用 Do...Loop 语句去运行语句的块,而它所用掉的时间是不确定的。当条件为 True 或直到条件变成 True 时,此语句会一直重复。
直到条件为 True 时重复语句
当使用 While 关键字去检查 Do...Loop 语句中的条件时,可以有两种方法。可以在进入循环之前检查条件式,也可以在循环至少运行一次之后才检查条件式。
在下面的 ChkFirstWhile
过程中,在进入循环之前检查条件。如果将 myNum
的值由 20 替换成 9,则循环中的语句将永远不会运行。 在ChkLastWhile
过程中,在条件变成 False 之前循环中的语句只执行一次。
Sub ChkFirstWhile()
counter = 0
myNum = 20
Do While myNum > 10
myNum = myNum - 1
counter = counter + 1
Loop
MsgBox "The loop made " & counter & " repetitions."
End Sub
Sub ChkLastWhile()
counter = 0
myNum = 9
Do
myNum = myNum - 1
counter = counter + 1
Loop While myNum > 10
MsgBox "The loop made " & counter & " repetitions."
End Sub
直到条件变成 True 才重复语句
当使用 Until 关键字去检查 Do...Loop 语句中的条件时,可以使用两种方法。可以在进入循环之前检查条件(如同 ChkFirstUntil
过程所示),也可以在循环至少运行一次之后才检查条件(如同 ChkLastUntil
过程所示)。当条件仍然为 False 时,循环继续。
Sub ChkFirstUntil()
counter = 0
myNum = 20
Do Until myNum = 10
myNum = myNum - 1
counter = counter + 1
Loop
MsgBox "The loop made " & counter & " repetitions."
End Sub
Sub ChkLastUntil()
counter = 0
myNum = 1
Do
myNum = myNum + 1
counter = counter + 1
Loop Until myNum = 10
MsgBox "The loop made " & counter & " repetitions."
End Sub
从循环内退出 Do...Loop 语句
可以使用 Exit Do 语句来退出 Do...Loop 语句。例如,为了退出无穷循环,可以在 If...Then...Else 语句或是 Select Case 语句的 True 语句块中使用 Exit Do 语句。如果条件为 False,则循环会象通常那样运行。
在下面的示例中,myNum
被赋予一个会造成无穷循环的值。而 If...Then...Else 语句会去检查这个情况然后退出,以避免无穷循环。
Sub ExitExample()
counter = 0
myNum = 9
Do Until myNum = 10
myNum = myNum - 1
counter = counter + 1
If myNum < 10 Then Exit Do
Loop
MsgBox "The loop made " & counter & " repetitions."
End Sub
注意 可以按 ESC 或 CTRL+BREAK 键来终止无穷循环。
使用 For...Next 语句
可以使用 For...Next 语句去重复一个语句块,而它的次数的数字是指定的。For 循环使用一个计数变量,当重复每个循环时它的值会增加或减少。
下面的过程会让计算机发出哔声 50 次。For 语句会指定计数变量 x
的开始与结束值。Next 语句会将计数变量的值加 1。
Sub Beeps()
For x = 1 To 50
Beep
Next x
End Sub
使用 Step 关键字,可以由所指定的值增加或减少计数变量。在下面的示例中,计数变量 j
会在每次循环重复时加上 2。当循环完成时,total
的值为 2、4、6、8 和 10 的总合。
Sub TwosTotal()
For j = 2 To 10 Step 2
total = total + j
Next j
MsgBox "The total is " & total
End Sub
为了减少计数变量的值,可以使用负的 Step 值。为了减少计数变量的值,必须指定一个小于开始值的结束值。在下面的示例中,计数变量 myNum
会在每次循环重复时减去 2。当循环完成时,total
的值为 16、14、12、10、8、6、4 和 2 的总合。
Sub NewTotal()
For myNum = 16 To 2 Step -2
total = total + myNum
Next myNum
MsgBox "The total is " & total
End Sub
注意 在 Next 语句后面不必包含计数变量的名称。上述的示例中,因为要具有可读性才加上计数变量的名称。
可以在计数变量到达它的结束值之前,使用 Exit For 语句来退出 For...Next 语句。例如,当错误发生时,可以使用在 If...Then...Else 语句或是 Select Case 语句的 True 语句块中的 Exit For 语句,它是专门用来检查此错误的。如果没有错误发生,则 If...Then...Else 语句的值为 False,循环会象预期那样的运行。
使用 For Each...Next 语句
For Each...Next 语句会重复一个语句块,而它是作用于集合中的每个对象或是数组中的每个元素。当循环执行一次则 Visual Basic 会自动设置一个变量。例如,下面的过程会关闭所有的窗体,除了窗体包含的过程正在运行以外。
Sub CloseForms()
For Each frm In Application.Forms
If frm.Caption <> Screen. ActiveForm.Caption Then frm.Close
Next
End Sub
下面的代码会在数组的每个元素中循环,并且将每个值设置成它的索引变量 I 的值。
Dim TestArray(10) As Integer, I As Variant
For Each I In TestArray
TestArray(I) = I
Next I
对某范围的单元格做循环
可以使用 For Each...Next 循环对某范围的单元格做循环。下面的过程会对于 Sheet1 中的 A1:D10 范围做循环,并将任何绝对值小于 0.01 的号码设为 0。
Sub RoundToZero()
For Each myObject in myCollection
If Abs(myObject.Value) < 0.01 Then myObject.Value = 0
Next
End Sub
在完成前退出 For Each...Next 循环
可以使用 Exit For 语句来退出 For Each...Next 循环。例如,当错误发生时可以在 If...Then...Else 语句或是 Select Case 语句的 True 语句块中使用 Exit For 语句,它是专门用来检查此错误的。如果没有错误发生,If...Then...Else 语句的值为 False,则循环会象预期那样运行。
下面的示例,测试在 A1:B5 范围内找出第一个不含数值的单元。如果有找到此类单元,则会有信息显示并用 Exit For 语句退出循环。
Sub TestForNumbers()
For Each myObject In MyCollection
If IsNumeric(myObject.Value) = False Then
MsgBox "Object contains a non-numeric value."
Exit For
End If
Next c
End Sub
source: VBA Help