关于循环
第三篇、基础的编程知识:循环
编程中的循环是什么?
Excel VBA中的循环(Loop) 是一种重复执行特定代码块的结构,用于自动化处理重复性任务(如批量操作单元格、遍历数据等)。
比如你需要处理重复性任务:从10个布局一模一样的房间,拿一个相同的水果出来放到领导的房间的果盘里,写上苹果来自哪里。现实生活中你需要,走进A房间→拿到苹果→走进领导房间→写上“A“→放到果盘,重复的走到B房间做一样的动作,再走到C、走到D......,直到执行完整个过程。但是在程序语言中,你只需要写一套动作,走进??房间→拿到苹果→走进领导房间→写上“??“→放到果盘,把??当成房间对象,从A循环到I即可。这就是循环的价值!
VBA编程有哪些循环结构?
Excel VBA循环结构有多种,每种循环结构的使用方法、优缺点和适用场景有所不同。
常见循环结构:
- 1、For...Next 循环
- 2. For Each...Next 循环
- 3. Do While...Loop 循环
- 4. Do Until...Loop 循环
- 5. Do...Loop While 和 Do...Loop Until
较为常用的两种循环结构介绍
这里只介绍For...Next 循环和For Each...Next 循环在本案例中的使用方法,🔗其他的循环结构,通过下一篇了解
仍延续上篇的案例:
案例:集团公司收集共享工作簿,有100(10个变100个)个地市分公司的月累拜访客户统计,每个工作表是一个分公司,表中有详细的日拜访量、留资量等信息,行数无限扩展,但是总的合计数都是固定表头的“B3:G3”单元格,如何每日快速汇总到总表里?
本节视频:
1-For...Next 循环
- 当你已经知道需要循环的次数,如上面的10个房间需要遍历10次,遍历固定范围的单元格等,For...Next循环是最好的方法。
- 语法:
For 计数器 = 起始值 To 结束值 [Step 步长]
'循环执行的代码
Next 计数器
- 示例1:没有 [Step 步长]:
Sub For_Next()
Dim i As Integer
For i = 1 to 10
Debug.Print i * 10
Next
End sub
- 从数值1开始执行到10(循环10次),循环执行的代码就是:在立即窗口中输出数值和10的乘积。
- Dim i As Integer:定义变量类型,Integer为整数类型。
- Debug.Print:用来输出各种信息到“立即窗口”,常在调试程序时使用,不影响程序执行。
- 从当前起始值开始执行,直到i = 10,结束循环
- 输出信息是:10,20,30,40,50,60,70,80,90,100
- 示例2:有 [Step 步长]:
Sub For_Next_step()
Dim i As Integer
For i = 3 to 10 step 2
Debug.Print i
Next
End sub
- 从数值3开始执行到10,步长为2(循环(10-3+1)/ 2 =4次),循环执行的代码就是:在立即窗口中输出数值本身。输出的信息是:3,5,7,9。
2-For Each...Next 循环
你可能不太清楚要循环的次数,但是你知道你要执行的对象是什么
比如之前的从房间里拿苹果的例子,你不知道有多少个房间,但是你知道是从这层楼或这栋楼的每个房间里拿,而不是在楼道、电梯、栏杆等这些地方拿,这时我们就可以把房间当成一个对象,只需要对每个房间对象执行操作就可以了。For Each...Next循环的用途,就是遍历集合中的每个对象。相当于把这层或这栋楼当成集合,把房间当对象。一个集合可能有N多对象,一栋楼里可能也会有N个房间。
- 语法:
For Each 元素 in 集合
'循环执行的代码
Next 元素
- 示例1:
Sub For_Each_Next()
Dim sht As WorkSheet
For Each sht in Thisworkbook.Shtees
Debug.Print sht.name
Next
End sub
- 遍历该工作薄的内的所有工作表,循环执行的代码就是:在立即窗口中输出工作表名称。
- Dim Sht As Worksheet:定义变量类型为工作表对象。
- Debug.Print sht.name:“立即窗口”输出工作表的名称,.name名称属性。
- 从第一个工作表对象开始,直到遍历所有的工作表
- 我们是在“案例”的工作薄中做的测试,输出信息是:汇总、北京、上海、郑州,等工作表名
3-对上一篇录制的宏案例,用“循环”结构来修改代码
上一篇我们录制了宏代码,执行的操作是从每个分公司的数据表中,汇总数据到总表内,只是为了演示如何录制和查看宏代码,我们只操作了“北京”和“上海”两个分公司。了解了循环结构,我们来尝试循环从所有的表中取值!
这个案例,我们既知道分公司的数量,也知道要取值的数据都是在工作表对象内,所以For ...Next和For Each...Next循环结构都可以实现。我们用For Each...Next来修改代码。
- 示例
Sub 用循环结构取值()
' 汇总各分公司的数据
Dim sht As WorkSheet
Dim i As Integer
i = 1
For Each sht in Thisworkbook.Sheets
'我们把第一段中所有的Sheets("北京"),替换成sht的循环的工作对象
'需要粘贴到“汇总表”中的位置,替换成变动的单元格对象
’第一小段
'Sheets("北京").Select
sht.Select '修改一:替换工作表对象
Range("B2").Select
Selection.Copy
Sheets("汇总").Select
’Range("A3").Select
Range("A"&i + 1).Select '修改二:替换单元格对象
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
’第二小段
'Sheets("北京").Select
sht.Select '修改一:替换工作表对象
Range("D2").Select
Application.CutCopyMode = False
Selection.Copy
Sheets("汇总").Select
'Range("B3").Select
Range("B"&i + 1).Select '修改二:替换单元格对象
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
’第三小段
'Sheets("北京").Select
sht.Select '修改一:替换工作表对象
Range("D3").Select
Application.CutCopyMode = False
Selection.Copy
Sheets("汇总").Select
'Range("C3").Select
Range("C"&i + 1).Select '修改二:替换单元格对象
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
’第四小段
'Sheets("北京").Select
sht.Select '修改一:替换工作表对象
Range("B3").Select
Application.CutCopyMode = False
Selection.Copy
Sheets("汇总").Select
'Range("D3").Select
Range("D"&i + 1).Select '修改二:替换单元格对象
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
i = i + 1 '每遍历一个工作表(循环一次),i数值增加1,实现在汇总表里的换行
Next sht
End sub
我们执行修改后的代码,顺利运行!这样来看,即使将来再增加多少个表都不在话下,我只要录制了一个宏、使用了一个循环结构,取数秒结束~~。
到了此处,相信已经对Excel_VBA有了认识与认知。即使之前对VBA没有丁点概念,截止到目前了解到的内容,加上DeepSeek、文心一言等辅助工具对判断、对象、对象的属性和方法等做了解后,就能 解锁相当多的“批量、程序化处理”的任务了。
知识的疆域浩瀚无垠,越 是深入,越能看清自己的渺小——正如海岸边的沙粒,越是靠近海洋,越懂得敬畏浪涛的深邃。每一行代码的调试、每一个功能的实现,都在提醒我们:了解越多,越知不足;钻研越深,越懂敬畏。那些看似复杂的循环、函数与逻辑,终将在你的手中化为行云流水的工具——不是因为你天生擅长,而是因为你在「不会」与「学会」之间,选择了坚持。
我们来逐步尝试了解其他基础知识,最终看能解决遇到的什么问题,遇山开路、遇水建桥,将基础知识串联起来解决越来越多的问题!
想象下:未来用10行代码解决原本半个小时的手动操作。下一篇:了解其他循环结构的使用:
循环代码作为自动化处理数据的核心工具,不同类型的循环适用于不同场景。For...Next和For Each...Next是最常用循环结构,需熟知!至于其他的循环暂了解即可,先知道有这种循环的的方式,在遇到具体问题时在求详解,慢慢就能熟知所有 !
请开发者喝杯咖啡!