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

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

Excel VBA入门(四)流程控制2-循环控制的更多相关文章

  1. Excel VBA入门(三) 流程控制1-条件选择

    VBA中的流程控制分为两种,其一是条件结构式的,即根据条件判断的结果去选择性执行相应的语句(块):另一种是循环,即循环地执行语句(块).本节介绍第一种. 1. IF if 语句其实包含有几种形式: ① ...

  2. Excel VBA入门(九)操作工作薄

    虽然我前面讲过,在VBA中操作工作薄并不是件明智的事,但有些时候,还是避免不了要这么做.绝大多数情况下,我们要做的是获取到某个工作薄对象,并以此来获得其中的工作表对象,然后再对工作表中的数据进行处理. ...

  3. Excel VBA入门(八)单元格边框

    本文基于以下文件 http://pan.baidu.com/s/1nvJtsu9 (部分)内容预览: 1. 边框样式 Sub cell_format() Dim sht As Worksheet Di ...

  4. Excel VBA入门(七)注释、宏按钮及错误处理

    系统性的知识前面已经讲完,从本章开始,本系列教程涉及的将会是一些相对凌散的内容. 1. 注释 代码注释是一件利人利己的事,为了方便自己在代码需要更新修改时,依然能够快速地看懂自己完的每一行代码到底是什 ...

  5. Excel VBA入门(六)过程和函数

    前面讲过,VBA代码有两种组织形式,一种就是过程(前面的示例中都在使用),另一种就是函数.其实过程和函数有很多相同之处,除了使用的关键字不同之外,还有不同的是: 函数有返回值,过程没有 函数可以在Ex ...

  6. Excel VBA入门(五)Excel对象操作

    本章是本系列教程的重点.但我觉得应该不是难点.从第零章开始到学完本章,应该可以把VBA用于实战中了. Excel对象主要有4个: 工作薄 Workbook 工作表 Worksheet 单元格区域 Ra ...

  7. Excel VBA入门(一)数据类型

    与其它的编程语言一样,VBA也有它自己的数据类型.讲到数据类型,就离不开"变量"与"常量"这两个概念,变量与常量,都是用于保存数据的.顾名思义,"变量 ...

  8. Excel VBA入门(二)数组和字典

    数组和字典也是VBA的常用到数据类型之一.但是我翻了有四五本VBA教程相关的书,里面都没有介绍到字典,数组到是在介绍数据类型时有介绍,而并没有提到字典. 事实上,字典不是VBA内置的类型,它是Wind ...

  9. Excel VBA 入门(零)

    本教程所用系统环境: Windows 10 Excel 2013 1. 添加开发工具 打开Excel,依然找到"文件"->"选项"->"自 ...

随机推荐

  1. bzoj1588[HNOI2002]营业额统计——双向链表

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1588 简单Splay.但用双向链表做.很好的思路. 1.(离线)按值排序,记下pre和nxt ...

  2. Java API 操作 Mongodb

    本次测试环境使用一台ip为 192.168.2.23 的虚拟机 一.依赖 <dependency> <groupId>org.mongodb</groupId> & ...

  3. JLink RTT Client代替printf(IAR测试OK)

    1.打开J-Link安装目录,确保SEGGER目录中有J-Link RTT Client,没有的话必须安装4.9以上版本: 2.打开SEGGER目录下软件SEGGER目录,硬件版本Hardware是8 ...

  4. awk:NF-NR-OFS-ORS-RS等参数

    ARGC 命令行参数个数ARGV 命令行参数排列ENVIRON 支持队列中系统环境变量的使用FILENAME awk浏览的文件名FNR 浏览文件的记录数FS 设置输入域分隔符,等价于命令行 -F选项N ...

  5. VB.NET实现32位、64位远线程运行ASM,注入非托管、托管DLL

    这是一个老话题,远线程函数给我们提供了机会在其他进程中启动一个新线程,所以我们可以做很多事情.但事情远远没有结束,如果我们要做的事情非常复杂,那么将面临编写大量的ASM代码,虽然我们可以用VC之类的工 ...

  6. 部署docker

    部署和开发环境不一样,我们不需要频繁地进入到容器内部,所以一般我们会将代码和环境打包到一块,部署到服务器上 Clone 代码 将项目代码克隆到本地 git clone git@git.coding.n ...

  7. 如何配置Python环境

    (1) 下载:请在Python官网下载页面(https://www.python.org/downloads/)选择合适的版本(建议选择3.5.2版)的链接,在该版本的下载页面选择合适的安装文件:64 ...

  8. web开发视频(一)之环境准备

    硬件环境: Win7+64位操作系统 1.安装 jdk.tomcat.eclipse; 2.配置 jdk 环境变量.tomcat环境变量 (jdk配置成功的标示是在命令提示符中输入 javac 给出对 ...

  9. 前段基础之HTML

    HTML 初识 web服务本质 import socket def main(): sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s ...

  10. 【洛谷】P1196 银河英雄传说(并查集)

    题目描述 公元五八○一年,地球居民迁至金牛座α第二行星,在那里发表银河联邦创立宣言,同年改元为宇宙历元年,并开始向银河系深处拓展. 宇宙历七九九年,银河系的两大军事集团在巴米利恩星域爆发战争.泰山压顶 ...