目录

使用 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