这是免费教程《Excel VBA:办公自动化》的第11节,介绍嵌套循环结构。
1.认识VBA:什么是VBA?
2.这些掌握了,你才敢说自己懂VBA
3.VBA变量5年踩坑吐血精华总结
4.VBA中重要的强制申明,谁看谁明白
5.VBA掌握循环结构,包你效率提高500倍
6.精通VBA分支结构,少写程序100行
7.VBA程序报错,用调试三法宝,bug不存在的
8.VBA字符串介绍,这篇就够了
9.还自己写代码?VBA录制宏了解下
10.VBA循环结构没过瘾,那就再来一篇
看了前前面的系列VBA内容,我想大家肯定都发现一个问题:前面所有实战案例都是在处理「单列多行」问题,可实际工作中我们往往遇到的是「多行多列」问题,这个问题应该如何处理呢?
我想说的是,这一节嵌套循环的分享就是专门谈论这个问题的。
1.什么是循环嵌套?
所谓的「循环嵌套」就是将我们前面所分享的分支结构、循环结构等组合起来,然后完成单个知识点难以单独完成的复杂任务。
通俗解释就是:IF循环和WHILE循环大家组合在一起。你中有我,我中有你,实现工作的实际需求。
2. 循环嵌套案例实操
案例:将利用「1-宏程序」根据「2-层级划分」的规则,对「3-数据区域」数据进行处理,形成「4-输出结果」。
首先,我们对这个案例的需求进行初步分析:
“利用「1-宏程序」”就是绘制一个颜值较高的圆角矩形,然后将其指定我们将要写的宏程序。
“根据「2-层级划分」的规则”就是根据右侧的分级结构条件,利用IF分支结构进行指定条件判断。
“对「3-数据区域」数据进行处理”就是选择自己擅长的循环结构,对指定的数据区域进行逐个循环。
“形成「4-输出结果」”就是在指定位置输出指定格式的结果。
分析完上述的需求以后,我们基本是思路已明,那就继续前行。
和前面一样,首先,我们将已实现案例功能的代码展示出来;然后,阐述该段代码的主要架构;最后,模拟代码的运行,以便于加深大家的理解。
通过上图展示的代码,我们可以看到整个代码的核心架构采用了3层嵌套结构,分别为:
第1层的Do...While循环结构,其主要用来控制表格「行」方向的循环;
第2层的For循环结构,其主要用来控制表格「列」方向的循环;
第3层的IF分支结构,其主要用对指定条件进行判断。
通过3者组合起来形成的循环嵌套结构,最终完成了上述案例中较为复杂的「多行多列」需求。
根据上文的代码,我们模拟一下这个小程序的运行过程
1)程序读取前5行
程序使用了「强制申明」,定义了变量i和变量j,且将变量i赋初始值为3,而赋值变量i为3的主要原因是:因为变量i控制「行」方向的循环,而数据区域的判断是从第3行开始的。
2)程序执行Do...While循环体
程序读取「Do While Cells(i, 2) <> ""」表明程序进入了第1层的「行循环」,换句话就是:单元格B3的值是否为空?我们通过查看左侧发现「单元格B3=738」,不为空。然后,程序进入下一行执行。
3)程序执行For循环结构
程序读取「For j = 2 To 7」表明程序进入了第2层的「列循环」,换句话就是:j的取值在2到7之间,每循环一次j的值就增加1 ,直到j=7时整个For循环结束。
看到这里,可能大家有些疑问了,为什么变量i要限制它的取值范围?
大家心中肯定早就拥有了自己的答案:之所以将变量j的值限定在2-7之间,是因为我们需要判断的数据区域主要分布在B列-G列,其对应的cells数字值就是2-7。
4)程序执行IF分支结构
至此程序进入了If分支结构,通过前面我们可以知道此时:i = 3,j = 2,即:「Cells(2, 3)」表示「单元格B3」,通过查看左侧数据可以看到「单元格B3 = 738」,其位于「富农」范围区间,那么很明显只有第二个分支结构符合上述条件,即:程序自动执行「ElseIf Cells(i, j) >= 500 And Cells(i, j) < 700 Then」和「Cells(i, j) = Cells(i, j) & " | 富农"」。
而由于根据规则,符合条件后的单元格,将以指定的格式——「收入 | 等级」写入结果,比如:「738 | 土豪」。因此,才会出现「Cells(i, j) = Cells(i, j) & " | 富农"」这句代码。
然后,等到变量j执行完了其在2-7区间的所有取值后,原表第3行所有的数据将会转换完成,如下图:
换句话的意思就是:当「i = 3」时,For分支结构要循环1轮变量j,对于原表来说其就完成了第3行数据的转化。
5)程序读取「i = i 1」和「Loop」
当程序执行到「i = i 1」时候,表明上一轮变量i的循环执行已经完成;而程序执行到「Loop」时,则表明程序准备执行下一轮。
当程序符合「Do While Cells(i, 2) <> ""」这个条件时,程序将继续执行下一轮。一旦不符合上述条件,那么整个程序将跳出「Do...While」循环。
当「i = 15」时,此时「Cells(i, 2)」表示「单元格B15」,查看左侧表格可以发现,单元格为空,不符合条件,由于下面没有其他代码,进入「End Sub」语句,直接结束。
3.总结
循环嵌套就是将我们前面所分享的分支结构、循环结构等组合起来,然后完成单个知识点难以单独完成的复杂任务。
通过上文我们可以发现:循环嵌套可以类比为乐高积木,用不同的积木组合不用的东西。至于组合成什么,则取决于你的思考、实践,再思考和再实践,如此反复。
我们发现,其实世界上很多东西都是由不同的小模块组成的。知识也是这样,只有不断的积累、不断的实践,而其他的都交给时间就好了。