7.4.5 循环结构

7.4.5 循环结构

当程序需要连续反复执行某种操作时,如求1到100的累加和、求九九乘法表等,这些应用会反复进行相似的操作,如果归纳出重复操作的共同之处,使用很少的代码量去实现该功能,将使代码简洁,同时提高程序效率,VBA中通过循环结构来实现这种重复操作功能。

VBA中通过多种循环语句来实现循环操作,主要有两类结构,如图7-21所示。

img404

图7-21 两种循环结构

(a)当型循环结构;(b)直到型循环结构

由上图可以看出,两种循环有以下特点:

①循环的执行和结束由满足条件控制,循环体部分可以是一条语句,也可以是多条语句;

②当型循环与直到型循环的区别在于:当型循环条件先判断条件是否满足,再执行循环体,而直到型循环是先执行循环体再判断条件是否满足;

③当型循环有可能一次都不执行,而直到型循环至少会执行一次。

VBA中常用的循环有Do … Loop循环和For … Next循环。

1.Do… Loop循环

1)当型循环结构

img405

2)直到型循环结构

img406

img407

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)

img408

(3)(4)

img409

img410

(5)

img411

2.For …Next循环

For …Next循环语句称为计数循环语句,如果已知循环执行次数,或有明确的开始和结束,使用For …Next将比Do …Loop更方便。For …Next语法格式如下:

img412

注意:

①For与Next语句必须成对出现,它们之间的语句序列为循环体,可以重复执行。

②步长值可以为正数或负数,如果省略步长值,则步长值默认为1。

③For 循环的循环次数可以按以下公式计算:

循环次数=INT((终值−初值)/步长)+1

④Exit For语句的作用与Do循环中的Exit Do语句作用相同,用于强制结束循环。

For循环的执行过程是:先给循环变量赋初值,然后判断其值是否超过终值。若没有超过,则执行循环体,遇到Next语句时,循环变量自动增加一个步长值,然后返回For语句处,将循环变量的当前值再与终值比较;若没有超过,则继续执行循环体,直至循环变量的当前值超过终值或遇到Exit For语句,程序才退出当前循环,执行Next后面的语句。

【例7-6】使用For循环求1到100的累加和。

img413

img414

3.标号与GOTO语句

GoTo语句用于实现无条件转移。使用格式为:

GoTo 标号

程序运行到此结构,会无条件转移到其后的“标号”位置,并从那里继续执行下去。GoTo语句使用时,“标号”位置必须首先在程序中定义好,否则跳转无法实现。

1)使用GoTo跳过代码块

VBA的GoTo Label语句将代码转移到名为“Label:”的位置,并从该点继续执行。注意:“Label:”后面的冒号是用来特指标号的符号。然而,在GoTo后的标号名后面则不需要冒号。实际上,若添加了冒号,会得到“Label not found”的错误消息。

标号定义时名字必须从代码的最左列(第1列)开始书写。例如:

img415

2)避免使用GoTo

GoTo语句是早期Basic语言中常用的一种流程控制语句。它的使用,尤其是过量使用,会导致程序运行跳转频繁、程序控制和调试难度加大,因此在VBA等程序设计语言中都应尽量避免使用GoTo语句而代之以结构化程序语句。

在VBA中,GoTo语句主要用于错误处理“On Error GoTo Label”结构。