其他循环结构
第四篇、其他循环结构
Excel VBA编程中的其他循环结构
通过上一篇,详细了解了For...Next和For Each...Next两种最常用的循环结构,Excel VBA还有其他四种循环结构,不同类型的循环适用于不同场景,我们也一样通过:语法、示例、现实场景举例来详细了解它们。
其他的循环结构:
- 3. Do While...Loop 循环
- 4. Do Until...Loop 循环
- 5. Do...Loop While 和 Do...Loop Until
1-Do While...Loop循环
是Excel VBA 中一种常用的循环结构,用于在满足指定条件时重复执行一段代码块。它的特点是:先判断条件,再决定是否执行循环体。如果条件为 True,则执行循环;否则退出循环。
当你不知道需要循环的次数,但是知道所有的循环都要满足某个相同的条件时,用Do While...Loop循环在恰好不过。
如:对从Sheet表中A列的第二行开始,对非空单元格数值累计求和,直到第一个空单元格为止,案例就满足了不知道循环的次数(不知道第一个空单元格出现的位置)、需要循环的单元格都满足某个相同的条件(都是非空的数值)。
本节视频:
语法:
Do While 条件
' 需要重复执行的代码块
Loop
示例:
Sub 测试Do_While_Loop循环()
Dim i As Integer
Dim total As Double
i = 2 ' 从第2行开始
total = 0 ' 初始化总额
Do While Cells(i, 1).Value <> "" ' 当A列单元格不为空时循环
total = total + Cells(i, 1).Value
i = i + 1 ' 移动到下一行
Loop
Debug.print "合计数为:" & total '立即窗口显示合计值
MsgBox "合计数为:" & total ’弹窗显示合计值
End Sub
- 1、变量 i 从第2行开始遍历,total 存储累加结果;
- 2、Do While后跟着条件:Cells(i, 1).Value <> "" A列当前单元格非空;
- 3、非空时执行的代码块,累加单元格的值到 total,并将行号 i 递增;
- 4、Loop循环结束,当遇到空单元格时,条件变为 False,退出循环;
- 5、Debug.print在立即窗口输出结果
- 6、MsgBox并弹出结果。
一定要注意避免无限循环:确保循环内有改变条件的语句(例如 i = i + 1),否则条件永远为 True,导致死循环。
2-Do Until...Loop循环
和Do While...Loop用法类似。它的特点同样是:先判断条件,再决定是否执行循环体。条件变成了如果条件为False,则执行循环;否则退出循环。一个是条件为True-真时执行循环,一个是False-假时。
当你不知道需要循环的次数,但是知道所有的循环都不满足某个相同的条件时,就用Do Until...Loop循环。
延续上一个案例,对从Sheet表中A列的第二行开始,到第一个空单元格出现前,对单元格数值累计求和,案例同样满足不知道循环的次数(不知道第一个空单元格什么时候出现)、需要循环的单元格都不满足某个相同的条件(都不是空的数值)。
本节视频:
语法:
Do Until 条件
' 需要重复执行的代码块
Loop
示例:
Sub 测试Do_Until_Loop循环()
Dim i As Integer
Dim total As Double
i = 2 ' 从第2行开始
total = 0 ' 初始化总额
Do Until Cells(i, 1).Value = "" ' 当A列单元格为空时循环
total = total + Cells(i, 1).Value
i = i + 1 ' 移动到下一行
Loop
Debug.print "合计数为:" & total '立即窗口显示合计值
MsgBox "合计数为:" & total ’弹窗显示合计值
End Sub
- 1、变量 i 从第2行开始遍历,total 存储累加结果;
- 2、Do Until后跟着条件:Cells(i, 1).Value = "" A列当前单元格是空时;
- 3、是空时执行的代码块,累加单元格的值到 total,并将行号 i 递增;
- 4、Loop循环结束,当满足空单元格时,条件变为 True,退出循环;
- 5、Debug.print在立即窗口输出结果
- 6、MsgBox并弹出结果。
3-Do...Loop While 和Do...Loop Until循环
这两个本质上就是Do While...Loop 和 Do Until...Loop的变体语法。Excel VBA 中的一种后测试在循环,其特点是先执行循环体代码,再检查条件。即使条件初始为 False,循环体也会至少执行一次。这种循环适用于需要“先执行操作,后验证结果”的场景。
Do While...Loop 和 Do Until...Loop是从初次循环时就开始检查,可能需要执行的代码块一次都不被执行,因为会先检查判断符不符合执行的条件。
Do...Loop While 和Do...Loop Until 则是执行一次后,在检查条件是否符合,无论如何都会先执行一次代码块。
当需要你对某个空白事务贡献内容、且该内容必须符合某个条件,就用到了Do...Loop While 和Do...Loop Until循环。因为至少先允许你贡献一次,才能判断内容是否满足条件,再决定是否保留该内容。
如:要求用户在从Sheet表中A2单元格输入一个正的正数,如果输入不合法(如负数、文本、空值或小数)就清空,且弹出提示重新输入,直到输入正确的值为止。案例满足了必须得先执行一次(先输入内容)、在判断输入是否符合条件,直到输入合法为止。
本节视频:
语法:
Do
' 需要重复执行的代码块
Loop While 条件
Do
' 需要重复执行的代码块
Loop Until 条件
- 1、执行一次代码块,执行到Loop While时检查是否为True,如果为True返回Do继续执行循环,如果为False,则退出循环;
- 2、执行一次代码块,执行到Loop Until时检查是否为False,如果为False返回Do继续执行循环,一直到条件为True,则退出循环;
示例:
Sub 测试Do_Loop_While循环()
Dim userInput as Variant
Dim yn as Boolean
Do
'弹出窗口要求用户输入
userInput = InputBox("请输入一个正数:","输入验证")
'验证输入的内容是否为数值且大于0
if IsNumeric(userInput) And userInput > 0 Then
Sheet1.Range("A2") = userInput
yn = True
Else
Msgbox "输入无效!请重新输入。",VbExclamation
yn = False
End if
Loop While yn = False '当输入无效时继续循环
MsgBox "输入成功!输入的数值是:" & userInput
End Sub
- 1、声明一个变量 userInput类型为 Variant,它是一个特殊的类型,它可以存储任何类型的数据,包括数字、字符串、日期等。使用 Variant 类型可以增加代码的灵活性,和这个变量要承接的输入不知道什么内容的事实相契合。一个变量yn类型为布尔型,其值可以是 True 或 False的其中一个;
- 2、Do后跟着执行的代码:先执行一次循环;
- 3、InputBox,弹出一个输入窗口,变量userInput承接
- 4、验证逻辑:
- if 判断是否符合要求,IsNumberic()是否数值 and且 大于0, 如果为真
- Sheet1表中的A2单元格写入该数值
- yn赋值为True
- Esle 如果为假
- 弹窗提示错误
- yn赋值为False
- 5、Loop While 退出循环条件,yn = False时,继续循环;
- 6、直到成功后,MsgBox并弹出结果
优点:
- 更灵活地控制需要“先执行后判断”的复杂逻辑任务。
缺点:
- 循环体内有条件变量被修改,可能导致无限循环。
Do...Loop UntilVSDo...Loop While 的区别,只在退出循环的条件,一个是True,一个是False,具体可以参考Do While...Loop 和 Do Until...Loop的差异。
到此我们已然了解了其他的循环结构,Excel VBA入门的第一步已迈出,从初始设置到录制第一个宏代码,从宏代码的修改到循环结构,发现并没有想象中的那么难。它就是基础知识的累计,像堆积木一样,按照我们正常的工作步骤,一步步累加。
下一篇:了解Excel VBA中的变量和变量类型:
VBA程序是从Sub开始,到End Sub结束,中间堆叠着代码,在功能代码块前和程序“注释说明”后,紧跟着就是定义变量和数据类型:Dim *变量* as *变量类型*,这样来看,了解变量和变量类型是了解学习VBA编程的前提。
我们就以“Do_Loop_While循环”这段代码为例,自上而下介绍其中包含的知识点以及该知识点的部分延伸,看看如果写一个完整的、能满足我们日常工作需要的小应用,都需要了解哪些内容?
变量是什么?变量命名有哪些限制和习惯?变量的作用域和生命周期是什么?变量类型有哪些以及该如何选择?等等......。
请开发者喝杯咖啡!