所谓循环控制,即在循环执行一段代码,用于完成一些重复性任务。
VBA中的循环控制语句主要有3种:for、while、loop。对于大多数人来说,for的使用频率最高,而我个人也觉得for是最为灵活的,在很多场合下都可以使用,相较while和loop,其逻辑也再加清晰,更便于对循环进行控制。
1. For循环
for循环有两种形式,一种为明确地知道要循环的次数的,比如从1到10循环执行10次;另一种则用于循环历遍某个集合对象,这个对象有多少个单位就循环执行多少次,可以视为是未知循环次数的。
① 循环次数已知的for
其格式如下:
for 计数变量=开始值 to 结束值
' 用于循环执行的语句
next
通常我们会需要对Excel表格中的每一行(或每一列)进行循环历遍,对其中单元格的值进行各种操作。这时候,就可以先求出该工作表中有多少行(或列),然后再逐行(列)进行判断。这个操作单元格的示例会在后面有专门的章节来讲解演示,这里就只讲循环语句本身了。
示例如下:
For i = 1 To 10
Debug.Print i
Next
以上代码将会依然输出1到10这10个数字
在这种形式的For里面,还可以在[结束值]后面加上Step,然后跟着写上步长,如果省略,则默认步长为1。像上例,默认是把i从1递增到10,即:1、2、3、4、5、6、7、8、9、10这样依次递增的。如果像下面这样写,把步长设置为2,则变成了:1、3、5、7、9。则循环体(即For里面的代码)只会执行5次。
For i = 1 To 10 Setp 2
Debug.Print i
Next
输出:1 3 5 7 9
② 循环次数不确定的For
格式如下:
For Each 循环变量 In 循环对象
' 循环执行的语句
Next 循环变量
结合之前讲过的数组来举个例子。假设已有数组myArr并且已赋值,则可以用以下代码历遍它的每个值:
For Each a In myArr
Debug.Print a
Next a
这样就不管这个数组包含有多少个元素,都可以逐个历遍。
2. Loop循环
Loop循环或许把它称为Do...Loop循环会更加合适。因为它的格式是先Do再Loop的。但我喜欢把它叫Loop循环。
Loop循环也有两种形式。第一种是先判断循环条件再开执行,第二种先执行一次然后再判断循环条件是否成立。
① 先判断再执行
格式如下:
Do [While | Until] 循环条件
' 用于循环执行的语句
Loop
这里的[While | Until]
表示两者随便用一个都可以。While
就是当条件成立的时候就执行,而Until
就是直到条件成立时就停止执行。也就是说,While用于指定循环的条件,说明什么时候就执行循环,而Until用于指定停止循环的条件,说明什么时候不再执行循环。这么说可能有些许抽象,举例说明。
Do While ... Loop
Sub test()
Dim i As Integer
i = 5
Do While i > 0
Debug.Print i
i = i - 1
Loop
End Sub
上例的输出结果是:5 4 3 2 1
Do Until ... Loop
Sub test()
Dim i As Integer
i = 5
Do Until i < 0
Debug.Print i
i = i - 1
Loop
End Sub
上例的输出结果是:5 4 3 2 1 0
逻辑还是很简单的,大家可以稍微分析下为什么用While时输出到1就停止了,而用Until时后面会多出个0,而如果需要不让它输出0程序应该怎么改写。搞清楚原因,这个While和Until的区别也就知道了,Loop循环应该也就掌握了。
② 先执行再判断
先执行再判断,即将条件判断语句放到Loop的后面,先Do一次,然后再Loop While或者Loop Until。
格式如下:
Do
' 用于循环执行的语句
Loop [While | Until] 循环条件
示例如下:
Do ... Loop While
Sub test()
Dim i As Integer
i = 5
Do
Debug.Print i
i = i - 1
Loop While i > 0
End Sub
输出结果为:5 4 3 2 1
Do ... Loop Until
Sub test()
Dim i As Integer
i = 5
Do
Debug.Print i
i = i - 1
Loop Until i < 0
End Sub
输出结果为:5 4 3 2 1 0
Loop循环总结:可以看到,无论是采用哪种形式的Loop循环,都可以得到相同的结果,实现同样的功能,而具体使用哪一种,纯粹是个人习惯(个人喜欢)。但无论使用哪一种,都一定一定要记得,必须要有能使循环结束的语句出现在循环中(例如前面例子中的i=i-1),否则程序会永远不停地执行下去。这时候除了在任务管理器中结束Excel外,就没有什么更好的办法了。
3. While循环
While循环有点类似于Loop循环,先判断条件是否成立,再开始(或结束)循环。而我看过的教程里面,有些是没有讲到While循环的。可能是作者觉得没有必要讲了。
While循环的格式如下:
While 条件判断语句
' 用于循环执行的语句
Wend
示例如下:
Sub test()
Dim i As Integer
i = 5
While i > 0
Debug.Print i
i = i - 1
Wend
End Sub
输出结果为:5 4 3 2 1
同样要记住的是,必须要有使循环能够结束的条件,否则程序会进入死循环中。
由以上示例可以看出,这3种循环语句,是有着某些共同之处的,特别是Loop和While循环。而事实上很多循环事件,用3者都能实现。具体使用哪一种,则或根据实际情况和使用习惯来选择。但相信对于大多数人来说,都会优先考虑使用For循环,因为它的条理更加清晰,流程控制更简易,适用的场景更广,语句也更简练(至少它不需要显式添加使循环结束的语句)
本系列教程其它文章
Excel VBA 入门(零)
Excel VBA 入门(一)数据类型
Excel VBA 入门(二)数组和字典
Excel VBA 入门(三) 流程控制1-条件选择
Excel VBA 入门(四)流程控制2-循环控制
Excel VBA 入门(五)Excel对象操作
Excel VBA 入门(六)过程和函数
Excel VBA 入门(七)注释、宏按钮及错误处理
Excel VBA 入门(八)单元格边框
Excel VBA 入门(九)操作工作薄
Excel VBA 入门(十)用户窗体开发