智算多多



别再嘲笑 Excel 是“表哥表姐”的专属工具了。当别人用FILTER三秒完成数据筛选,用GROUPBY一键生成汇总报表,而你还在手忙脚乱地拖拽数据透视表、编写一长串VLOOKUP嵌套公式时,效率的鸿沟已悄然划下。
这不是危言耸听。微软Office 365和WPS近年新增的这30多个新函数,正在彻底重塑数据处理的工作流。
它们的核心优势在于动态数组和直指问题本质的设计逻辑。一个公式,结果自动填满一片区域;一个函数,解决过去需要多个步骤的复杂问题。
今天,我为你系统梳理出27个经过实战检验的“YYDS”级新函数公式。这不仅仅是一个“收藏清单”,更是一份让你在效率竞赛中保持领先的生存指南。准备好,我们开始“升级”。
过去,提取不重复值和计数是数据清洗的常见痛点,需要借助“删除重复项”功能或复杂的数组公式。现在,一切都变得极为优雅。
=UNIQUE(数据区域)
实战场景:A列是包含上千条重复记录的客户名单。将此公式输入任一单元格,比如B1,按下回车,所有不重复的客户名瞬间向下“溢出”填满,无需任何拖动或菜单操作。
=COUNTA(UNIQUE(数据区域))
实战场景:快速统计销售表中到底有多少个不同的产品SKU。=COUNTA(UNIQUE(B2:B1000)),直接得出数字。这是数据透视表“值计数”的公式解法,速度快到无需等待。
如何提取出现次数大于1的重复值?用一个组合公式即可破解:
=UNIQUE(FILTER(A:A, COUNTIF(A:A, A:A)>1))这个公式先用COUNTIF判断哪些是重复的,再用FILTER筛出来,最后UNIQUE去重,一步到位。
文本拼接与分列是Excel中的高频操作。新函数让这些工作从“体力活”变成了“智能活”。
=CONCAT(区域)
核心价值:彻底取代复杂的&连接符。=CONCAT(A1:A5),无论区域中有多少内容,直接合并成一个字符串。
=TEXTJOIN(分隔符, 是否忽略空单元格, 区域1, [区域2], ...)
实战场景:生成邮件列表、产品编码。=TEXTJOIN("; ", TRUE, B2:B100),将B列的所有非空内容用“; ”连接,第二个参数TRUE能自动跳过空白格,这是&符无法实现的智能。
=TEXTSPLIT(文本, 列分隔符, 行分隔符, [是否忽略空], [填充值])
这是一个革命性的函数,其灵活性超乎想象:
=TEXTSPLIT(A1, "-") 将“A-B-C”拆成横向三列。=TEXTSPLIT(A1, , "-") 将“A-B-C”拆成竖向三行。=TEXTSPLIT(A1, ",", "-") 可将“苹果,香蕉-橙子,葡萄”按逗号分列、减号分行,直接生成二维表格。 =TEXTBEFORE(文本, 分隔符, [实例编号], [匹配模式], [未找到时返回值])
=TEXTAFTER(文本, 分隔符, [实例编号], [匹配模式], [未找到时返回值])
实战场景:处理不规范但有一定规律的字符串,如“姓名-部门-工号-入职日期”。
=TEXTAFTER(A1, "-", 2) 表示取第二个“-”之后的内容。=TEXTBEFORE(TEXTAFTER(A1, "-"), "-") 嵌套使用,先取第一个“-”之后,再取其中的第一个“-”之前。用TEXTSPLIT批量清洗数据。例如,清除字符串中所有数字:
=LET(t, TEXTSPLIT(A1, SEQUENCE(10, ,0)), CONCAT(t))这里用SEQUENCE生成0-9的数组作为分隔符,TEXTSPLIT按每个数字拆分文本,拆出一堆片段,再用CONCAT将非数字的片段合并回去,实现纯文本提取。
想象你的数据表是一块面团,新函数就是最锋利的刀,想怎么切就怎么切。
=TAKE(数据区域, 行数, [列数]) // 正数取前N,负数取后N
=DROP(数据区域, 行数, [列数]) // 正数丢前N,负数丢后N
实战场景:
=TAKE(A:G, 10) 取前10行。=DROP(数据!A:G, -1) 丢弃最后一行。=TAKE(DROP(原数据, 1, 1), 20, 5) 先去标题行和首列,再取20行5列,快速创建一个干净的样本数据集。 =CHOOSECOLS(数据区域, 列索引1, [列索引2], ...)
=CHOOSEROWS(数据区域, 行索引1, [行索引2], ...)
实战场景:从20列的原始数据中,只提取你需要的第1, 4, 7, 9列。=CHOOSECOLS(A:T, 1, 4, 7, 9),顺序还可以自定义,比如(9,1,4,7)。
=WRAPROWS(一维数组, 每行多少列, [不足时填充值])
=WRAPCOLS(一维数组, 每列多少行, [不足时填充值])
实战场景:
=WRAPROWS(A1:A100, 5, "") 将100个名字排成5列,自动生成20行,最后一格不足用空值填充。=WRAPCOLS(SEQUENCE(12), 3) 将1-12的数字,每3个为一组排成一列,共4行3列,这是制作季度报表数据的绝佳起点。面对多表合并和复杂筛选,你不再需要手动复制粘贴或编写令人头疼的数组公式。
=VSTACK(数组1, [数组2], ...) // 上下堆叠
=HSTACK(数组1, [数组2], ...) // 左右拼接
实战场景:
=VSTACK(1月!A2:G100, 2月!A2:G100, …, 12月!A2:G100)。更强大的是,如果12个工作表名称连续,可以用=VSTACK(1月:12月!A2:G100)一句搞定。=VSTACK(销售数据, {"总计", SUM(销售额区域)}) 在数据下方添加一行总计。{}内是手工输入的数组。 =FILTER(要返回的数组, 条件1, [条件2], ... , [无结果时返回值])
这是新函数中的“王牌”。它返回的是动态数组,源数据一改,结果自动变。
=FILTER(A2:F100, (C2:C100="销售部")*(D2:D100>10000), "无符合条件记录") 筛选销售部且销售额大于1万的记录。*表示“且”。=FILTER(A2:F100, (C2:C100="北京")+(C2:C100="上海"), "") 筛选北京或上海的记录。+表示“或”。 =SORT(数组, [排序列], [升序1], ...) // 按列索引排
=SORTBY(数组, 排序列1, [升序1], ...) // 按指定列区域排
实战场景:
=SORT(A2:G100, 3, -1) 按第3列(金额)降序(-1)排列。=SORTBY(A2:G100, C2:C100, -1, B2:B100, 1) 先按部门(C列)降序,部门相同的再按姓名(B列)升序排。SORTBY更直观。 =GROUPBY(分组列, 值列, 汇总函数, [总计模式], [筛选数组])
(此函数目前仅在部分Beta版本可用,但代表了未来方向)
它像一句SQL查询语言。=GROUPBY(A2:A100, B2:B100, SUM, 3) 对A列分组,对B列求和,参数3表示包含行列总计。一键生成分组汇总表。
=SEQUENCE(行数, [列数], [开始数], [步长])
实战场景:
=SEQUENCE(100) 生成1-100的垂直序列。=SEQUENCE(6, 7, DATE(2023,10,1)-WEEKDAY(DATE(2023,10,1),2)+1, 1) 可以生成一个以指定日期所在周为起点的6行7列日期矩阵,是制作动态日历的核心。=SEQUENCE(, 10, 0, 100) 生成一个1行10列,从0开始,步长为100的数组:{0,100,200…900}。单个函数是利器,组合使用方能成绝招。
心法一:用LET函数命名中间变量,让复杂公式可读
处理复杂文本时,可以这样写:
=LET(原始文本, A1, 分割后数组, TEXTSPLIT(原始文本, {"-", "_"}), 清理后文本, CONCAT(分割后数组), 清理后文本)这样,公式逻辑层次一目了然,易于调试和修改。
心法二:动态引用整个“溢出区域”
新函数的结果是一个动态数组(#标识的区域)。在另一个公式中引用这个结果时,直接引用其左上角的单元格即可,Excel会自动识别整个范围。例如:
=SUM(UNIQUE(FILTER(销售额, 部门="A")))// 对动态筛选+去重后的结果直接求和
心法三:拥抱错误处理
新函数组合容易产生#N/A等错误。用IFERROR包装:
=IFERROR(INDEX(TEXTSPLIT(A1, "-"), 5), "无此分段")
这是新函数的基石。你只需在一个单元格输入公式,结果会自动填充到相邻的空白单元格区域。这个区域是一个整体,无法单独编辑其中一格,被称为“溢出区域”。务必确保公式下方和右方有足够的空白单元格,否则会返回#SPILL!错误。
















学习完毕,不妨用三道题检验一下你的理解程度。答案藏在文末。
=UNIQUE(MID(A2:A1000, 4, 8))=UNIQUE(TEXTAFTER(TEXTBEFORE(A2:A1000, "-", 2), "-"))=FILTER(Data, (Data[地区]="华东")*(Data[销售员]="张三")*(MONTH(Data[日期])=4)*(Data[销售额]>5000))=SORT(FILTER(Data, (Data[地区]="华东")*(Data[销售员]="张三")*(TEXT(Data[日期],"yyyymm")="202304")*(Data[销售额]>5000)), 5, -1)=SORTBY(FILTER(Data, (Data[地区]="华东")*(Data[销售员]="张三")*(Data[日期]>=DATE(2023,4,1))*(Data[日期]<=DATE(2023,4,30))*(Data[销售额]>5000)), Data[销售额], -1)1. B。TEXTBEFORE取第二个“-”之前的部分(“SH-20230405”),再用TEXTAFTER取第一个“-”之后的部分(“20230405”),最后用UNIQUE去重。A选项假设了所有订单号长度一致,不严谨。C和D是传统方法,不够“高效”。
2. D。这是最规范、可读性最高的写法。FILTER部分用多个*连接“且”条件,其中日期范围用>=和<=两个条件构造,比用TEXT或MONTH更灵活通用。外层用SORTBY按“销售额”列(显式引用)降序排序。B选项使用TEXT函数处理日期也可以,但SORT的第三个参数是列索引,不如SORTBY直观。A缺少排序。C是传统方法。
3. A。TEXTSPLIT函数允许在第二个参数中,以常量数组形式(如{"-", "_", " "})指定多个分隔符,这是处理这种混乱数据的完美解决方案。B理论上可行但公式冗长。C是传统GUI操作,无法用公式动态实现。D是旧函数的思路,多了一步。