循环:让机器人替你重复
RPA 的价值就藏在这一节——一次写规则,重复执行一千遍。
学习目标
- 说清三种循环的分工,遇到问题能立刻挑对用哪一个
- 用计次循环
For ... Next重复固定次数,会用Step、知道循环变量不用Dim - 用条件循环
Do ... Loop的五种写法,分清"前置判断"和"后置判断" - 用
For Each ... Next逐个处理一排数据 - 分清
Break/Continue/Exit三个跳出语句 - 能认出死循环,并在 APA Creator 里把它停下来
预计用时:读课 35 分钟 + 上机 30 分钟 | 前置知识:第 3 课(变量)、第 4 课(条件判断) | 本课性质:语法课(RPA 的看家本领),循环与判断组合起来就是流程的骨架
知识地图
第 4 课让机器人会挑路,本课让机器人会重复:同一件事做一百遍,人写一遍规则就够了。循环是 RPA 真正的价值所在——"不难但重复一百遍"的活,正是它最擅长的。
For ... Next 与 Do ... Loop 的写法;Break / Continue / Exit 的区别。一、三种循环,各管一件事
BotScript 的循环分三类,先记住它们的分工,语法再看细节:[1]
| 循环 | 什么时候用 | 关键词 |
|---|---|---|
| 计次循环 | 知道要重复几次 | For ... Next |
| 条件循环 | 不知道几次,满足条件就一直做 | Do ... Loop |
| 遍历循环 | 逐个处理数组/字典里的每个元素 | For Each ... Next |
怎么记分工:问自己一句话——"我事先知道要转几圈吗?"知道 → 计次循环;不知道,只知道"转到某个条件不成立为止" → 条件循环;不是转圈,而是"把一排东西逐个拿出来" → 遍历循环。
二、计次循环 For
For 循环变量 = 起始值 To 结束值 Step 步长
语句块
Next
Dim 总和 = 0
For i = 1 To 100
总和 = 总和 + i
Next
输出调试信息(总和) // 1+2+…+100 = 5050
把累加例子逐行读懂,循环就懂了一半:
Dim 总和 = 0 // 先准备一个“筐”,里面清零
For i = 1 To 100 // i 依次取 1、2、3 … 100,共 100 轮
总和 = 总和 + i // 取出筐里的数,加上本轮的 i,再放回筐
Next // 一轮结束,i 自动加 1,再回去看是否超过 100
输出调试信息(总和) // 100 轮走完,输出 5050
Step可省略,默认步长 1;For i = 1 To 10 Step 2依次取 1,3,5,7,9。- 起始值、结束值、步长只能是数值。
- 循环变量
i不用Dim定义,直接使用;但循环结束后就不能再用它了。[1]
为什么循环变量不用 Dim?因为它的"身份"是循环自己声明的:For i = 1 To 100 这一行已经替你把 i 造好了,所以不用再声明。也正因为它属于这个循环,出了循环就"过期"了——循环结束后再读写 i,不是拿到最后一轮的值,而是不能用。想留下结果,就在循环里把它存进另一个变量(比如 总和)。
常见错误:次数差 1。For i = 1 To 5 是 5 次,不是 4 次也不是 6 次——起始值和结束值都算在内。步长为 1 时,次数 = 结束 - 开始 + 1。写循环前先在心里数一下两端:要"第 1 次到第 5 次"就写 1 To 5;要"从 0 数到 4"就写 0 To 4,别写成 1 To 4。
三、条件循环 Do ... Loop
官方给了五种写法,别背,理解"条件放前面还是后面"这一条规律即可:[1]
| 写法 | 含义 |
|---|---|
Do While 条件 ... Loop | 条件为真就循环(先判断) |
Do Until 条件 ... Loop | 条件为假就循环(先判断) |
Do ... Loop While 条件 | 先执行一遍,条件为真继续 |
Do ... Loop Until 条件 | 先执行一遍,条件为假继续 |
Do ... Loop | 无限循环,必须自己用 Break 跳出 |
判断条件写在前面(While/Until 跟在 Do 后)可能一次都不执行;写在后面(跟在 Loop 后)至少执行一遍。
用"上班"来理解前置与后置:前置判断是"先看表再决定要不要干活",如果一开始条件就不满足,活一次都不干;后置判断是"先干一活,再看要不要接着干",所以它至少干一次。又因为 Until 是"直到……为止"(条件为假时继续),While 是"当……时"(条件为真时继续),一字之差,方向正好相反——读的时候把中文念出来,就不容易记反。
Do Until Time.Hour() > 18
输出调试信息("还没有到下班时间")
Delay(1000) // 停 1 秒再判断
Loop
输出调试信息("下班时间到")
读法:直到小时数大于 18 才停,所以只要还没到点,就每秒念叨一次,到点了跳出,输出"下班时间到"。注意循环体里的 Delay(1000)——它让每次判断之间歇 1 秒,否则同样的逻辑会瞬间刷屏。
最常见死循环:忘记让条件变化。条件循环要能结束,循环体里必须有某样东西在朝"结束条件"靠近——比如计数器 次数 = 次数 + 1、或有 Break。如果条件里用的变量从头到尾没被改过,它会永远保持真爱或永远保持假,流程就卡住了。写完先问自己一句:"这个条件靠什么变成假?"答不上来,就是这个循环有危险。
四、遍历循环 For Each
处理"一排数据"(数组)或"一批键值对"(字典)时用它。用"把一叠发票一张张抽出来看"来理解:你不用管这是第几张,For Each 会替你逐个把元素送到手上。数组详细内容下一节讲,这里先看形态:
Dim 天数 = [31, 28, 31, 30, 31] // 一排数据,共 5 个
Dim 合计 = 0 // 准备累加的“筐”
For Each 天 In 天数 // 每一轮,把当前元素放进“天”
合计 = 合计 + 天 // 把“天”累加进“筐”
Next // 还有元素就取下一个
输出调试信息(合计) // 31+28+31+30+31 = 151
也可以一次取索引和值两个变量:For Each 名字, 值 In 字典。
For 和 For Each 怎么选:你要的是"第几轮"(用得上 i),就用 For;你要的是"每个元素本身",就用 For Each。遍历循环的好处是不用操心下标从哪开始、一共几个——下一个元素自动送来。
五、跳出:Break、Continue、Exit
| 语句 | 作用 |
|---|---|
Break | 立即跳出整个循环 |
Continue | 结束本次循环,直接开始下一轮 |
Exit | 结束整个流程(不是流程块),不需要参数 |
Break 与 Continue 只能写在循环体内部。
把一圈循环想成"跑 400 米":Continue 是"这一圈我不跑了,直接站到下一条起跑线",下一圈照跑;Break 是"整个比赛我不跑了,收工",后面的圈全都不跑;Exit 更狠,是"整个活动取消"——它结束的不是循环,而是整个流程。三者作用范围一层比一层大:本次 → 整个循环 → 整个流程。
常见错误:把 Continue 和 Break 用反。想"跳过这一条、继续处理下一条"却写了 Break,结果后面的数据全没处理;反过来,想"找到就收工"却写了 Continue,循环会一直空转到结束。记法:Continue 是 continue(继续),Break 是 break(打断)。另外注意:Continue 之后的语句本轮不再执行,小心把必须执行的收尾步骤漏掉。
六、死循环:怎么认出来、怎么停下来
循环最危险的情况,是条件永远不满足结束条件,流程卡在循环里出不来。这就是死循环。[2]
死循环警告:如果条件永远为真(比如忘了在循环里改变量),流程会卡住出不来。这就是死循环。[2]
在 APA Creator 里点工具栏的停止按钮即可中断;写循环时务必确认条件最终会变成假,或里面有 Break。
6.1 三个信号,帮你快速认出死循环
- 调试输出一直刷屏:同一条"还没有到下班时间"没完没了地出现。
- 流程迟迟不结束:明明只有几行命令,运行标志却一直转个不停。
- 本该出现的结果一直不出现:循环后面的"下班时间到"永远等不到。
6.2 怎么把它停下来
- 先别慌、也别狂点鼠标——点击工具栏的 停止 按钮,APA Creator 会中断当前运行。
- 停止后切到源代码视图,找到循环那几行,检查循环体里到底有没有让条件变化的语句。
- 补上"改变量"或
Break(例如把次数 = 次数 + 1加回循环体内),再重新运行。 - 如果条件依赖外部状态(如时间、文件),先手动确认那个状态会真的变化,再判断循环是否会结束。
写循环的自检三步:① 循环开始前,条件成立吗?② 每一轮,什么在变?③ 要转到什么时候停?这三问答得出来,循环基本不会出事。
完整语法见 参考页:BotScript 语法速查(已补入循环一节)。数组与字典下一节专讲。
Python 写法对照:循环的种类一一对应,但次数边界是最容易出错的地方。
| 要做的 | BotScript(本课程主线) | Python |
|---|---|---|
| 计次循环 | For i = 1 To 100 … Next | for i in range(1, 101): |
| 带步长 | For i = 2 To 10 Step 2 | for i in range(2, 11, 2): |
| 遍历集合 | For Each 天 In 天数 … Next | for 天 in 天数: |
| 遍历字典 | For Each 键, 值 In 学生 … Next | for 键, 值 in 学生.items(): |
| 条件循环(先判断) | Do While 条件 … Loop | while 条件: |
| 条件循环(直到…) | Do Until 条件 … Loop | while not 条件: |
| 跳出 / 跳过本轮 | Break / Continue | break / continue(小写) |
重点看第一行。BotScript 的 For i = 1 To 100 是含头含尾,跑 100 轮;
Python 的 range(1, 101) 是含头不含尾,所以要写 101 才跑 100 轮。
少写 1 就会少跑一轮——而且不报错,只是结果差一点,比报错难查得多。从 BotScript 转过来,这一处最容易翻车。
本课小结
必记要点
- 三种循环分工:知道次数用
For ... Next,靠条件用Do ... Loop,逐个取元素用For Each ... Next。 - 计次循环含首含尾,
For i = 1 To 5是 5 次(步长为 1 时次数 = 结束 - 开始 + 1);Step可省,默认 1。 - 循环变量不用
Dim,且循环结束后失效。 Do ... Loop五种:条件在Do后是前置判断(可能一次都不执行),在Loop后是后置判断(至少执行一遍)。Break跳出整个循环、Continue结束本次开下一轮、Exit结束整个流程;Break/Continue只能在循环体内。- 死循环 = 条件永远不结束;用工具栏停止按钮中断,并用"自检三步"预防。
自测
不看上面,凭记忆作答。答错不要紧,解析会告诉你为什么。
上机实践(回到 Windows)
任务 A(第一次累加):写一个计次循环,把 1 到 10 累加,输出结果(应为 55)。提示:先 Dim 总和 = 0,再 For i = 1 To 10,循环体里 总和 = 总和 + i,最后输出。常见错误:把 输出调试信息 写进了循环体内,会看到 10 行中间结果——这没错,只是和"最后输出一个数"不同,想清楚你要哪一种。
任务 B(加条件,复习第 4 课):把它改成只累加偶数:用 For i = 1 To 10 配一个 If i Mod 2 = 0 再来累加。跑出来应该是 30(2+4+6+8+10)。顺带观察:能不能用 For i = 2 To 10 Step 2 直接得到同样结果?两种写法都试一次。
任务 C(Break 收工):写一个 Do ... Loop,让一个变量从 1 每次加 1,到 5 时用 Break 跳出,然后输出"我停在第 N 次"。预期:N 是 5。关键:别忘了循环体里的 次数 = 次数 + 1,否则就成了任务 D。
任务 D(故意制造死循环):写 Do While True,循环体内不改变量,只输出一句话,运行。它会一直刷屏——这就是死循环。请立刻用工具栏的停止按钮把它中断,把"你是怎么停下来的、界面上发生了什么"告诉我。考试和实际项目里,这个操作救过很多人。
任务 E(故意制造语法报错):在源代码视图里,把某个 For 循环的 Next 删掉,运行一次,把报错信息原样发我。再把它改回来,确认恢复正常。认识报错,是认证实操的必备能力。
任务 F(挑战:数对次数):分别用 For i = 1 To 3、For i = 0 To 3、For i = 1 To 3 Step 2 各输出一次 i,先在纸上写下你预测的次数和取值,再运行核对。有没有哪次和你预测的不一样?那就是"差 1"的坑。
精读一手来源
本节首选:《BotScript 语言参考 · 逻辑语句》(条件循环、计次循环、遍历循环、跳出语句)。 零基础视角可回看 《附录:编程基础知识 · 循环》。