今日学习目标
- 掌握For...Next循环
- 掌握For Each...Next循环
- 掌握Do While/Until循环
知识点
1. VBA循环怎么用:For...Next
循环让一段代码重复执行。For循环适合"知道要循环几次"的场景:
vbaFor i = 1 To 10
' 重复执行10次
Next ii 是循环变量,每圈自动加1。倒着数或跳着数用Step:For i = 10 To 1 Step -1;中途跳出用 Exit For。
2. For Each...Next
For Each遍历集合(工作表、单元格区域等),不需要知道元素个数:
vbaFor Each item In collection
' 遍历集合
Next item批量处理对象时For Each比For更自然。
3. Do While / Do Until
只知道"到什么时候停"时用Do循环:
vbaDo While 条件
' 条件满足时执行
Loop
Do Until 条件
' 条件不满足时执行
LoopWhile是"满足就继续",Until是"满足就停"。Do循环必须自己在体内推进条件变量(如 i = i + 1),否则就是死循环。
今日代码
vbaSub For循环示例()
Dim i As Integer
Dim sum As Integer
sum = 0
For i = 1 To 100
sum = sum + i
Next i
MsgBox "1到100的和: " & sum
End Sub
Sub ForEach示例()
Dim ws As Worksheet
For Each ws In Worksheets
MsgBox ws.Name
Next ws
End Sub
Sub DoWhile示例()
Dim i As Integer
i = 1
Do While i <= 10
i = i + 1
Loop
MsgBox "循环结束时i的值: " & i
End Sub预期结果:For循环弹出5050;ForEach逐个弹出工作表名;DoWhile结束时i=11。
实战场景
背景:销售流水表第2行到第31行共30条记录,C列是每单金额。月底要统计总销售额,并数出过万的大单笔数:
vbaSub 统计销售流水()
Dim i As Long, 总额 As Double, 大单数 As Long
For i = 2 To 31
总额 = 总额 + Cells(i, 3).Value
If Cells(i, 3).Value >= 10000 Then
大单数 = 大单数 + 1
End If
Next i
MsgBox "总销售额: " & 总额 & vbCrLf & _
"过万大单: " & 大单数 & " 笔"
End Sub循环变量i就是行号,Cells(i, 3) 取第i行C列;假如C列合计118000、过万4笔,弹窗就显示这两个数。数据涨到300行时把 2 To 31 改成 2 To 301 即可——这正是VBA替代手工操作的核心场景。
练习题
- 计算1-50的偶数和
- 遍历工作簿中所有工作表
- 使用循环填充A1:A10单元格
参考解答
- For循环i从1到50,i Mod 2 = 0时累加(bas文件 练习_计算偶数和 是完整示例,结果650)。
- 用For Each ws In Worksheets遍历所有工作表(参考ForEach示例)。
- 使用For i = 1 To 10配合Cells:
vbaFor i = 1 To 10
Cells(i, 1).Value = i
Next i运行后A1:A10依次填入1到10。
延伸练习
- 用双重循环把九九乘法表写到A1:I9区域。
- 求1~100中能被3整除但不能被5整除的数之和。
- 用Do While从第1行向下找第一个空行并弹出其行号。
常见错误与排查
| 报错/现象 | 原因 | 解决方法 |
|---|---|---|
| Excel卡死、鼠标转圈 | Do循环死循环 | 按 Esc 或 Ctrl+Break 中断,补上推进语句 |
Run-time error '6': Overflow |
Integer超过32767 | 循环变量改成Long |
Run-time error '1004' |
Cells的行号列号用了0或负数 | 行列从1开始,检查边界 |
学习总结
知道次数用For,遍历集合用For Each,只知道结束条件用Do循环;写Do循环先确认条件会被推进。
由在线工具箱(www.vba.net)整理制作