让相同的代码重复执行多次

如果想在活动工作表前插入一张工作表,代码可以写为:


access vba 多次运行循环写入 vba代码循环执行_vba跳出for本次循环

如果想将这行代码重复执行 5 次,可以在过程中编写 5 行相同的代码,如:


access vba 多次运行循环写入 vba代码循环执行_vba跳出for本次循环_02

前面说过,VBA代码就像录下来歌曲,执行代码就像播放歌曲,音乐可以循环播放,过程中的VBA代码也可以设置循环执行,For…Next语句就是设置代码循环执行的一种开关。

如果想让插入工作表的代码循环执行 5 次,可以将过程写为:


access vba 多次运行循环写入 vba代码循环执行_vba 在光标插入文字_03

执行这个过程的效果如图 4-12 所示。


access vba 多次运行循环写入 vba代码循环执行_vba跳出for本次循环_04

 For…Next 语句是怎样工作的

执行过程后能在工作簿中插入 5 张新工作表,这是因为过程中的For…Next语句让代码“Worksheets.Add”重复执行了 5 次。


access vba 多次运行循环写入 vba代码循环执行_vba跳出for本次循环_05

VBA靠“For i = 1 To 5 Step 1”中的 3 个数字确定重复执行代码的次数。这行代码中的i是循环变量,数字 1、5、1 分别是循环变量的初值、终值和改变的步长值。每个For…Next语句都可以写成这样的结构:


access vba 多次运行循环写入 vba代码循环执行_vba跳出for本次循环_06

将For…Next语句的第一行代码写为“For i = 1 To 5 Step 1”,说明在执行过程时,VBA会让循环变量i的值从 1 增加到 5,每次增加 1(增加多少,由Step后的步长值确定)。因为从 1 到 5 共有 5 个数字,所以会执行 5 次循环体部分的代码,如图 4-13 所示。


access vba 多次运行循环写入 vba代码循环执行_vba 在光标插入文字_07

如果For…Next语句的第一行是“For i = 3 To 13 Step 2”,则VBA会执行循环体部分的代码 6 次,具体的执行流程如图 4-14 所示。


access vba 多次运行循环写入 vba代码循环执行_vba 在光标插入文字_08

也可以将终值设置为小于初值的数,但此时应将步长值设置为负整数,如:


access vba 多次运行循环写入 vba代码循环执行_vba 在光标插入文字_09

将代码写成这样,VBA每执行一次循环体,变量i就增加-1,直到小于终值 1 才终止执行For…Next语句。具体的执行流程如图 4-15 所示。


access vba 多次运行循环写入 vba代码循环执行_vba跳出for本次循环_10

使用 Exit For 语句跳出 For…Next 循环

可以在循环体中任意位置加入Exit For来终止并跳出循环,如:


access vba 多次运行循环写入 vba代码循环执行_vba 在光标插入文字_11

无论For…Next语句设置执行循环体多少次,当执行Exit For语句后,VBA都会跳出For…Next循环,执行Next之后的代码,如图 4-16 所示。


access vba 多次运行循环写入 vba代码循环执行_vba 在光标插入文字_12

For…Next语句总可以写成这样的结构:


access vba 多次运行循环写入 vba代码循环执行_vba 在光标插入文字_13

借助循环为多个成绩评定等次


access vba 多次运行循环写入 vba代码循环执行_vba 在光标插入文字_14

如图 4-17 所示,如果要为B2 的成绩评定等次,可以用下面的过程:


access vba 多次运行循环写入 vba代码循环执行_vba 在光标插入文字_15

可是,这样的过程只能处理一条记录,如果要处理的是图 4-18 所示的数据,应该怎么办呢?


access vba 多次运行循环写入 vba代码循环执行_vba跳出for本次循环_16

access vba 多次运行循环写入 vba代码循环执行_vba跳出for本次循环_17

没错,思路正确。但你可能会将过程写成这样,如:


access vba 多次运行循环写入 vba代码循环执行_vba 在光标插入文字_18

access vba 多次运行循环写入 vba代码循环执行_vba跳出for本次循环_19

想知道评定等次的Select…Case语句有没有被执行 10 次,可以将光标定位到过程中的任意位置,连续执行【调试】→【逐语句】(或连续按键)观察过程的执行过程,如图4-20 所示。


access vba 多次运行循环写入 vba代码循环执行_vba 在光标插入文字_20

很显然,评定等次的Select…Case语句虽然执行了 10 次,但这 10 次都是处理相同的单元格,所以只为一个成绩评定了等次。

为什么会这样呢?看看Select…Case语句中用来对比的成绩和写入等次的单元格,应该就明白了。


access vba 多次运行循环写入 vba代码循环执行_vba 在光标插入文字_21

要解决这个问题,不仅要让Select…Case语句重复执行 10 次,还要让每次执行时,参与计算的单元格都不是固定的单元格:执行第 1 次,操作的是B2 和C2,执行第 2 次,操作的是B3 和C3……执行第 10 次,操作的是B11 和C11。这就需要用一个变量去代替Range("B2")和Range("C2")中的数字 2,让这个变量每执行一次就在原来的基础上增加 1,如:


access vba 多次运行循环写入 vba代码循环执行_vba跳出for本次循环_22

修改完成后,再次执行过程,就能得到如图 4-21

所示的结果了。


access vba 多次运行循环写入 vba代码循环执行_vba 在光标插入文字_23

在这个过程中,一共使用了两个变量:循环变量i和表示行号的变量Irow,其中i用来控制重复执行Select…Case语句的次数,Irow用来控制代码要处理的单元格。也可以用同一个变量来完成这两个任务,将代码写为:


access vba 多次运行循环写入 vba代码循环执行_vba跳出for本次循环_24

提示:变量是存储数据的容器。如果变量i中存储的数据是 2,那么代码"C" & i与"C" & 2 的效果

是相同的,返回的结果都是“C2”。