Menu

Excel LAMBDA 函数:自定义函数、MAP 和 BYROW

=LAMBDA(price,price*1.2)(B2) 定义一个只有一个输入 price 的小函数,并直接对 B2 调用它。把 LAMBDA 保存到名称管理器中,就能像内置函数一样使用,也可以把它传给 MAP、BYROW、SCAN 和 REDUCE。

本页的每张表格都是实时的:修改数字或公式,就会重新计算。

=LAMBDA(price,price*1.2)(B2) 定义了一个只有一个输入 price 的小函数,并立即对 B2 调用它:Pen 的 2.5 变成 3。单看这一点,它不过是更长的 =B2*1.2。LAMBDA 真正的用处在于:在名称管理器中给函数起个名字,让一个很长的公式变成 =ADDVAT(B2);以及把它交给 MAP、BYROW 和下面介绍的其他函数。

对每个价格调用一个函数
C2
ABC
1ItemPriceWith VAT
2Pen2.53
3Bag120144
4Lamp3542
5Mug89.6
6Desk150180
点击单元格查看它的公式。修改数字或公式,表格会重新计算。

LAMBDA 语法

=LAMBDA([parameter1, parameter2, ...], calculation)
  • 每个 parameter 是一个输入的名称,就像 LET 中的名称一样。最多可以有 253 个。
  • 最后一个参数是 calculation,即使用这些参数进行的计算。
  • 参数的值写在右括号之后的另一对括号里:=LAMBDA(x,y,x*y)(3,4) 返回 12。

LAMBDA、MAP、BYROW、BYCOL、SCAN、REDUCE 和 MAKEARRAY 需要 Microsoft 365、Excel 2024 或网页版 Excel。Excel 2021 有 LET,但没有这些函数。Google 表格也有 LAMBDA,可以通过“数据 > 命名函数”给它起名保存。

把 LAMBDA 保存为自定义函数

给 LAMBDA 起个名字,它就可以反复使用。Excel 做这件事不需要 VBA,也不需要加载项:

  1. 打开“公式 > 名称管理器”,点击“新建”(或者使用“公式 > 定义名称”)。
  2. 在“名称”中输入函数名,例如 ADDVAT。
  3. 在“引用位置”中输入不带输入值的 LAMBDA:=LAMBDA(price,price*1.2)。
  4. 点击“确定”。现在在工作簿的任意单元格中输入 =ADDVAT(B2) 即可。
Name:        ADDVAT
Refers to:   =LAMBDA(price,price*1.2)
In a cell:   =ADDVAT(B2)        returns 3 when B2 is 2.5

这个函数只存在于该工作簿中。把使用它的工作表复制到另一个工作簿时,名称也会一起带过去。在名称管理器中修改一次 LAMBDA,所有调用它的单元格都会更新。保存之前,先在单元格中用括号加上输入测试一下 LAMBDA;在那里更容易发现错误。

MAP:对每个单元格应用 LAMBDA

MAP 对区域中的每个单元格调用一次 LAMBDA,返回一个形状相同的区域。这里每个超过 100 的价格都打九折:

超过 100 的价格打九折
C2
ABC
1ItemPricePrice to pay
2Pen2.52.5
3Bag120108
4Lamp3535
5Mug88
6Desk150135
点击单元格查看它的公式。修改数字或公式,表格会重新计算。

Bag(120)变成 108,Desk(150)变成 135,其他价格保持不变。C2 中的一个公式就覆盖了整列。MAP 还可以同时遍历两个大小相同的区域:数量在 D2:D6 中时,=MAP(B2:B6,D2:D6,LAMBDA(p,q,p*q)) 把每个价格乘以对应的数量。

BYROW:每行一个结果

BYROW 每次把一整行交给 LAMBDA,所以 LAMBDA 可以对这一行使用 MAX、SUM 或 AVERAGE。下面计算每个学生的最高分和平均分:

每个学生的最高分和平均分
E2
ABCDEF
1StudentTest 1Test 2Test 3BestAverage
2Ann7285909082.3
3Ben6470587064
4Cara8892959591.7
5Dan7560818172
点击单元格查看它的公式。修改数字或公式,表格会重新计算。

E2 返回 90、70、95 和 81;F2 返回 82.3、64、91.7 和 72。直接写 =MAX(B2:D5) 只会得到整张表的一个数字;BYROW 让一个公式也能按行分开计算。BYCOL 按列做同样的事:=BYCOL(B2:D5,LAMBDA(c,AVERAGE(c))) 返回每次测试的平均分。

