7.4.5 循环结构
7.4.5 循环结构
当程序需要连续反复执行某种操作时,如求1到100的累加和、求九九乘法表等,这些应用会反复进行相似的操作,如果归纳出重复操作的共同之处,使用很少的代码量去实现该功能,将使代码简洁,同时提高程序效率,VBA中通过循环结构来实现这种重复操作功能。
VBA中通过多种循环语句来实现循环操作,主要有两类结构,如图7-21所示。
图7-21 两种循环结构
(a)当型循环结构;(b)直到型循环结构
由上图可以看出,两种循环有以下特点:
①循环的执行和结束由满足条件控制,循环体部分可以是一条语句,也可以是多条语句;
②当型循环与直到型循环的区别在于:当型循环条件先判断条件是否满足,再执行循环体,而直到型循环是先执行循环体再判断条件是否满足;
③当型循环有可能一次都不执行,而直到型循环至少会执行一次。
VBA中常用的循环有Do … Loop循环和For … Next循环。
1.Do… Loop循环
1)当型循环结构
2)直到型循环结构
3)While…Wend语句
本语句实际和Do …While语句功能一样,可以看作为Do …While语句的简化语句,格式如下:
While <条件表达式>
[<语句序列>]
Wend
注意:
①Do与Loop语句必须成对出现,它们之间的语句序列称为循环体。
②循环条件可以由While或者Until关键字引导,无论这两个关键字在Do之后还是在Loop之后,While关键字都是在条件成立时循环,条件不成立时结束循环;而Until关键字则恰恰相反,条件不成立时循环,条件成立时结束循环。
③Exit Do语句用于强制跳出当前循环,返回上层循环或转去执行Loop之后的语句。
④循环语句中,注意要有确定的结束循环条件,否则将产生死循环。
【例7-5】编写程序段,求1+2+ … +100的和。
下面分别用五种不同形式实现1到100的累加和。请注意其差别。下面代码中出现的Debug.Print语句,表示在立即窗口中打印出累加和结果。
(1)(2)
(3)(4)
(5)
2.For …Next循环
For …Next循环语句称为计数循环语句,如果已知循环执行次数,或有明确的开始和结束,使用For …Next将比Do …Loop更方便。For …Next语法格式如下:
注意:
①For与Next语句必须成对出现,它们之间的语句序列为循环体,可以重复执行。
②步长值可以为正数或负数,如果省略步长值,则步长值默认为1。
③For 循环的循环次数可以按以下公式计算:
循环次数=INT((终值−初值)/步长)+1
④Exit For语句的作用与Do循环中的Exit Do语句作用相同,用于强制结束循环。
For循环的执行过程是:先给循环变量赋初值,然后判断其值是否超过终值。若没有超过,则执行循环体,遇到Next语句时,循环变量自动增加一个步长值,然后返回For语句处,将循环变量的当前值再与终值比较;若没有超过,则继续执行循环体,直至循环变量的当前值超过终值或遇到Exit For语句,程序才退出当前循环,执行Next后面的语句。
【例7-6】使用For循环求1到100的累加和。
3.标号与GOTO语句
GoTo语句用于实现无条件转移。使用格式为:
GoTo 标号
程序运行到此结构,会无条件转移到其后的“标号”位置,并从那里继续执行下去。GoTo语句使用时,“标号”位置必须首先在程序中定义好,否则跳转无法实现。
1)使用GoTo跳过代码块
VBA的GoTo Label语句将代码转移到名为“Label:”的位置,并从该点继续执行。注意:“Label:”后面的冒号是用来特指标号的符号。然而,在GoTo后的标号名后面则不需要冒号。实际上,若添加了冒号,会得到“Label not found”的错误消息。
标号定义时名字必须从代码的最左列(第1列)开始书写。例如:
2)避免使用GoTo
GoTo语句是早期Basic语言中常用的一种流程控制语句。它的使用,尤其是过量使用,会导致程序运行跳转频繁、程序控制和调试难度加大,因此在VBA等程序设计语言中都应尽量避免使用GoTo语句而代之以结构化程序语句。
在VBA中,GoTo语句主要用于错误处理“On Error GoTo Label”结构。