网站搜索

Excel LAMBDA 与 SCAN:有什么区别,它们如何协作?


人们经常混淆 Excel 的 LAMBDA 和 SCAN 函数,因为它们经常同时出现在公式中。然而,它们并不相同:LAMBDA 是定义逻辑的“头脑”,而 SCAN 是执行逻辑的“工具”。以下是区分它们的方法。

LAMBDA 和 SCAN 函数可供使用 Excel 2024 或更高版本、Microsoft 365 版 Excel、网页版 Excel 或最新的 Excel 移动和平板应用的用户使用。

LAMBDA 创建自定义逻辑

Excel 的 LAMBDA 函数之所以如此革命性,是因为它是一个空白的起点。大多数 Excel 函数都有固定的用途——SUM 总是求和,AVERAGE 总是求平均值。然而,LAMBDA 在你给它一组指令之前,并不会“做”任何事情。

在下面的公式中,LAMBDA 还没有可以处理的数字,这就是它返回 #CALC! 错误的原因:

=LAMBDA(a,b,a*b)

然而,它知道当它确实收到两个值(a和b)时,它应该将它们相乘(a*b)。这就是为什么我称它为“脑”——它拥有智能,但需要外部来源为其提供数据。

LAMBDA 的独立功能

你可以通过 LAMBDA 是否可以在名称管理器中独立存在来区分它和 SCAN。通过保存一个 LAMBDA 并为其命名,例如“CalculateMarkup”,你实际上创建了一个新的原生 Excel 函数,可以在工作簿中的任何地方调用。而 SCAN 则不能这样保存——它必须存在于公式内部。

SCAN 导航数据范围

LAMBDA 关注的是逻辑,而 SCAN 关注的是移动。它是一个辅助函数,旨在遍历一系列单元格,同时跟踪累计总数或不断增长的列表。因此,它没有执行数学运算的能力——它只会:

  1. 从特定数值开始。
  2. 在一系列单元格中移动。
  3. 在每一步都向 LAMBDA 请求指示。

因此,其语法如下:

=SCAN([initial_value],array,LAMBDA)

在哪里:

  • initial_value 是起点。
  • array 是要扫描的数组。
  • LAMBDA 是告诉 SCAN 如何操作的函数参数。

这两个功能协同工作

LAMBDA 和 SCAN 之间的混淆产生的原因是,SCAN 几乎总是在公式栏中作为父函数出现:

=SCAN(0,T_Sales[Sales],LAMBDA(a,b,a+b))

虽然使用 Excel 表格作为源数据是最佳做法,但 SCAN 公式必须放在表格的外部。这是因为它生成的是溢出数组,而表格无法处理。然而,请注意,你还应在表格和 SCAN 公式之间留出一个缓冲列,以防在按下 Enter 时表格抓取生成的数组。

因为 LAMBDA 被嵌在 SCAN 的括号内,所以很容易把它们看作是一个单独的工具。然而,以这种方式配对会在每个单元格中产生“握手”现象:

  1. SCAN 会获取当前总数和新单元格的值。
  2. SCAN 将两份数据交给 LAMBDA。
  3. LAMBDA 执行计算并返回结果。
  4. SCAN会将结果写下来,然后移动到下一行再次开始这个过程。

LAMBDA 和 SCAN 不仅仅处理数学

为了在实际场景中看出这些函数的区别,我将向你展示它们如何处理文本字符串。虽然一个简单的求和可能会让它们看起来像是单一的数学工具,但用它们来构建文本的面包屑路径会显示出它们实际是如何交互的。

假设你有一列音标代码,并且想在C列创建一个运行日志。

要做到这一点,你可以使用以下公式:

=SCAN("",T_NATO[Phonetic],LAMBDA(a,b,IF(b="",a,IF(a="",b,a&" - "&b))))

在这种情况下,这些函数正在执行两个独立的任务:

  • SCAN 管理起始状态(空文本字符串 "")以及在代码范围内的物理移动。它的唯一工作是提供“位置”和“时间”。
  • LAMBDA 会评估每个单元格的内容,并做出 SCAN 无法做出的逻辑决策。首先,它会检查单元格是否为空,以避免添加多余的分隔符。如果为空,它会简单地将当前列表向前传递。然而,如果单元格中包含数据,它会决定是以一个条目开始列表,还是将新单词附加到现有字符串上。

结果是一个随着每一行增长而溢出的列表。这证明了 SCAN 是传递 LAMBDA 指定的自定义逻辑的传递系统。

LAMBDA 和 SCAN 创建更稳健的总计

大多数人在构建累计总和时会偶然遇到这种天作之合。在早期版本的 Excel 中,你可能使用过类似 =SUM($B$2:B2) 的公式,然后向下填充该列。

这种传统方法的问题在于它依赖于相对引用。如果你对数据进行排序、插入新行或删除范围中间的单元格,引用通常会中断或返回 #REF! 错误。通过将 LAMBDA 与 SCAN 结合使用,你可以创建一个仅存在于单个单元格中的动态数组。

使用这个公式:

=SCAN(0,T_Inventory[Stock],LAMBDA(a,b,a+b))

在这里,函数划分了责任以防止错误:

  • SCAN 将计算锁定在该范围内。因为它是一个单一公式,所以你不必担心列中间的单元格公式被更改或删除。
  • LAMBDA 保存逻辑。如果你需要更改数学计算,只需在一个地方进行修改,就可以更新整列数据。


一旦你认识到 LAMBDA 是智能,而 SCAN 是传送系统,你就可以停止将它们视为一个混乱的整体。这个区分是从脆弱、拖累的公式转向强大、自动化的工作表的关键,随着数据增长,这些工作表会自行更新。

然而,这两个函数之间的配合只是现代 Excel 中处理数组的一种方式。如果你不需要累积运行总和,只是想单独转换某个范围内的每个单元格,则应使用 MAP 函数。

相关文章