SCAN 和 REDUCE:累计求和

REDUCE 遍历一个区域,并带着一个值往下走,只返回最终结果。SCAN 做的事相同,但会返回每一步的结果,所以一个公式就能算出累计合计:

累计合计与总计
C2
ABCD
1ItemPriceRunning totalTotal
2Pen2.52.5315.5
3Bag120122.5
4Lamp35157.5
5Mug8165.5
6Desk150315.5
点击单元格查看它的公式。修改数字或公式,表格会重新计算。

第一个参数 0 是初始值。对于每个价格,LAMBDA 接收到目前为止的合计和这个价格,并返回新的合计。C2 依次得到 2.5、122.5、157.5、165.5、315.5,D2 只显示最终的 315.5。单纯求总和时 SUM 更简单,但 REDUCE 可以携带任何东西,例如一段不断变长的文本,或者只在某些行才增加的计数。

用 LET 在一个公式中为 LAMBDA 命名

如果只有一个公式用到某个 LAMBDA,就不需要名称管理器。用 LET 给它命名,再把这个名称传给 MAP 或 BYROW:

把命名的 LAMBDA 传给 MAP
C2
ABC
1ItemPriceSale price
2Pen2.52.25
3Bag120108
4Lamp3531.5
5Mug87.2
6Desk150135
点击单元格查看它的公式。修改数字或公式,表格会重新计算。

每个价格都打九折:2.25、108、31.5、7.2 和 135。在 Excel 中,你也可以在 LET 内部直接调用命名的 LAMBDA:=LET(f,LAMBDA(x,x*2),f(5)) 返回 10。

练习:用 BYROW 计算每行合计

轮到你了
E2
ABCDE
1StudentTest 1Test 2Test 3Total
2Ann728590
3Ben647058
4Cara889295
5Dan756081
点击单元格查看它的公式。修改数字或公式,表格会重新计算。

轮到你了: 在 E2 中用一个公式返回每个学生三次测试的总分,每行一个数字。

LAMBDA 常见错误

=LAMBDA(x,x*2)          #CALC!   defined but never called
=LAMBDA(x,x*2)(5)       10
=LAMBDA(x,y,x*y)(3)     #VALUE!  two parameters, one value
=LAMBDA(x,x*2)(3,4)     #VALUE!  one parameter, two values
  • #CALC! 表示单元格中有一个 LAMBDA 但没有被调用。用括号加上输入,或者把它保存到名称管理器中再按名称调用。
  • #VALUE! 表示值的个数与参数的个数不一致。两边都数一数。
  • #NAME? 表示当前 Excel 版本没有 LAMBDA,或者保存的名称拼错了。参数名遵循 LET 的规则:不能有空格,也不能是看起来像单元格地址的名称。
  • BYROW 中的 LAMBDA 每行返回多个值 时会得到 #CALC!。每一行只能产生一个值;要返回一行结果,改用 MAKEARRAY 或普通的数组公式。

常见问题

Excel 中的 LAMBDA 函数是什么?

它把一个公式变成带有命名输入的函数。=LAMBDA(price,price*1.2) 接收一个名为 price 的输入,返回 price 乘以 1.2。调用时在后面用括号加上输入:=LAMBDA(price,price*1.2)(B2),或者在名称管理器中给它起个名字保存起来。

不用 VBA,怎样在 Excel 中创建自定义函数?

打开“公式 > 名称管理器 > 新建”,输入一个名称,例如 ADDVAT,在“引用位置”中输入 =LAMBDA(price,price*1.2)。点击“确定”后,=ADDVAT(B2) 就能在这个工作簿的任意单元格中使用。

我的 LAMBDA 为什么返回 #CALC!?

在单元格中输入一个没有给出输入的 LAMBDA,例如 =LAMBDA(x,x*2),这个函数从未被调用,所以 Excel 显示 #CALC!。在它后面用括号加上输入,例如 =LAMBDA(x,x*2)(5),或者把它保存到名称管理器中。

哪些 Excel 版本有 LAMBDA?

Microsoft 365、Excel 2024 和网页版 Excel,同时还有 MAP、BYROW、BYCOL、SCAN、REDUCE 和 MAKEARRAY。Excel 2021 有 LET,但没有 LAMBDA。

Excel 中的 BYROW 有什么用?

它对区域的每一行运行一次 LAMBDA,每行返回一个结果:=BYROW(B2:D5,LAMBDA(r,MAX(r))) 返回每一行的最大值,并向下溢出。

Coddy 编程语言插图

和 Coddy 一起学编程

开始