=LAMBDA(price,price*1.2)(B2) 定义了一个只有一个输入 price 的小函数,并立即对 B2 调用它:Pen 的 2.5 变成 3。单看这一点,它不过是更长的 =B2*1.2。LAMBDA 真正的用处在于:在名称管理器中给函数起个名字,让一个很长的公式变成 =ADDVAT(B2);以及把它交给 MAP、BYROW 和下面介绍的其他函数。
| A | B | C | |
|---|---|---|---|
| 1 | Item | Price | With VAT |
| 2 | Pen | 2.5 | 3 |
| 3 | Bag | 120 | 144 |
| 4 | Lamp | 35 | 42 |
| 5 | Mug | 8 | 9.6 |
| 6 | Desk | 150 | 180 |
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,也不需要加载项:
- 打开“公式 > 名称管理器”,点击“新建”(或者使用“公式 > 定义名称”)。
- 在“名称”中输入函数名,例如
ADDVAT。 - 在“引用位置”中输入不带输入值的 LAMBDA:
=LAMBDA(price,price*1.2)。 - 点击“确定”。现在在工作簿的任意单元格中输入
=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 的价格都打九折:
| A | B | C | |
|---|---|---|---|
| 1 | Item | Price | Price to pay |
| 2 | Pen | 2.5 | 2.5 |
| 3 | Bag | 120 | 108 |
| 4 | Lamp | 35 | 35 |
| 5 | Mug | 8 | 8 |
| 6 | Desk | 150 | 135 |
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。下面计算每个学生的最高分和平均分:
| A | B | C | D | E | F | |
|---|---|---|---|---|---|---|
| 1 | Student | Test 1 | Test 2 | Test 3 | Best | Average |
| 2 | Ann | 72 | 85 | 90 | 90 | 82.3 |
| 3 | Ben | 64 | 70 | 58 | 70 | 64 |
| 4 | Cara | 88 | 92 | 95 | 95 | 91.7 |
| 5 | Dan | 75 | 60 | 81 | 81 | 72 |
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 做的事相同,但会返回每一步的结果,所以一个公式就能算出累计合计:
| A | B | C | D | |
|---|---|---|---|---|
| 1 | Item | Price | Running total | Total |
| 2 | Pen | 2.5 | 2.5 | 315.5 |
| 3 | Bag | 120 | 122.5 | |
| 4 | Lamp | 35 | 157.5 | |
| 5 | Mug | 8 | 165.5 | |
| 6 | Desk | 150 | 315.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:
| A | B | C | |
|---|---|---|---|
| 1 | Item | Price | Sale price |
| 2 | Pen | 2.5 | 2.25 |
| 3 | Bag | 120 | 108 |
| 4 | Lamp | 35 | 31.5 |
| 5 | Mug | 8 | 7.2 |
| 6 | Desk | 150 | 135 |
每个价格都打九折:2.25、108、31.5、7.2 和 135。在 Excel 中,你也可以在 LET 内部直接调用命名的 LAMBDA:=LET(f,LAMBDA(x,x*2),f(5)) 返回 10。
练习:用 BYROW 计算每行合计
| A | B | C | D | E | |
|---|---|---|---|---|---|
| 1 | Student | Test 1 | Test 2 | Test 3 | Total |
| 2 | Ann | 72 | 85 | 90 | |
| 3 | Ben | 64 | 70 | 58 | |
| 4 | Cara | 88 | 92 | 95 | |
| 5 | Dan | 75 | 60 | 81 |
轮到你了: 在 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))) 返回每一行的最大值,并向下溢出。