ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

Excel LAMBDA函数进阶:不写VBA也能自定义公式

Excel LAMBDA函数进阶:不写VBA也能自定义公式 一条复杂的 Excel 公式如果你在同一份工作簿里复制了三次以上大概率会遇到两个典型麻烦一是公式嵌套太长过了两周自己都读不懂当初的逻辑二是需求一变得挨个单元格手工改公式改错一个就是报表事故。很多人这个时候第一反应是去学 VBA但 VBA 本质上是一套完整的编程语言要写过程、搞对象模型、处理宏安全性学习成本并不低而且启用宏之后还要面对文件格式、公司安全策略等一系列额外问题。Excel 365 里的 LAMBDA 函数给出了另一条路径在普通公式里直接定义自己的函数不写 VBA、不启用宏、不需要保存成 xlsm一个普通工作簿就能跑起来。这个函数进入 Excel 公式体系之后很多过去只能靠 VBA 自定义函数UDF完成的轻量复用需求都能用纯公式完成。本文围绕 LAMBDA 函数这个主题整理一份可以照着操作的进阶教程。如果你正在跟李亚飞老师主讲的《Excel 高手进阶-LAMBDA 函数精讲》一起学习这份内容可以作为配套复习材料。本文会讲清楚四件事第一LAMBDA 和普通公式、VBA 的边界在哪里第二如何把一段公式封装成自己的函数第三用三个真实案例演示 LAMBDA 怎么解决姓名电话分离、按多条件找最大值、递归计算这类高频问题第四避坑指南和工程化建议。读完后你可以立刻在自己的工作表中动手实践。1. 这篇文章真正要解决的问题先看一个典型场景。你负责销售报表每个月要把原始数据按照部门、月份、产品线多个维度计算汇总。于是你写出了一条类似下面的公式MAX(IF((B2:B1000B2)*(C2:C1000华东), D2:D1000))这条公式能用但问题在于你在这个笔记本上是这样写的换到另一个工作簿时又要重新写一遍如果需求从找最大值变成找最大值对应的订单号你又要重新设计整个公式。公式没有被命名没有被封装每次使用都是一次体力劳动。LAMBDA 解决的就是这个问题它让你可以把一段计算逻辑打包成一个有名字、有参数的自定义函数。之后你要做的只是调用它华东最大值(B2:B1000, C2:C1000, D2:D1000)注意这不是宏也不是 VBA它就是一个普通公式随着工作簿保存打开即用。更关键的一点是LAMBDA 降低了公式编程的门槛。过去你需要在 Excel 公式和 VBA 之间做选择——简单问题用公式复杂问题上 VBA现在中间多了一层公式级自定义函数。对于大多数只需要复用计算逻辑、不需要操控工作簿对象和读写外部文件的场景LAMBDA 是比 VBA 更轻、更安全、更容易维护的方案。这篇文章最适合三类读者已经掌握 VLOOKUP、SUMIFS、INDEXMATCH 等常用函数但觉得公式越来越难维护的进阶用户工作中反复使用同一套复杂计算却不想为此学习 VBA 的业务分析师正在学习 Excel 新函数体系想知道 LAMBDA 与数组函数、LET 函数如何配合的 Excel 爱好者。2. LAMBDA 函数是什么从一次性公式到自定义函数2.1 通俗理解你可以把 LAMBDA 理解成公式的模板。普通公式是一段针对具体单元格的计算过程比如B2 * C2LAMBDA 则把这段计算过程抽象成一个函数定义LAMBDA(单价, 数量, 单价 * 数量)(B2, C2)意思是我现在定义一个函数它接收两个参数单价和数量返回它们的乘积紧接着把 B2、C2 传进去得出结果。这个定义放在单元格里得到的是结果 但如果把它保存到名称管理器它就成了一个真正的函数后续每个单元格都可以直接调用。如果你接触过其他编程语言会发现这个思路非常熟悉——Java 8 的 Lambda 表达式、Python 的 lambda、JavaScript 的箭头函数核心思想都是把一段计算逻辑当作可传递、可复用的函数值。Excel 的 LAMBDA 语法上并不复杂真正有价值的是它把这种函数式思想引入了公式体系。2.2 LAMBDA、普通公式与 VBA 的区别对比维度普通公式LAMBDA 自定义函数VBA 自定义函数定义位置写在单元格中名称管理器或单元格中VBA 编辑器中是否可复用不可复用复制粘贴可命名复用可复用是否需要启用宏不需要不需要需要文件格式xlsxxlsxxlsm适用复杂度中等中高高计算速度较快较快取决于代码实现学习门槛低中较高一句话总结普通公式是一次性计算LAMBDA 是计算逻辑的定义VBA 是可操作 Excel 对象的程序。你不需要用 VBA 解决的问题就不要为它去背 VBA 的对象模型。2.3 LAMBDA 和 LET 的关系Excel 365 里还有一个常和 LAMBDA 一起出现的函数LET。LET 的作用是在一个公式内部定义中间变量避免重复计算相同部分。LET(单价, B2, 数量, C2, 单价 * 数量)这里的单价和数量是公式内部的临时变量。LET 解决的是公式内变量定义的问题LAMBDA 解决的是如何把公式封装成可复用函数的问题。两者各司其职配合使用效果最好——LAMBDA 负责定义函数封装LET 负责在函数内部梳复杂逻辑。后文的实战案例会用到这个组合。3. 环境准备先确认你的 Excel 版本3.1 支持范围LAMBDA 函数是从 2020 年底开始在 Excel 365 的测试通道中出现的随后随 Microsoft 365 订阅逐步推送给正式版本。因此Microsoft 365 订阅用户可以稳定使用Excel 2021 零售版也内置了 LAMBDA 函数Excel 2016、Excel 2019 等旧版永久授权版本不支持。如果你用的是 WPS 或国产表格软件LAMBDA 的支持程度并不稳定不同版本差异较大建议以你实际安装版本的官方文档为准。最稳妥的判断方法是直接测试在任意单元格中输入下面的公式LAMBDA(x, x)(1)如果返回 1说明当前版本支持 LAMBDA如果返回 #NAME?说明当前环境不支持后面的内容只能看思路无法直接落地。3.2 如何查看版本号如果测试不放心可以手动查一下版本打开 Excel点击左上角文件点击账户旧版可能叫账号在产品信息中点击关于 Excel查看完整版本号和更新渠道。如果显示Microsoft 365 订阅基本可以放心使用 LAMBDA 系列函数。3.3 不支持 LAMBDA 时的替代方案如果你的办公环境暂时无法升级到支持 LAMBDA 的版本有两个替代思路用 Power Query 实现数据处理流程的复用。Power Query 在 Excel 2016 之后就内置了适合做数据清洗、合并、分组等操作而且不需要写公式。用普通公式模板。把复杂公式保存成一个模板工作簿使用时复制相关区域虽然不如自定义函数方便但至少不用每次重写。4. LAMBDA 基础语法与第一个自定义函数4.1 语法结构LAMBDA 的完整语法是LAMBDA(参数1, 参数2, ..., 计算表达式)其中计算表达式用这些参数完成实际计算最后返回一个结果。举例定义一个计算两数乘积的函数LAMBDA(x, y, x * y)(3, 4)返回 12。注意这里有两层结构前半部分是函数定义后半部分必须紧跟着一组括号把实际参数传进去。如果不带末尾的调用括号Excel 无法确定这个 LAMBDA 的入参通常会显示公式文本或提示参数缺失。4.2 在单元格中临时使用 LAMBDALAMBDA 可以直接在单元格中作为一次性函数使用适合快速验证逻辑LAMBDA(a, b, a b)(10, 20)返回 30。但如果你每次都这么写显然比直接写1020还麻烦。LAMBDA 的真正价值在命名复用所以下一步是把函数定义保存到名称管理器。4.3 通过名称管理器保存为可复用函数操作步骤如下打开 Excel点击公式选项卡点击名称管理器点击新建在名称中填写函数名例如乘法在引用位置中输入以等号开头的 LAMBDA 定义LAMBDA(x, y, x * y)点击确定然后关闭名称管理器。保存之后在任何单元格中都可以这样调用乘法(3, 4)返回 12。这个乘法函数和工作簿绑定在一起关闭后重新打开文件它仍然存在。在名称管理器中名称会被归入用户定义分类。点击编辑栏左侧的 fx 按钮打开插入函数对话框在用户定义分类里就能找到你刚创建的函数。4.4 命名注意事项给 LAMBDA 取名时有几个规则要记住不能与 Excel 内置函数同名比如不能取SUM、IF名称不能以数字开头不能包含空格不能包含、$、?等特殊字符推荐用有语义的名字比如提取片段、最大值筛选、计算逾期天数更规范的做法是加统一前缀比如fn_提取片段、fn_最大值筛选便于在名称管理器中批量筛选和管理。实际工作中名称管理器里可能同时存在十几个自定义函数没有统一前缀的话混在一堆工作表名称和区域名称里维护起来很痛苦。5. 实战案例一把姓名和电话分开封装成函数5.1 业务场景这是一道非常经典的 Excel 题原始数据里某一列是张三 13800138000姓名和电话用空格或某个分隔符连在一起。现在需要把姓名和电话分别放到两个不同的列里。传统做法是用数据选项卡里的分列功能或者手工写两个公式。这两种方式都有问题分列是一次性操作数据源变化后还得再来一遍手写公式则每次都要输入一长串 MID、FIND、SUBSTITUTE 的组合可读性很差。5.2 传统写法假设 A2 是原始文本姓名和电话之间用空格分隔姓名公式LEFT(A2, FIND( , A2) - 1)电话公式MID(A2, FIND( , A2) 1, 99)这两条公式本身没问题但如果你要处理的不只是姓名电话可能是省份城市门店这种多段文本公式会迅速变得臃肿。5.3 封装为 LAMBDA我们把按分隔符取第 N 段文本这个逻辑封装成一个函数。在名称管理器中新建名称名称提取片段引用位置LAMBDA(文本, 分隔符, 第几段, TRIM(MID(SUBSTITUTE(文本, 分隔符, REPT( , 99)), (第几段 - 1) * 99 1, 99)))保存后在 B2 单元格输入提取片段(A2, , 1)返回张三。在 C2 单元格输入提取片段(A2, , 2)返回13800138000。这个公式的原理是先用SUBSTITUTE把文本中的分隔符替换成 99 个空格让每一段文本前后都充满空格然后用MID从指定位置截取 99 个字符最后用TRIM去掉多余空格得到干净的片段。5.4 功能扩展把函数封装好之后所有类似按分隔符取段的需求都可以直接复用提取片段(北京市-朝阳区-望京, -, 2)返回朝阳区。如果再配合FILTER、UNIQUE等动态数组函数你甚至可以批量提取整列数据。过去需要手工换公式的场景现在只需要一个函数名这也是 LAMBDA 提高效率最直观的体现。6. 实战案例二按多条件查找最大值6.1 业务场景很多同学在搜索Excel 函数如何找相同条件某一列最大值时会看到一堆 MAXIF 的数组公式教程。这类写法在 Excel 365 里确实可行但问题是每次遇到新数据都要重新写一遍条件公式而且多个条件组合时公式变得非常难读、难改。假设销售表有部门B 列、月份C 列、销售额D 列需求是计算某部门在某个月份中的销售额最大值。6.2 传统数组公式MAX(IF((B2:B1000华东) * (C2:C10006月), D2:D1000))注意在旧版 Excel 中这类公式必须按 CtrlShiftEnter 完成数组输入在 Excel 365 中动态数组引擎会自动处理直接回车即可。6.3 封装为 LAMBDA我们可以把这个数组公式封装成自定义函数在名称管理器中新建名称名称最大值筛选引用位置LAMBDA(条件列1, 条件值1, 条件列2, 条件值2, 数值列, MAX(IF((条件列1 条件值1) * (条件列2 条件值2), 数值列)))调用方式最大值筛选(B2:B100, 华东, C2:C100, 6月, D2:D100)返回华东地区 6 月的最高销售额。这里有两个细节值得说明第一多个条件之间用*连接表示并且的关系。(条件列1 条件值1) * (条件列2 条件值2)会生成一个由 0 和 1 组成的数组0 表示不满足1 表示满足。第二封装成 LAMBDA 后函数的意图从一长串数组公式变成了一个清晰的函数名最大值筛选。代码的可读性完全不一样了。后续如果数据范围从 B2:B100 变成 B2:B5000只需要改调用时的参数函数定义不用动。6.4 与 SUMIFS、MAXIFS 的关系看到这里你可能会问Excel 不是已经有 SUMIFS、MAXIFS 这些条件聚合函数了吗为什么还要用 LAMBDA答案是SUMIFS 和 MAXIFS 能解决条件求和、条件求最大值但当你需要取最大值对应的整行记录或者根据多个条件构造更复杂的查找结构时条件聚合函数就不够用了你需要自己组合 IF、MAX、INDEX、MATCH 等函数。LAMBDA 的价值在于把这种组合逻辑封装成一个有名字的函数以后再遇到类似问题不用重新写一遍数组公式直接调用即可。比如你想找华东地区销售额最高那一行的订单号传统写法是 INDEX MATCH MAX 的组合非常长。如果用 LAMBDA 把按条件取最大值所在行的某个字段封装好整个调用会非常简洁。7. 进阶难点递归与函数组合7.1 什么场景会用到递归递归是 LAMBDA 最吸引人也最容易踩坑的功能。简单说递归就是函数自己调用自己。Excel 公式世界里很多逐层分解的问题天然适合递归比如计算阶乘、拆解嵌套层级、遍历不规则文本等。在名称管理器中定义递归函数时函数体内部可以直接引用自身名称这不算循环引用而是合法的递归调用。只要设置好终止条件Excel 会在每次调用时先判断是否满足终止条件满足则返回结果不满足则继续向下调用。7.2 阶乘的递归实现在名称管理器中新建名称名称阶乘引用位置LAMBDA(n, IF(n 1, 1, n * 阶乘(n - 1)))保存后在任意单元格输入阶乘(5)返回 120。Excel 会这样计算阶乘(5)5 * 阶乘(4)5 * 4 * 阶乘(3)5 * 4 * 3 * 阶乘(2)5 * 4 * 3 * 2 * 阶乘(1)5 * 4 * 3 * 2 * 1 120。这里最关键的是终止条件IF(n 1, 1, ...)。如果没有这个条件函数会无限调用自己直到内存或计算资源耗尽最终返回错误。7.3 递归与 LET 结合递归函数内部如果有多步中间计算建议配合 LET 使用让每一步逻辑都有名字。例如你要设计一个把一段文本按指定字符拆分后重新拼接的函数可以在 LAMBDA 内部用 LET 定义中间结果避免重复计算。下面是一个 LET 配合 LAMBDA 的简单示例在单元格中直接运行LAMBDA(a, b, LET(总和, a b, 平均, 总和 / 2, 总和 总和 , 平均值 平均))(10, 20)返回总和30, 平均值15。这个示例展示了如何在一个 LAMBDA 定义里使用 LET 建立中间变量提高公式的可读性。7.4 配合 MAP、BYROW 等数组函数LAMBDA 还有一个重要用途作为 Excel 新增数组函数的回调函数。比如MAP可以对数组中每个元素执行同一个 LAMBDAMAP(A1:A5, LAMBDA(x, x * 2))返回 A1:A5 每个单元格数值的两倍。BYROW可以按行应用 LAMBDABYROW(C2:H10, LAMBDA(行, SUM(行)))返回每行合计。这类用法把 LAMBDA 从单个公式的自定义函数提升到了批量数据处理的计算处理器层面是 Excel 365 动态数组时代最值得投入学习的方向之一。8. 运行结果与效果验证8.1 调用结果对照假设你已经按上述步骤定义了三个自定义函数乘法、提取片段、最大值筛选。可以用下面这张表验证结果输入公式预期结果乘法(3, 4)12提取片段(北京市-朝阳区-望京, -, 2)朝阳区最大值筛选(B2:B100, 华东, C2:C100, 6月, D2:D100)华东地区 6 月最高销售额如果结果与预期一致说明自定义函数工作正常。8.2 检查名称管理器状态如果公式返回错误第一步不是重新写公式而是打开名称管理器检查两点自定义名称是否存在选中该名称在下方引用位置中查看 LAMBDA 定义是否完整、有无被意外改动。名称管理器中的 LAMBDA 定义一旦被删除工作簿里所有调用它的公式都会变成 #NAME? 错误。8.3 常见错误提示解读#NAME?函数名未找到可能名称定义被删除或
返回列表