SCAN 函数是 Microsoft 365 专属的动态数组函数之一,它与 LAMBDA 函数紧密结合,功能强大。它的核心思想是对数组中的每个元素进行遍历,并应用一个自定义的 LAMBDA 运算,同时保留每一步的计算结果,最终输出一个累积结果的数组。
简单来说,它就像一个“带有记忆功能的循环”,可以轻松解决之前需要复杂技巧才能实现的累积计算问题。
一、函数语法与参数解析
SCAN 函数的语法非常简单,只有三个参数:
=SCAN([initial_value], array, lambda(accumulator, value))让我们来拆解每个参数的含义:
1、[initial_value] (可选 – 初始值):
- 这是累积计算的起点。你可以把它想象成计算的“种子”。
- 如果省略此参数,则默认使用数组中的第一个元素作为初始值,并从第二个元素开始计算。
2、array (必需 – 数组):
- 这是你要扫描和计算的源数据区域。它可以是一行、一列或任何范围的单元格。
3、lambda(accumulator, value) (必需 – Lambda 函数):
- 这是 SCAN 函数的大脑,它定义了计算规则。
- accumulator (累加器):它保存了上一步的计算结果。在第一步计算时,它的值就是 [initial_value]。
- value (当前值):代表当前正在处理的 array 中的元素。
工作原理:
SCAN 从 array 的第一个元素开始,将 initial_value(或第一个元素)和第一个元素传递给 Lambda 函数进行计算,得到第一个结果。然后,它将这个结果作为新的 accumulator,与数组中的第二个元素再次传递给 Lambda 函数,得到第二个结果。如此循环,直到处理完数组中的所有元素,最后将所有中间结果作为一个动态数组输出。
二、实战案例:从入门到精通
假设我们有如下一组月度销售额数据:
案例 1:基础应用——计算累积销售额
这是 SCAN 最经典的用法。
公式:
=SCAN(0, A2:A5, LAMBDA(acc, val, acc+val))
结果:
分解说明:
- initial_value 是 0。
- array 是 A2:A5。
- LAMBDA(acc, val, acc+val) 定义了计算规则:将上一步的结果(acc)与当前单元格的值(val)相加。
- 整个过程:
- 第一步:acc = 0, val = 100 -> 0 + 100 = 100
- 第二步:acc = 100, val = 200 -> 100 + 200 = 300
- 第三步:acc = 300, val = 150 -> 300 + 150 = 450
- 第四步:acc = 450, val = 300 -> 450 + 300 = 750
案例 2:省略初始值
如果我们省略初始值,会发生什么?

公式:
=SCAN(, A2:A5, LAMBDA(acc, val, acc+val))结果:
可以看到,结果从第二行开始。因为省略初始值后,SCAN 将第一个元素 100 直接作为第一步的结果,然后从第二个元素开始累积。
案例 3:高级应用——标记连续增长月份
假设我们想找出销售额连续增长的月份。
公式:
=SCAN(TRUE, A3:A5/A2:A4>1, LAMBDA(acc, val, AND(acc, val)))
注意:这是一个数组公式,需要确保你的 Excel 版本支持动态数组。
结果:
这个例子展示了 SCAN 的强大之处:它不仅能做数学运算,还能进行复杂的逻辑判断并保留状态。
案例 4:创意应用——拼接字符串
我们可以用 SCAN 来将一列文本逐步拼接起来。
假设有一列数据:
公式:
=SCAN('', A1:A3, LAMBDA(acc, val, acc & ' ' & val))结果:
三、优势与总结
- 简化公式:以往实现累积计算需要使用复杂的单元格引用(如 B2=$A$2, B3=B2+A3 并向下拖动)。SCAN 一个公式即可生成全部结果。
- 动态数组:结果自动溢出,无需拖动填充。当源数据变化时,结果自动更新。
- 逻辑清晰:将复杂的循环过程封装在一个函数内,公式意图非常明确。
- 功能强大:结合 LAMBDA,可以定义任何你想要的累积计算规则,无论是数学、文本还是逻辑运算。
四、注意事项
- 版本要求:必须是 Microsoft 365 订阅版的 Excel。Office 2021 或更早版本无法使用。
- 错误处理:如果 Lambda 中的计算可能产生错误(如除以零),需要在 Lambda 内部使用 IFERROR 等函数进行处理,否则错误会传递到最终结果中。
- 参数顺序:Lambda 的参数 (accumulator, value) 顺序是固定的,不能更改。
希望这篇教程能帮助你彻底掌握 SCAN 函数,让它成为你数据处理工具箱中的一把利器!