摘要: 本文用一张销售表贯穿始终,一次讲透 Excel 的四个"公式整理神器"------LET (给中间结果起名字)、LAMBDA (把逻辑打包成自定义函数)、MAP (批量处理每个值)、REDUCE(累计计算)。从单个函数的语法与用法,到组合实战(阶梯提成、批量评级、累计销售额、多条件判断),再到新手最容易踩的 6 个坑与老版本替代方案,帮你把又长又乱的公式改写得又短又清晰。

统计、查找、判断、日期、文本、动态提取、数据重塑都齐了。
但用着用着,你会发现一个新问题:公式越写越长,越写越乱。
一个单元格里塞了七八层 IF、VLOOKUP、SUMIFS,括号套括号,自己看着都头疼,更不敢轻易去改。
同样的计算逻辑,在十个单元格里重复写了十遍,改一个规则要改十处。
想批量处理一组数据,只能往下拖公式,拖到手抽筋。
其实,新版 Excel 早就给你准备好了四个"公式整理神器":
LET + LAMBDA + MAP + REDUCE。
一句话记住它们:
- LET:给公式里的中间结果起个名字,别再重复写
- LAMBDA:把一段计算逻辑打包成自定义函数,随调随用
- MAP:对一组数据里的每个值,批量套用同一个计算
- REDUCE:对一组数据,从头到尾累计计算,最后返回一个结果
组合起来,公式又短又清晰,复杂计算一次搞定。
今天一次讲透。
一、先认识四个函数
1. LET:给中间结果起名字
语法:
excel
=LET(名称1, 值1, 名称2, 值2, ..., 最终计算)
大白话:先把中间结果算出来,起个名字,后面直接用名字,不用重复写。
比如,原来这样写:
excel
=IF(A2>10000, A2*0.1, A2*0.05)
A2 写了三遍。
用 LET:
excel
=LET(x, A2, IF(x>10000, x*0.1, x*0.05))
x 就是 A2 的名字,后面直接用 x。
公式更短,改起来也方便。
2. LAMBDA:自定义函数
语法:
excel
=LAMBDA(参数1, 参数2, ..., 计算式)
大白话:把一段计算逻辑打包成一个函数,以后直接调用。
比如,定义一个算提成的函数:
excel
=LAMBDA(销售额, IFS(销售额<10000, 销售额*0.05, 销售额<20000, 销售额*0.08, TRUE, 销售额*0.1))
写完之后,可以立刻在后面加括号调用:
excel
=LAMBDA(销售额, IFS(销售额<10000, 销售额*0.05, 销售额<20000, 销售额*0.08, TRUE, 销售额*0.1))(A2)
但更常用的是:在"名称管理器"里定义成名字,比如叫"提成",以后直接:
excel
=提成(A2)
就像用 SUM 一样自然。
3. MAP:批量处理每个值
语法:
excel
=MAP(数组, LAMBDA(每个值, 计算式))
大白话:把数组里的每个值,都套一遍 LAMBDA,返回同样大小的结果。
比如,把 A2:A10 每个数都乘以 2:
excel
=MAP(A2:A10, LAMBDA(x, x*2))
结果会自动溢出到相邻单元格,完全不用手动下拉填充。
4. REDUCE:累计计算
语法:
excel
=REDUCE(初始值, 数组, LAMBDA(累计值, 当前值, 计算式))
大白话:从初始值开始,一个接一个处理数组里的值,最后返回一个结果。
比如,求 A2:A10 的总和:
excel
=REDUCE(0, A2:A10, LAMBDA(acc, x, acc+x))
acc 是累计值,x 是当前值。
从 0 开始,每次加上当前值,最后得到总和。
二、假设我们有这样一张销售表
沿用前面的表:
| 列 | 内容 |
|---|---|
| A列 | 销售员 |
| B列 | 销售额 |
数据从第2行到第100行。
接下来,我们用这四个函数完成几个常见需求。
三、LET:让复杂公式变清爽
1. 原来:重复写单元格
excel
=IF(B2>20000, B2*0.1, IF(B2>10000, B2*0.08, B2*0.05))
B2 写了三遍。
如果 B2 换成 VLOOKUP 取数,公式会又长又乱。
2. 用 LET:只写一遍
excel
=LET(销售额, B2, IF(销售额>20000, 销售额*0.1, IF(销售额>10000, 销售额*0.08, 销售额*0.05)))
销售额只算一次,后面直接用名字。
3. 多变量:阶梯提成
excel
=LET(
销售额, B2,
税率, IFS(销售额>20000, 0.1, 销售额>10000, 0.08, TRUE, 0.05),
销售额*税率
)
先定义销售额,再定义税率,最后相乘。
逻辑清晰,一眼看懂。
四、LAMBDA:把逻辑打包成函数
1. 直接调用
excel
=LAMBDA(销售额, IFS(销售额>20000, 销售额*0.1, 销售额>10000, 销售额*0.08, TRUE, 销售额*0.05))(B2)
2. 定义为名称,以后随调随用
步骤:
- 公式 → 名称管理器 → 新建
- 名称写:
提成 - 引用位置写:
excel
=LAMBDA(销售额, IFS(销售额>20000, 销售额*0.1, 销售额>10000, 销售额*0.08, TRUE, 销售额*0.05))
- 确定。
以后在任何单元格里写:
excel
=提成(B2)
就像用内置函数一样。
3. 定义多个参数的函数
比如,算加权金额:
excel
=LAMBDA(数量, 单价, 数量*单价)
定义为"金额",以后:
excel
=金额(A2, B2)
五、MAP:批量计算,不用下拉
1. 批量算提成
excel
=MAP(B2:B100, LAMBDA(x, IFS(x>20000, x*0.1, x>10000, x*0.08, TRUE, x*0.05)))
结果自动溢出,B 列每个销售额都算了一遍。
2. 批量取整
excel
=MAP(B2:B100, LAMBDA(x, ROUND(x, 0)))
3. 批量判断等级
excel
=MAP(B2:B100, LAMBDA(x, IFS(x>=90, "优秀", x>=80, "良好", x>=60, "及格", TRUE, "不及格")))
不用往下拖,一个公式全搞定。
六、REDUCE:累计计算,返回一个结果
1. 求和
excel
=REDUCE(0, B2:B100, LAMBDA(acc, x, acc+x))
2. 求最大值
excel
=REDUCE(0, B2:B100, LAMBDA(acc, x, IF(x>acc, x, acc)))
3. 字符串拼接
excel
=REDUCE("", A2:A10, LAMBDA(acc, x, acc & x & "、"))
把 A2:A10 的名字拼成一个字符串。
4. 累计提成
excel
=REDUCE(0, B2:B100, LAMBDA(acc, x, acc + IFS(x>20000, x*0.1, x>10000, x*0.08, TRUE, x*0.05)))
从 0 开始,逐个累加每个销售额的提成,最后得到总提成。
七、组合用法:四个函数一起上
1. LET + LAMBDA:定义清晰的自定义函数
excel
=LET(
销售额, B2,
税率, IFS(销售额>20000, 0.1, 销售额>10000, 0.08, TRUE, 0.05),
销售额*税率
)
2. LAMBDA + MAP:批量处理
excel
=MAP(B2:B100, LAMBDA(x, IFS(x>20000, x*0.1, x>10000, x*0.08, TRUE, x*0.05)))
3. LAMBDA + REDUCE:累计计算
excel
=REDUCE(0, B2:B100, LAMBDA(acc, x, acc + IFS(x>20000, x*0.1, x>10000, x*0.08, TRUE, x*0.05)))
4. LET + MAP + REDUCE:复杂计算一次搞定
excel
=LET(
数据, B2:B100,
提成, MAP(数据, LAMBDA(x, IFS(x>20000, x*0.1, x>10000, x*0.08, TRUE, x*0.05))),
REDUCE(0, 提成, LAMBDA(acc, x, acc+x))
)
先定义数据,再批量算提成,最后累计求和。
公式虽然变长了,但逻辑被清晰地分成了几段,每一步都明明白白。
八、实战案例
1. 阶梯提成计算
规则:销售额 >20000 提成 10%,>10000 提成 8%,其余 5%。
定义为"提成"函数:
excel
=LAMBDA(销售额, IFS(销售额>20000, 销售额*0.1, 销售额>10000, 销售额*0.08, TRUE, 销售额*0.05))
以后直接:
excel
=提成(B2)
2. 批量评级
excel
=MAP(B2:B100, LAMBDA(x, IFS(x>=90, "优秀", x>=80, "良好", x>=60, "及格", TRUE, "不及格")))
3. 累计销售额
excel
=REDUCE(0, B2:B100, LAMBDA(acc, x, acc+x))
4. 多条件复杂判断
excel
=LET(
销售额, B2,
满意度, C2,
等级, IFS(AND(销售额>10000, 满意度>90), "优秀", 销售额>8000, "良好", TRUE, "待改进"),
等级
)
5. 自定义函数库
把常用的计算逻辑都定义成名称:
- 提成
- 评级
- 工龄
- 账期
以后写公式就像搭积木,效率翻倍。
九、新手最容易踩的6个坑
1. 版本限制
- LET:Excel 2021、Excel 365、WPS 新版
- LAMBDA:Excel 365、WPS 新版
- MAP、REDUCE:Excel 365、WPS 新版
老版本打开会显示 #NAME?。
发给别人之前,最好确认对方版本。
2. LAMBDA 定义名称时参数名不能和单元格冲突
参数名最好用英文,比如 x、acc、sales,别用 A1、B2 这种。
3. MAP 和 REDUCE 要求数组大小一致
MAP 返回的结果和输入数组大小一样。
REDUCE 返回单个值。
4. LET 的名称不能重复
excel
=LET(x, 1, x, 2, x)
会报错。名称必须唯一。
5. LAMBDA 直接调用要加括号
excel
=LAMBDA(x, x*2)(A2)
最后那个 (A2) 不能省。
错误示例:
excel
=LAMBDA(x, x*2) A2
报错原因: LAMBDA 定义完函数体后,必须紧跟一对括号 () 才能触发调用。这里少了括号,Excel 会把 A2 当成一个独立的单元格引用,无法识别这是一个函数调用,直接报语法错误。
正确写法:
excel
=LAMBDA(x, x*2)(A2)
说明: 末尾的 (A2) 就是调用动作,把 A2 的值作为参数 x 传进去,返回 A2*2。括号一个都不能少。
6. 调试困难
嵌套太多层时,出错不容易定位。
建议先用 LET 把中间结果拆开,一步一步验证。
错误示例:
excel
=IF(IF(B2>10000, B2*0.08, B2*0.05)>500, "高", "低")
报错原因: 两层 IF 嵌套在一起,一旦结果不对,你根本分不清是外层判断错了,还是内层提成算错了。括号一多,连自己都数不清哪层是哪层,排查起来非常痛苦。
正确写法:
excel
=LET(
提成, IF(B2>10000, B2*0.08, B2*0.05),
IF(提成>500, "高", "低")
)
说明: 先用 LET 把内层提成算出来并起个名字,再拿这个名字去做外层判断。哪一步出错,单独验证 提成 这个中间结果就能立刻定位,不用再对着括号数层数。
十、老版本怎么办?
如果用的是 Excel 2019 或更早版本,没有这四个函数,可以用:
- 辅助列:把中间结果写在旁边列,再引用。
- 定义名称:老版本也能定义名称,但功能有限。
- VBA:写自定义函数,功能更强,但学习成本高。
- Power Query:复杂计算可以放到 PQ 里做。
如果经常写复杂公式,强烈建议升级到 Microsoft 365,或者用 WPS 新版。
十一、总结
记住这四句话:
- 公式太长:用 LET 起名字
- 逻辑重复:用 LAMBDA 打包成函数
- 批量计算:用 MAP 遍历每个值
- 累计计算:用 REDUCE 从头加到尾
组合起来:
excel
=LET(名称, 值, 最终计算)
=LAMBDA(参数, 计算式)
=MAP(数组, LAMBDA(x, 计算式))
=REDUCE(初始值, 数组, LAMBDA(acc, x, 计算式))
公式又短又清晰,复杂计算一次搞定。