Excel高效动态函数,你知道几个?
- 2026-11-09 16:55:17
一个公式只能返回一个值?
一个公式,能返回
一整片区域
动态数组 · XLOOKUP · GROUPBY · 文本与正则 · LET
MODERN EXCEL
📦 7 Parts + Conclusion
👉 滑动
PART 01
三个前提
版本与溢出
PART 02
场景一 XLOOKUP
换掉 VLOOKUP
PART 03
场景二 筛选去重
FILTER·SORT
PART 04
场景三 分组汇总
GROUPBY·PIVOTBY
PART 05
场景四 文本正则
TEXTSPLIT·REGEX
PART 06
场景五 LET
长公式收拾干净
PART 07
六个坑
避坑清单
PART ///
写在最后
收尾
现代 Excel 真正的分水岭不是会不会透视表
而是有没有开始用「返回一片区域」的公式
01
PART
三个前提
BASICS · 版本与溢出
第一个前提:动态数组就是「一个公式返回一片区域」。写完按回车,结果会自动溢出到右边和下面的空白格,整片区域是一个整体,要改只改左上角那一格。这是它和传统公式最根本的区别,也是后面所有写法的前提。
第二个前提:它有版本门槛,而且门槛不止一道。动态数组需要 Microsoft 365 或 Excel 2021 及以上;而 2024 年底才正式推出的 GROUPBY、PIVOTBY 与正则函数族(REGEXTEST、REGEXEXTRACT、REGEXREPLACE),目前在 Excel 2019 / 2021 永久版里写下去会直接返回 #NAME?。先看清自己手里是哪个版本,再决定用哪一套写法。
第三个前提:溢出区域必须是空的。公式要往右往下铺开的那几格不能有任何内容,否则整条公式报 #SPILL!。这个报错会框出被挡住的位置,属于第一天上手最容易撞上、也最容易解决的一类问题。
02
PART
场景一:查找匹配,XLOOKUP 换掉 VLOOKUP
SCENARIO 01 · XLOOKUP
XLOOKUP 的四个参数依次是:找什么、在哪一列找、返回哪一列的结果、找不到时返回什么。
=XLOOKUP(A2, 产品表[编号], 产品表[单价], "未找到")
=XLOOKUP(A2, 产品表[编号], 产品表[名称]:产品表[单价])
三个实质性改进:可以向左查,不用再靠辅助列把查找列挪到最左边;默认就是精确匹配,不用每次在末尾补一个 0;第四个参数是「找不到时返回什么」,写个「未找到」远比一片 #N/A 友好。第二个例子里返回的是两列构成的一片区域,结果会一起溢出,一次取回整行。
03
PART
场景二:筛选、去重、排序,一步出结果
SCENARIO 02 · FILTER
=FILTER(A2:D100, C2:C100="华东", "无记录")
=SORT(UNIQUE(B2:B100))
=SORT(FILTER(A2:D100, C2:C100="华东"), 4, -1)
FILTER 的第二个参数是条件、第三个参数是「一条都没筛到时显示什么」,不写第三个参数,空结果会返回 #CALC!,很多人以为公式写错了。三个函数可以逐层嵌套:先筛、再去重、最后按第四列降序排,整条流水线仍然只是一个公式,源数据一改结果立刻跟着变。
04
PART
场景三:一个公式做出透视表(GROUPBY / PIVOTBY)
SCENARIO 03 · 分组汇总
这是近几年最值得练的一组新函数,现已正式可用:
=GROUPBY(销售表[地区], 销售表[金额], SUM)
=PIVOTBY(销售表[地区], YEAR(销售表[日期]), 销售表[金额], SUM)
=VSTACK({"地区","合计"}, GROUPBY(销售表[地区], 销售表[金额], SUM))
GROUPBY 做单轴汇总,PIVOTBY 再加上第二个轴,等于用公式搭出一个轻量透视表。相比传统透视表,它永远不过期、不需要手动刷新、可以直接喂给图表。代价是结果是公式而不是对象,没法拖字段,所以它适合那种「每周都要重出一遍」的固定报表;需要临时探索数据时,透视表依然更顺手。
第三个参数除了 SUM,还能传自定义的 LAMBDA,比如取中位数、算加权平均——这一点透视表做不到。第三个例子顺手用 VSTACK 给结果加了一行表头。
05
PART
场景四:文本拆分与正则(TEXTSPLIT / REGEXEXTRACT)
SCENARIO 04 · 文本与正则
=TEXTSPLIT(A2, "-")
=REGEXEXTRACT(A2, "\d{11}")
=REGEXREPLACE(A2, "[^\d]", "")
TEXTSPLIT 按分隔符把一个单元格拆成多格,替代了老一套「分列 + 辅助列 + 手工拼回」。正则三件套则把「取出手机号」「删掉所有非数字字符」这类清洗动作压成一条公式——以前这些要么靠一长串 MID 与 FIND 嵌套,要么得开 Power Query。它们同样只在 Microsoft 365 与网页版可用,永久版用户请直接用 Power Query 替代。
06
PART
场景五:把长公式收拾干净(LET / LAMBDA)
SCENARIO 05 · LET
=LET(区域, C2:C100, 目标, "华东",
满足, FILTER(A2:D100, 区域=目标, "无记录"),
SORT(满足, 4, -1))
LET 让你给中间结果起名字,公式从「一坨嵌套」变成「几行有名字的步骤」,读和改都轻松很多,而且同一段计算被引用两次时只算一次。LAMBDA 更进一步,能把公式存成自定义函数,在整个工作簿里像内置函数一样反复调用。
07
PART
六个常见的坑
PITFALLS · 避坑清单
!#SPILL! 溢出区域被挡 🕳
#SPILL! 溢出区域被挡。右侧或下方任意一格有内容(哪怕只是一个空格)都会触发,报错会框出冲突范围,清掉即可。
!引用整列会让溢出区域过大 🕳
引用整列会让溢出区域过大。C:C 这类整列引用在动态数组里很容易撑出几十万行,公式变慢甚至溢出失败,应该改用表格结构化引用或限定到实际范围。
!永久版没有 GROUPBY、PIVOTBY 和正则函 🕳
永久版没有 GROUPBY、PIVOTBY 和正则函数。写下去不是语法报错,而是直接返回 #NAME?,看着像把函数名拼错了,其实是版本不支持。
!XLOOKUP 不写第四参数会返回 #N/A 🕳
XLOOKUP 不写第四参数会返回 #N/A。这不是函数坏了,是它老实告诉你没找到,把默认值补上就好。
!FILTER 筛不到东西会返回 #CALC! 🕳
FILTER 筛不到东西会返回 #CALC!。必须给第三个参数,否则空结果看起来就像公式出错。
!溢出区域不能逐格删 🕳
溢出区域不能逐格删。选中整片区域一起删;只删左上角会让公式报错,在溢出区域内插入列还会直接破坏公式。
另有一条 2026 年的新情况值得留意:2026 年 4 月起,Excel 的 Copilot 增加了「聊天 / 编辑」模式切换,编辑模式下它会直接改写你的工作簿,改动会高亮显示、被改动的工作表标签会变绿,而符合条件的用户默认就是开启编辑权限的。所以真实报表上建议先用聊天模式让它解释、给建议,确认无误再切到编辑模式动手。
///
LAST
写在最后
SUMMARY · 一句话收尾
这套写法真正改变的不是公式的长短,而是「数据一变就要重做一遍」这件事——过去每来一批新数据就得重做辅助列、重刷透视表,现在源数据一改,结果自己就跟上了。建议先从 XLOOKUP 和 FILTER 这两个换起,用顺了再上 GROUPBY 与 LET,不必一次全换。
如果这篇内容对你有帮助,欢迎点赞、在看、转发三连,我们下篇见。既然看到这里了,如果觉得有用,随手点个赞、在看、转发三连吧。
THANKS FOR READING