返回列表 上一主題 發帖

[轉貼] For...Next 與 For Each...Next 迴圈的基本概念

在一楼的基础上添只足哈,就是可能好多术语不一样,我只把“循环”改成了“回圈”:

结构化的程序设计包含三种基本结构:顺序结构、选择结构和回圈结构。
回圈结构是指在执行程序时,根据条件的真假,来判断是否重复执行其中某段代码。要满足某个条件,就一直重复执行这段代码,直到不满足条件为止。包括:For……Next、For Each……Next、Do……loop、while…… Wend四种回圈语句。
1. For…Next语句
For…Next回圈属于计数型回圈,程序按照该结构中指定的回圈次数来执行回圈体部分。

For……Next语句的格式如下:
    For回圈变量=初始值 TO终值 [Step步长]
       [回圈体]
    Next [回圈变量]
如果省略 Next语句中的[回圈变量],就像[回圈变量]存在时一样执行。
    在此格式中,使用了这样几个概念:
    (1)回圈变量:用于统计回圈次数的变量,回圈的过程就是该变量是从某个值变化到另一个值的过程。
    (2)初始值:用于设置回圈变量的初始取值。
    (3)终值:用于设置回圈变量的最后取值。
    (4)步长:用于决定回圈变量每次回圈时变化的数值,即回圈变量在变化时的增值。如果省步长的话,其默认值为1。步长的取值可以为正,也可以为负。若初始值小于终值,则必将步长设为正值才有可能执行回圈体;若初始值大于终值,则必须将步长设为负值才有可能行回圈体。
    (5)回圈体:需要重复执行的代码部分,可以是一个或多个语句。
    (6)Next[回圈变量]:用于结束一次For回圈,根据终值和现在回圈变量的值的大小关系决定是否执行下一次回圈。其中的回圈变量的名称必须与回圈开始时的回圈变量名称相同。

For…Next语句回圈的执行过程(工作原理):
先将回圈变量取为初始值,然后检验回圈变量的取值是否超出终值,若回圈变量没有超出终值,则执行一次回圈体语句,然后将回圈变量加上步长赋值给回圈变量本身,再与终值进行比较,直到回圈变量超出终值时,退出回圈,执行后面的语句。所谓超出终值是指:若步长为正值,则检验回圈变量是否大于终值;若步长为负值,则检验回圈变量的取值是否小于终值。
For…Next语句结束后会返回[回圈变量]的值,但它一定不等于[终值]:
Sub t()
Dim i
For i=1 to 10
Next
End  sub
最后i是多少呢?不管是多少,它一定不是10:
Sub t1()
    Dim i, j
    For i = 1 To 10
        j = j + 1
        MsgBox "步长值为1,第" & j & "次回圈[回圈变量]的值:" & i
    Next
    MsgBox "回圈次数:" & j & Chr(13) & "最后[回圈变量]的值:" & i
End Sub

Sub t2()
    Dim i, j
    For i = 1 To 10 Step 1.6
        j = j + 1
        MsgBox "步长值为1.5,第" & j & "次回圈[回圈变量]的值:" & i
    Next
    MsgBox "回圈次数:" & j & Chr(13) & "最后[回圈变量]的值:" & i
End Sub
在回圈体中也可以改变[回圈变量]的值,但这会使程序代码的阅读和调试变得非常困难,一般不提倡这样做:
Sub t3()
    Dim i, j
    For i = 1 To 10
        i = i + 1
        j = j + 1
        MsgBox "步长值为1.5,第" & j & "次回圈[回圈变量]的值:" & i
    Next
    MsgBox "回圈次数:" & j & Chr(13) & "最后[回圈变量]的值:" & i
End Sub

在For…Next回圈中,只要步长不为0,就永远不会出现死回圈。因为只要步长不为0,无论始值和终值之间相差多么大,总可以经过有限次的回圈,使始值超出终值,从而跳出回圈。由此可见,For…Next适用于预先知道回圈次数的情况。
在某些情况下,可能需要在回圈变量没有超出终值之前就跳出回圈,这时可以用Exit For语句,当满足某种特殊的条件时,就提前跳出回圈。

从For…Next语句的格式中可以看到:其中的回圈体是可选的。若省略了回圈体,即For回圈的回圈体内没有任何具体的语句,则其只是起到延时的作用。因为当回圈了一定次数后虽不执行任何操作,但却花费了一定时间,故可作为延时工具使用。但要注意的是由于现在计算机的速度都比较快了,如果回圈次数比较少的话将不会达到预期的效果,因此要适当选择回圈次数。

2.For Each…Next语句
FOR……Next语句与For…Next语句有些类似,但它们有很大的区别:前者是由指定或集合中的元素来控制回圈,而后者是由回圈变量来控制回圈过程。由此可见,For Each…语句是不需要预先知道回圈次数的,指定数组或集合中的元素个数就是回圈次数。该语句的使用格式为:
    For Each回圈变量In数组或集合
        回圈体
    Next回圈变量
    这里的回圈变量必须是变体型(Variant)或对象型(Object)的。对于数组,回圈变量必须是变体型的;对于集合,如果集合中包含对象,则回圈变量应该是对象型,当然也可以是变体型。
当某一数组或集合里的所有元素进行同一操作时,就需要使用该语句了。
同样的可以用Exit For语句,当满足某种特殊的条件时,就提前跳出回圈。

For Each…Next语句结束后,不会返回[回圈变量],这与For…Next语句不一样:
Sub t4()
    Dim c
    For Each c In Array(1, 2, "aa")
    Next
    MsgBox TypeName(c)
End Sub
Sub t5()
    Dim r As Range
    For Each r In [a1:a4]
    Next
    MsgBox TypeName(r)
End Sub

3.Do…Loop语句
    Do…Loop回圈是根据某个条件是否成立来决定是否回圈。它并不限制回圈的次数,只要满足条件就继续回圈,直到不满足条件时跳出回圈。注意要在回圈中改变条件,否则的话可能会陷入死回圈。

    Do…Loop语句有四种形式:
形式1:
DO
回圈体
Loop While 条件
这种形式的执行过程是:先执行一遍回圈体,然后再判断条件是否成立,若条件成立, 继续下一次回圈;否则,就退出回圈。

形式2:
Do While 条件
回圈体
Loop
这种形式是把“While条件”放在回圈体的前面,也就是说它的执行过程是先判断条件是立,再决定是否继续回圈。

形式3:
DO
回圈体
Loop Until 条件
这种形式和第一种形式有些类似,也是先执行回圈体,然后再判断条件。与第一种形式不同,这种形式只有当条件不成立才会继续回圈,否则就退出回圈。

形式4:
DO Until 条件
回圈体
Loop
这种形式和第二种形式有些类似,先判断条件,再决定是否继续回圈。与之不同的是,这种形式也是当条件不成立才会继续回圈。

由上面四种形式的格式可以看出:
    第一种和第三种形式是先执行回圈体,然后再判断条件,条件成立与否,至少执行一次回圈体;第二种和第四种形式,则是先判断条件,如果条件当,回圈体可能一次也没有执行。且“While”和“Until”正好相反,前者是条件成立时入回圈,而后者则是条件不成立时才进入回圈。使用时可根据需要选择最适当的形式。

    在前面For…Next语句中介绍的Exit语句也适用于DO…Loop语句,只是把“Exit For”改成“Exit Do”即可,它们的作用是一样的,都是用来提前跳出回圈的。

资料来源:微软帮助

TOP

        靜思自在 : 時時好心就是時時好日。
返回列表 上一主題