概述
如果在VBA程序中,需要多次执行同一任务(即重复同一段代码),则可以使用循环来完成。
VBA循环类型包括:
- For循环For Loop
- Do While循环Do While Loop
- Do Until循环Do Until Loop
下面分别讨论每种循环类型。
For循环
For循环采用两种不同的形式,即For ... Next循环和For Each循环。
For ... Next循环
For ... Next循环使用一个变量,该变量遍历指定范围内的一系列值,对每个值执行循环体中的代码,如下所示:
![47d4f42d2c2d4ac4c6043096f60685db.png](https://i-blog.csdnimg.cn/blog_migrate/a9c9361b0f4426ac6d9ee40b10344740.jpeg)
示例中的For ... Next循环设置变量i的值为1、2、3、…、10,并且对于每一个值,都执行同一段代码。因此,在上面的例子中,循环将数组iArray的每个元素值加到变量Total中。
上面的示例中没有指定步长,因此循环从1增长到10的过程中,使用默认步长1。但是,也可以使用不同的步长来执行循环,使用Step关键字实现这一功能,如下所示:
![ee387500a6981a618f7688974907796f.png](https://i-blog.csdnimg.cn/blog_migrate/78db15473d64ae51c3160aa3add87567.jpeg)
在上面的示例中,步长被指定为0.1,因此每次循环时,变量d的值依次设置为0.0、0.1、0.2、0.3、…、9.9、10.0。
也可以使用负步长,如下所示:
![56368b70627dfebb7ba081748110f713.png](https://i-blog.csdnimg.cn/blog_migrate/9fe37fa0786977bc0b17e6bf1cf5d670.jpeg)
在上面的示例中,步长被指定为-1,因此循环将变量i依次设置为值10、9、8、…,1。
For Each循环
For Each循环类似于For ... Next循环,但是For Each循环遍历一组对象中的每个对象,而不是获取变量的一系列值。例如,以下代码使用For Each循环列出当前Excel工作簿中每个工作表:
![0f6556c02104403745ac36637eb0ca9a.png](https://i-blog.csdnimg.cn/blog_migrate/54f45cc1df6a9b79d164038d7e5032e8.jpeg)
Exit For语句
Exit For语句用于提前退出For循环,该语句将导致VBA跳出循环并继续执行循环体外的下一行代码。例如,在数组中搜索特定值时,使用循环检查数组的每个元素,一旦找到目标值,就不需要再继续搜索,此时可以提前退出循环。
下面的示例Exit For语句的使用,代码循环遍历100个数组元素,并将每个元素与值dVal进行比较,如果找到dVal值,循环将提前退出:
![b3d1e021933d31a2fa62441e434f8843.png](https://i-blog.csdnimg.cn/blog_migrate/9a09def4d0ed1906eefdb1351cd52fb7.jpeg)
Do While循环
当指定的条件求值为True时,Do While循环重复执行一段代码。如下子程序所示,Do While循环用于打印Fibonacci序列的所有值,直到当前值大于1000时停止循环:
![5cf084cd00e5ebe08b2c1bbd5a2051d6.png](https://i-blog.csdnimg.cn/blog_migrate/5167875f5cc160b8cdbb8a87ef874624.jpeg)
同以上可以看出,条件iFib_Next<1000在循环开始时被测试。因此,如果iFib_Next的第一个值大于1000,则根本不会执行循环。
还可以把Do While循环的条件测试放在循环的末尾,这将导致循环至少执行一次,而不管条件最初的计算结果是否为True。
以下代码显示了Do While循环的另一种形式,在循环末尾测试条件:
![528e9ed74ffe1264da74e42249335d27.png](https://i-blog.csdnimg.cn/blog_migrate/7720046d0b3695c074c2f6facfcaa2c6.jpeg)
Do Until循环
Do Until循环与Do While循环非常相似,重复执行一段代码,直到指定的条件计算为True。如下子程序所示,使用Do Until循环从工作表a列的所有单元格中提取值,直到遇到空单元格为止:
![54c89902b986e4164f87ef2129e3310a.png](https://i-blog.csdnimg.cn/blog_migrate/f6d506c68ce7947396c4e9576a373daf.jpeg)
在上面的例子中,由于条件IsEmpty(Cells(iRow,1))处于Do Until循环的开始,因此只有遇到的第一个单元格非空时,才会进入循环。
与Do While循环相同,如果希望至少进入一次循环,而不管初始条件如何,在这种情况下,条件可以放在循环的末尾,如下所示:
![2891fb1edf118851ed7400438429b69f.png](https://i-blog.csdnimg.cn/blog_migrate/e54c62094127f48a6cfd3b976667773e.jpeg)