VBA 程序循环结构
VBA 中,循环结构用于多次重复执行同一段代码。重复次数通过特定数字或特定条件控制。
通过控制循环过程中特定变量,循环结构可执行复杂的重复任务。
循环结构的执行流程可简单的表示如下:
VBA 循环结构类型
VBA 中循环结构有 3 种类型,它们是:
- For 循环
- Do While 循环
- Do Until 循环
下面分别介绍 3 种类型循环结构语法以及用法。
For 循环
For 循环是最常用的循环类型,它有两种形式:
- For … Next 循环
- For Each 循环
For … Next 循环
使用 For ... Next
循环可以按指定次数,循环执行一段代码。For 循环使用一个数字变量,从初始值开始,每循环一次,变量值增加或减小,直到变量的值等于指定的结束值时,循环结束。
For ... Next
循环语法如下:
For [变量] = [初始值] To [结束值] Step [步长]
'这里是循环执行的语句
Next
其中:
[变量]
是一个数字类型变量,可在循环执行的语句里使用。[初始值]
和[结束值]
是给定的值;[步长]
是每次循环时,变量的增量。如果为正值,变量增大;如果为负值,变量减小。
下面看一个实际的例子,求 1 至 10 数字的累积和。
Sub MyCode()
Dim i As Integer
Dim sum As Integer
For i = 1 To 10 Step 1
sum = sum + i
Next
End Sub
可以看到,For 循环使用 i
变量,循环 10 次,i
的值从 1 到 10 变化。
值得注意的是,For 循环的 Step 值如果是 1,则 Step 关键词可省略。上述过程循环部分可写成如下方式:
For i = 1 To 10
sum = sum + i
Next
For Each 循环
For Each
循环用于逐一遍历一个数据集合中的所有元素。数据集合包括数组、Excel 对象集合、字典等。
For Each 循环不需要一个数字变量,但是需要与数据集合中的元素相同的数据类型变量。其基本语法如下:
For Each [元素] In [元素集合]
'循环执行的代码
Next [元素]
其中,
[元素]
是与集合中的元素相同类型的变量,该变量可在循环代码中使用。[元素集合]
是包括多个元素的集合。
下面看一个实际例子,循环打印出工作簿中所有工作表的名称。
Sub MyCode()
Dim sh As Worksheet
For Each sh In Worksheets
Debug.Print sh.Name
Next sh
End Sub
sh
变量就是元素变量,Worksheets
是工作簿中所有工作表的集合。
Exit For 语句
Exit For
语句用于跳出循环过程,一般在提前结束循环时使用,均适用于 For Next
循环和 For Each
循环。
看一个实际的例子,求 1 – 10 数字的和时,当和大于 30 就停止循环。
Sub MyCode()
Dim i As Integer
Dim sum As Integer
For i = 1 To 10
sum = sum + i
If sum > 30 Then
Exit For
End If
Next
End Sub
在这段代码中,sum
变量大于 30 时,循环就停止。
Do While 循环
Do While
循环用于满足指定条件时循环执行一段代码的情形。循环的指定条件在 While
关键词后书写。
Do While
循环也有两种形式:
- Do While … Loop 循环
- Do … Loop While 循环
Do While … Loop 循环
Do While … Loop 循环,根据 While 关键词后的条件表达式的值,真时执行,假时停止执行。基本语法如下:
Do While [条件表达式]
'循环执行的代码
Loop
其中,只要 [条件表达式]
为真,将一直循环执行。[条件表达式]
一旦为假,则停止循环,程序执行 Loop
关键词后的代码。
看一个实际的例子,还是求 1- 10 累积和。
Sub MyCode()
Dim i As Integer
Dim sum As Integer
i = 1
Do While i <= 10
sum = sum + i
i = i + 1
Loop
End Sub
i
变量的初始值是 1,根据 While
后的条件,只要 i
变量小于等于 10,后续的代码就可以一直循环执行。
这里为了演示使用了 Do While
循环,实际情况下,这种求和问题,使用 For
循环更简洁。
Do … Loop While 循环
与上一种 Do 循环不同的是,Do ... Loop While
循环至少循环执行代码一次后,再判断条件表达式的值。基本语法如下:
Do
'循环执行的代码
Loop While [条件表达式]
其中,While 和条件表达式写在 Loop 关键词后。
Exit Do 语句
与 Exit For
语句类似,Exit Do
语句用于跳出 Do While
循环。
Do Until 循环
Do Until
循环与 Do While
循环类似。不同点在于,Do While
在条件表达式为真时,继续执行循环;而 Do Until
在条件表达式为真时,停止执行循环。
Do Until 循环也有两种形式:
- Do Until … Loop 循环
- Do … Loop Until 循环
Do Until … Loop 循环
循环开始前判断 Until
后条件表达式的值,如果是真,停止循环;如果是假,继续执行循环。基本语法如下:
Do Until [条件表达式]
'循环执行的代码
Loop
Do … Loop Until 循环
先运行一次,再判断 Until
后条件表达式的值,如果是真,停止循环;如果是假,继续执行循环。基本语法如下:
Do
'循环执行的代码
Loop Until [条件表达式]
其他使用方法与 Do While
循环一致。
总结
本篇文章我们学习了 VBA 中程序循环结构基础,以及多种循环结构形式。包括子类在内,VBA 中常使用的循环结构包括 6 种,它们是:
循环结构 | 说明 |
---|---|
For … Next 循环 | 按指定次数循环执行 |
For Each 循环 | 逐一遍历数据集合中的每一个元素 |
Do While … Loop 循环 | 当条件为真时,循环执行 |
Do … Loop While 循环 | 当条件为真时,循环执行。无论条件真假,至少运行一次 |
Do Until … Loop 循环 | 直到条件为真时,停止执行 |
Do … Loop Until 循环 | 直到条件为真时,停止执行。无论条件真假,至少运行一次 |
此外,学习了两种跳出循环的语句,它们是:
跳出语句 | 说明 |
---|---|
Exit For | 跳出 For 循环 |
Exit Do | 跳出 Do While/Until 循环 |
Do While … Loop 循环、Do Until … Loop 循环,是先判断后循环;
Do … Loop While 循环、Do … Loop Until 循环,是先循环后判断,至少运行一次代码。
这是我对于定义的建议
从是否至少循环一次的角度看,这么组合和理解没问题。
老师你好,请问如果在双重for循环里用exit for会跳出所有循环嘛
不会,在哪个For循环,则跳出哪个循环。
我知道了,仔细比对发现。因该是sum=sum+i,我写成了sum+1
为什么我求和出的结果是10?
Option Explicit
Sub qiuHe()
Dim i As Integer
Dim sum As Integer
For i = 1 To 10 Step 1
sum = sum + 1
Next
MsgBox sum
End Sub
你这个循环了10次sum=sum+1,sum初始值为0,每循环一次加1,结果10
因为你的sum=sum+1。要求1+到10 是sum=sum+i
你可以先在循环前加个sum=0
请问有vba社区吗,小白有很多需要答疑解惑的地方
目前没有的,明年有计划创建类似社区或者问答社区,敬请关注
sum=sum+i为什么不能写成sum=i+1?
本例中需要统计累计和,因此需要在上一个循环的和加上当前循环数。
你好,我想请教下,我这个为什么 sum = sum + Cells(i, “A”).Value 这一列一直报错。
Sub Mycobe()
Dim i As Integer
Dim sum As Integer
For i = 1 To 5
sum = sum + Cells(i, “A”).Value
Next i
MsgBox “合计:” & sum
End Sub
应该是类型不匹配错误,说明A列目标单元格内数据,有非数字数据,需要检查一下。
另外一个可能错误,sum 是integer类型,也就是整数类型(-32,768 至 32,767),需要查一下目标区域的数字有无不符合的情况。
验证过了,和您说的一样,有一个数据不是数字格式,谢谢
请教一下,最开始的for循环我把step 换成0.5运行后结果就是溢出,请问是什么原因?不是很能理解
循环变量可能是整数类型,VBA自动把step舍成0了。建议将循环变量社否浮点型,例如double
Sub 小熊踩背()
Dim i As Integer
Dim sum As Integer
For i = 1 To 10 Step 1
sum = sum + i
Next
MsgBox “执行完毕”
End Sub
老师这个代码我按运行之后没有地方展示程序运行的结果,所以不知道它的实际用处是什么。。
加一行 cells(1,”A”)= SUM 就能看到sum结果啦
懒人老师教得好
这里只是为了展示循环结构的用法。实际中循环是三大程序结构之一,用法很多。后续将分享实际的代码,欢迎关注
好的 感谢老师
老师 你好,请问为什么这个循环一次后就卡死了
Sub MyCode()
Dim i As Integer
Dim sum As Integer
For i = 2 To 9
j = 2
Do While j <= 9
If i = j Then
j = j + 1
Else
If Cells(i, “F”).Value = Cells(j, “F”).Value Then
Cells(i, “A”).Value = Cells(j, “G”).Value
Cells(i, “B”).Value = Cells(j, “H”).Value
Else
j = j + 1
End If
End If
Loop
Next i
End Sub
这段代码卡死的可能原因是因为在第二个Do While循环中,如果条件Cells(i, “F”).Value = Cells(j, “F”).Value 得不到满足,那么j的值将不会增加,While循环继续执行循环,这将导致无限循环下去,从而卡死程序。
谢谢老师
您好请问下
next i
与
next
是一样的吗
还有比如 i 1 To 10
范围是 1<=i<10 吗
如果是能不能改成
1<=i<=10
1、是一样的,变量名是可以省略的;
2、范围是1<=i<=10 ,包括起始和结束的值
大佬们帮帮我,在excecl表格中,如何从一列数据中提取不重复的数据到新列,目前使用的是execel为2013版本,试了好多方法,都不成功,新版本中的UNIQUE函数,可它又不支持2013,最后我使用了数据筛选功能处理了,但每次都需要手动去更新一下,不然所有依赖新数据作为支撑的表单都要出错,
请参考这篇文章,用公式提取不重复数据。
感谢大佬回复,完美解决了问题,一键一劳永逸了,但有一个问题就是,如果B列数据过大,超过几千条后,用起来就特别的卡,更新也不会很及时。
如果数据多,可以把整列引用修改为预计的最大区域的,这样会减少不少查询时间。
感谢大佬百忙之中解答我的问题,实际操作后确实如此,今天我又新接触到一个ROW()函数,觉得很有意思,现在我的想法是,能不能用ROW()函数来自动寻找sheel1,sheel2….中的某一个单元格的值。我现阶段理解的,”sheel”&row(a1),得到的结果是sheel1,但我要提取此表格中的数据却不行,“sheel”&row(a1)!a1却是错的,,这是我哪里理解错了呢?如果可以实现,请问我又该如何书写呢,
”sheel”&row(a1)这个写法,表示sheet1这个文本和当前工作表A1单元格的行数进行拼接,再返回拼接后的文本。如果想要返回sheet1表格A1单元格的行号,则需要把这段公式放在INDIRECT函数即可,即=INDIRECT(”sheel”&row(a1))
请问以下这个循环运行之后出了结果之后鼠标一直转圈圈是啥意思,然后键盘点击esc可以手动退出运行,但为啥他自己不自动结束循环运行呀
Sub 汇总表审核()
Dim i As Integer
Dim isblank As Boolean
For i = 2 To 40
isblank = Cells(i, 7).Value = 0 Or Cells(i, 7).Value = 13.27
If isblank Then
Rows(i).Delete
i = i – 1
End If
Next i
End Sub
表示循环没有结束。
i 作为循环体的自增变量,下一个循环自动加1,但是此代码中,isblank true 时,i又减一。极端情况下,i一直等于2,无法到达40,因此循环一直执行,成死循环了。
解决办法,第一种不要对i值做修改,用其他变量表示行数;第二种,确保isblank变量不会一直是 true。
hello 老师~想问下 for each那个示例我在实际操作后点击执行后既没有报错也没有任何变化,我怎么确认这个结果是什么样的呢?
循环体中的 Debug.Print sh.Name 代码会在立即窗口打印出每个工作表的名称。你可能没有显示立即窗口,可以按【Ctrl+G】快捷键或顶部工具栏【视图→立即窗口】打开,这样就在底部看到打印的信息了。
好的,谢谢老师
请问在Do While 循环中,已经有loop来跳出循环了,为啥还要用到Exit Do嘞?这两个的作用有什么区别吗?
loop是循环正常结束的语句,而exit do是用来提前结束循环。例如,循环过程中出现错误了,或者已经达到条件了,就需要提前退出循环。
excel 2016 运行不了以下代码:
Sub MyCode()
Dim i As Integer
Dim sum As Integer
For i = 1 To 10
sum = sum + i
If sum > 30 Then
Exit For
End If
Next
End Sub
是什么提示没有吗?示例中仅是对循环做一个解释,实际上代码是运行了的,只是没有把 sum 变量用起来。
你可以再 End Sub 前添加这一句再运行以下。
MSgbox sum
DO….LOOP WHILE .. 语句 计算1到10累加和时,sum as integer 时 提示溢出,换成long就好了,但是结果还是55,这是为什么呢?
Sub DOLOOPWHILE语句()
Dim i As Integer
Dim sum As Long
i = 1
Do
sum = sum + i
i = i + 1
Loop While i <= 10
Debug.Print sum
End Sub
我在本机测试,integer还是long均正常运行,没有问题。office 365
理论上也应该没有问题,因为sum的值没有超过上限。
你是不是修改了条件,不是10?或者用的是哪个版本的Excel?
在For Next循环中,只对sum声明,但是没有初始值,这种情况能在循环中执行吗
可以执行的,声明后不设初始值,整数类型变量默认值为 0
该章总结部分do….until loop和do until….loop说明好像和正文部分相悖,麻烦还请核对一下
已更新,感谢指正
在文章开始讲For Next循环章节,第三小点关于步长,句尾的错别字希望更新一下,“”如果为复制,变量减小“”。很好的课程,希望越来越完美。
已修正,感谢反馈。