如何在 Microsoft Excel 中使用 LAMBDA 辅助函数
Excel 的 LAMBDA 辅助函数是未来,但真正的挑战是知道选择哪一个。这是你快速参考的指南,用于将函数与任务匹配,并构建最终能够自我运算的电子表格。
本文介绍了五个迭代器和累加器辅助函数,这些函数可在 Microsoft 365 版 Excel、网页版 Excel 以及最新版本的 Excel 移动和平板应用中使用。SCAN 在 Excel 2024 中也可用。本文不介绍另外两个用于不同用途的辅助函数:MAKEARRAY(生成器)和 ISOMITTED(逻辑检查器)。
引擎:30秒的LAMBDA复习
把 LAMBDA 想象成你即兴编写的自定义公式——你不是使用固定的单元格引用如 A2*0.15,而是定义一个参数:
=LAMBDA(x,x*0.15)在哪里:
- x 是表示函数将处理的值的参数。
- x*0.15 是你希望 Excel 在该参数上执行的计算。
单凭这个公式,它并不能做太多;它需要一个驱动程序将该逻辑应用到你的数据上。这就是 LAMBDA 辅助函数发挥作用的地方。
Excel 表格不支持溢出结果。如果你尝试在其中放置像 MAP 或 SCAN 这样的动态数组公式,会触发 #SPILL! 错误。为了避免这种情况,应始终将 LAMBDA 辅助函数放在标准网格中。
在此演示中,我将使用以下名为 T_Gadgets 的表作为数据源,并在其旁边或上方的普通单元格中输入公式。
迭代器(MAP, BYROW, BYCOL):将逻辑应用于每个单元格、行或列
迭代器遍历你的表格数据,并将 LAMBDA 逻辑应用到每个项目上。
映射:将逻辑应用到每一个单元格
语法 | =MAP(数组,LAMBDA(参数,计算)) |
|---|---|
目标 | 你想计算 T_Gadgets 中每一行的收入,同时应用 10% 的折扣。 |
好处 |
整个计算都集中在一个地方。这使得你的逻辑更安全,因为结果中的单独行无法被覆盖。 |
这是你需要输入到单元格 F2 的 MAP 公式:
=MAP(T_Gadgets[Units],T_Gadgets[Price],LAMBDA(u,p,u*p*0.9))在哪里:
- 数组:T_Gadgets[Units],T_Gadgets[Price] 是您要处理的列。
- 参数: u,p 是参数——每行的单个单位和价格。
- 计算:u*p*0.9 将两个数值相乘并应用10%的折扣。
使用 MAP 来合并平行列;使用 BYROW(如下)将每条记录视为一个单独的数据包。
按行:为每一行获取结果
语法 | =BYROW(数组,LAMBDA(行,计算)) |
|---|---|
目标 | 你想在 T_Gadgets 中将单位和价格横向相乘,以获得每行(每天)的总收入。 |
好处 |
你不需要在成百上千行中管理公式,而是在单个单元格中管理一个公式,然后向下自动填充,从而确保整个数据集的一致性。 |
单元格 F2 的 BYROW 公式如下:
=BYROW(T_Gadgets[[Units]:[Price]],LAMBDA(row,PRODUCT(row)))哪里:
- 数组: T_Gadgets[[Units]:[Price]] 是包含这两列的范围。
- 参数: row 表示整行水平数据。
- 计算:PRODUCT(row) 会将该行中的每个数值相乘。
BYCOL:为每一列获取结果
语法 | =BYCOL(数组, LAMBDA(列, 计算)) |
|---|---|
目标 | 你想要一个单一的公式来查找 T_Gadgets 表中 Units 和 Price 列的最大值。 |
好处 | 通过在表格上方的行中使用 BYCOL,您可以创建一个标题摘要。这可以避免您必须向下滚动到庞大表格底部的总计行,并将逻辑浓缩到一个单元格中,以确保安全性和一致性。 |
这是单元格 A1 的 BYCOL 公式:
=BYCOL(T_Gadgets[#Data],LAMBDA(col,IFERROR(MAX(col),"")))在哪里:
- 数组: T_Gadgets[#Data] 确保公式可以水平扩展。如果你添加一个新列,公式会自动检测并向右扩展。
- 参数: col 表示整列垂直列。
- 计算:IFERROR(MAX(col),"") 查找每列中的最大值。使用 IFERROR 包裹是必要的,当函数遇到文本列可能会触发错误时,例如 AND 和 OR。
像 MAX 和 SUM 这样的函数在文本列上通常会返回 0。要在不破坏公式对齐的情况下隐藏此值,选择包含零的单元格,在“设置单元格格式”对话框(Ctrl+1)中使用自定义数字格式 ;;;(三个分号),可以在保持单元格功能的同时使该值不可见。
累加器(SCAN 和 REDUCE):在进行中构建结果
累加器具有记忆功能,在遍历你的表格时会保持累计计数。
扫描:创建累计总数或累计计数
语法 | =SCAN(初始值,数组,LAMBDA(累加器,值,计算)) |
|---|---|
目标 | 你想查看 T_Gadgets 中 Units 列的每日累计总数,以跟踪库存消耗情况。 |
好处 | 像 =SUM($C$2:C2) 这样的传统累计总和如果排序或删除行可能会出错。SCAN 将逻辑保持在一个单元格中,使其不受结构性更改的影响。 |
在此示例中,单元格 F2 的 SCAN 公式如下:
=SCAN(0,T_Gadgets[Units],LAMBDA(acc,val,acc+val))在哪里:
- 初始值: 0 是计数开始的地方。
- 数组:T_Gadgets[Units] 是你正在扫描的列。
- 参数: acc,val 是参数——累加器,用于记忆之前的总和,以及当前单元格的值,将其加到记忆中。
- 计算: acc+val 是更新内存的逻辑。
REDUCE:将数组缩减为一个最终值
语法 | =REDUCE(初始值,数组,LAMBDA(累加器,值,计算)) |
|---|---|
目标 | 你想要汇总 T_Gadgets 中的单位数量,但只针对大宗订单(销售超过10件的商品)。 |
好处 | REDUCE 将多步骤逻辑压缩到一个单元格中,避免使用嵌套的 SUMIF、辅助列或多个中间步骤。 |
在单元格 F2 中,输入此 REDUCE 公式:
=REDUCE(0,T_Gadgets[Units],LAMBDA(acc,val,IF(val>10,acc+val,acc)))在哪里:
- 初始值: 0 是你求和的起点。
- 数组: T_Gadgets[Units] 是正在被聚合的列。
- 参数: acc,val 是参数——作为函数运行过程中构建的最终累积结果,以及当前单元格的值将被加入累积中。
- 计算: IF(val>10,acc+val,acc) 仅在值大于10时才将其加到总数中。
简而言之:你需要哪个 LAMBDA 辅助函数?
使用此快速参考来决定哪个功能适合您的任务:
如果你想要... | 使用... | 完整教程 |
|---|---|---|
将逻辑应用到每个单元格 | 地图 | 链接 |
为每一行获取一个结果 | 按行 | 链接 |
为每一列获取结果 | BYCOL | 链接 |
创建累计总和 | 扫描 | 链接 |
获取汇总值 | 减少 | 链接 |
使用这些基于 LAMBDA 的函数可以将你的 Excel 工作簿从一个复杂的计算器转变为一个被官方认为是编程语言的复杂开发环境。那么,你还在等什么呢?找到一个你目前在整个数据集中重复进行的计算,并将其集中到单个单元格函数中——你再也不会回到旧的方式了。






