关于循环

第三篇、基础的编程知识:循环

编程中的循环是什么?

  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循环是最好的方法。
  • 语法:
复制成功!
1

For 计数器 = 起始值 To 结束值 [Step 步长]
    '循环执行的代码
Next 计数器

  • 示例1:没有 [Step 步长]:
复制成功!
1

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 步长]:
复制成功!
1

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个房间。

  • 语法:
复制成功!
1

For Each 元素 in 集合
    '循环执行的代码
Next 元素

  • 示例1:
复制成功!
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来修改代码。

  • 示例
复制成功!
1

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是最常用循环结构,需熟知!至于其他的循环暂了解即可,先知道有这种循环的的方式,在遇到具体问题时在求详解,慢慢就能熟知所有 !

请开发者喝杯咖啡 请开发者喝杯咖啡!