Excel VBA入门(四)流程控制2-循环控制

所谓循环控制,即在循环执行一段代码,用于完成一些重复性任务。

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 入门(十)用户窗体开发

posted @ 2017-11-05 19:24  东围居士  阅读(18564)  评论(0编辑  收藏  举报