第 5 课 · 第三部分 基础语法

循环:让机器人替你重复

RPA 的价值就藏在这一节——一次写规则,重复执行一千遍。

学习目标

预计用时:读课 35 分钟 + 上机 30 分钟 |  前置知识:第 3 课(变量)、第 4 课(条件判断) |  本课性质:语法课(RPA 的看家本领),循环与判断组合起来就是流程的骨架

知识地图

第 4 课让机器人会挑路,本课让机器人会重复:同一件事做一百遍,人写一遍规则就够了。循环是 RPA 真正的价值所在——"不难但重复一百遍"的活,正是它最擅长的。

本课在哪儿
第三部分 · 基础语法。第 4 课(条件)之后,第 6 课(数组与字典)之前——遍历循环会直接为下一课服务。
重点
三种循环的分工;For ... Next 与 Do ... Loop 的写法;Break / Continue / Exit 的区别。
难点
"前置判断"与"后置判断"的区别(循环体到底会执行几次);循环次数算错差 1;死循环。
学完的标志
让你把 1 到 100 累加、或"文件不存在就一直等",你能不看例子写出正确的循环,并说清它为什么不会卡死。

一、三种循环,各管一件事

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

为什么循环变量不用 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 之后的语句本轮不再执行,小心把必须执行的收尾步骤漏掉。

三种循环按是否知道次数来选;Continue、Break、Exit 的作用范围依次扩大 先问一句:我事先知道要转几圈吗? 知道次数用计次;不知道次数用条件;逐个取元素用遍历。 怎么选循环 计次循环 For ... Next 知道要重复几次 · 例:1 到 100 条件循环 Do ... Loop 不知道几次,条件满足就一直做 遍历循环 For Each ... Next 逐个处理数组 / 字典里的元素 跳出三兄弟 Continue 结束本次,直接开始下一轮 Break 立即跳出整个循环 Exit 结束整个流程(不是流程块) 作用范围:本次 → 整个循环 → 整个流程
图 3 · 三种循环按“事先知不知道次数”来选;Continue 只跳过本轮,Break 跳出循环,Exit 结束整个流程。

六、死循环:怎么认出来、怎么停下来

循环最危险的情况,是条件永远不满足结束条件,流程卡在循环里出不来。这就是死循环。[2]

死循环警告:如果条件永远为真(比如忘了在循环里改变量),流程会卡住出不来。这就是死循环。[2] 在 APA Creator 里点工具栏的停止按钮即可中断;写循环时务必确认条件最终会变成假,或里面有 Break。

6.1 三个信号,帮你快速认出死循环

6.2 怎么把它停下来

  1. 先别慌、也别狂点鼠标——点击工具栏的 停止 按钮,APA Creator 会中断当前运行。
  2. 停止后切到源代码视图,找到循环那几行,检查循环体里到底有没有让条件变化的语句。
  3. 补上"改变量"或 Break(例如把 次数 = 次数 + 1 加回循环体内),再重新运行。
  4. 如果条件依赖外部状态(如时间、文件),先手动确认那个状态会真的变化,再判断循环是否会结束。

写循环的自检三步:① 循环开始前,条件成立吗?② 每一轮,什么在变?③ 要转到什么时候停?这三问答得出来,循环基本不会出事。

完整语法见 参考页:BotScript 语法速查(已补入循环一节)。数组与字典下一节专讲。

Python 写法对照:循环的种类一一对应,但次数边界是最容易出错的地方。

要做的BotScript(本课程主线)Python
计次循环For i = 1 To 100 … Nextfor i in range(1, 101):
带步长For i = 2 To 10 Step 2for i in range(2, 11, 2):
遍历集合For Each 天 In 天数 … Nextfor 天 in 天数:
遍历字典For Each 键, 值 In 学生 … Nextfor 键, 值 in 学生.items():
条件循环(先判断)Do While 条件 … Loopwhile 条件:
条件循环(直到…)Do Until 条件 … Loopwhile not 条件:
跳出 / 跳过本轮Break / Continuebreak / continue(小写)

重点看第一行。BotScript 的 For i = 1 To 100 是含头含尾,跑 100 轮; Python 的 range(1, 101) 是含头不含尾,所以要写 101 才跑 100 轮。 少写 1 就会少跑一轮——而且不报错,只是结果差一点,比报错难查得多。从 BotScript 转过来,这一处最容易翻车。

本课小结

必记要点

计次循环 For … Next 条件循环 Do … Loop 遍历循环 For Each … Next Step 每轮步长 循环变量 计数的那个 i 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 语言参考 · 逻辑语句》(条件循环、计次循环、遍历循环、跳出语句)。 零基础视角可回看 《附录:编程基础知识 · 循环》。