Excel函数系列09:公式又长又乱?LET+LAMBDA+MAP+REDUCE,自定义函数一次讲透

摘要: 本文用一张销售表贯穿始终,一次讲透 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. 定义为名称,以后随调随用

步骤:

  1. 公式 → 名称管理器 → 新建
  2. 名称写:提成
  3. 引用位置写:
excel 复制代码
=LAMBDA(销售额, IFS(销售额>20000, 销售额*0.1, 销售额>10000, 销售额*0.08, TRUE, 销售额*0.05))
  1. 确定。

以后在任何单元格里写:

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 或更早版本,没有这四个函数,可以用:

  1. 辅助列:把中间结果写在旁边列,再引用。
  2. 定义名称:老版本也能定义名称,但功能有限。
  3. VBA:写自定义函数,功能更强,但学习成本高。
  4. Power Query:复杂计算可以放到 PQ 里做。

如果经常写复杂公式,强烈建议升级到 Microsoft 365,或者用 WPS 新版。


十一、总结

记住这四句话:

  • 公式太长:用 LET 起名字
  • 逻辑重复:用 LAMBDA 打包成函数
  • 批量计算:用 MAP 遍历每个值
  • 累计计算:用 REDUCE 从头加到尾

组合起来:

excel 复制代码
=LET(名称, 值, 最终计算)
=LAMBDA(参数, 计算式)
=MAP(数组, LAMBDA(x, 计算式))
=REDUCE(初始值, 数组, LAMBDA(acc, x, 计算式))

公式又短又清晰,复杂计算一次搞定。

相关推荐
鲲穹AI种草1 小时前
办公表格批量处理:多款 Excel 工具能力客观记录
excel
开开心心就好2 小时前
二维码批量生成导出工具,离线可用完全免费
java·前端·人工智能·智能手机·github·excel·visual studio
泡海椒7 小时前
JQuick-Excel FORMAT 导出格式实战:日期、金额显示与 TRANSFORM 的边界
前端·python·excel
流形填表21 小时前
题库迁移实战:Excel中间格式与列映射
python·excel
泡海椒1 天前
JQuick-Excel JQuickRow 数据准备实战:JObjectConverter、JQuickRow.toRows 与 XML 导出链路
xml·windows·excel
是枚小菜鸡儿吖2 天前
TraceBack:基于TextIn xParse,统一解析PDF/Word/Excel/扫描件/截图,自动交叉核验维修报告真伪,带原文出处,让造假无处遁形
pdf·word·excel
gudufy3 天前
EasyAdminBlazor Excel 导入源码解析:数据验证、权限与事务如何处理?
excel·blazor·admin
copilot中国版3 天前
Copilot + Excel鱼骨图:让根因分析从“凭经验”变成“有依据”
人工智能·excel·copilot
泡海椒3 天前
JQuick-Excel 字段映射实战:用 MAPPING 固化 Excel 表头与业务字段契约
xml·java·开发语言·excel