还在手动把公式拖拽到几百行?还在为数据增加后公式范围不够用而头疼?动态数组来了之后,这些事可以省一省了。
动态数组的核心机制很简单:一个公式,一次回车,结果自动“溢出”到相邻单元格。数据源变了,结果自动跟着变。再也没有Ctrl+Shift+Enter,没有下拉填充。今天把几个最常用的动态数组函数过一遍。
一、基础四件套:UNIQUE、SORT、FILTER、SEQUENCE
这四个函数是动态数组的入门标配,也是日常工作中用到最多的。
UNIQUE —— 提取不重复值
=UNIQUE(A2:A100)
一键提取A列所有不重复值,自动溢出到下方单元格。不用辅助列,不用数组三键,不用去重按钮。
进阶用法:提取多列组合的唯一值
=UNIQUE(A2:B100)
返回A列和B列组合后的唯一行。
SORT / SORTBY —— 动态排序
=SORT(A2:C100, 3, -1)
对A2:C100按第3列降序排序-33。数据更新,排序结果自动刷新。
SORTBY更灵活——按另一个区域排序:
=SORTBY(A2:C100, B2:B100, 1, C2:C100, -1)
先按B列升序,同值再按C列降序。
FILTER —— 条件筛选
=FILTER(A2:C100, C2:C100>10000, "无记录")
筛选出C列大于10000的所有行。第三个参数是“没找到时显示什么”,可以不加。
多条件筛选:
=FILTER(A2:C100, (B2:B100="销售部")*(C2:C100>5000))
筛选销售部且工资大于5000的记录。
SEQUENCE —— 生成序列
=SEQUENCE(10) // 生成1到10的垂直序列 =SEQUENCE(5, 3) // 生成5行3列的序列 =SEQUENCE(10, 1, 0, 2) // 从0开始步长2:0,2,4,6...
生成连续数字序列,常用于构造辅助数组。
组合使用:把三个函数套在一起
=SORT(UNIQUE(FILTER(A2:A100, B2:B100="已完成")))
筛选“已完成”的项目名称→去重→按字母排序-。
二、数组操作:VSTACK、HSTACK、CHOOSECOLS、TAKE、DROP
处理多区域数据时,这几个函数能把零散数据拼成一张完整的表。
VSTACK —— 纵向堆叠
=VSTACK(A2:C10, A15:C20)
把两个区域上下拼接成一个数组-。常用于合并多个月份/部门的数据。
HSTACK —— 横向拼接
=HSTACK(A2:A10, D2:D10)
把两列左右拼接-。常用于把不同来源的列合并到一起。
CHOOSECOLS —— 按需取列
=CHOOSECOLS(A2:F100, 1, 3, 5)
只取第1、3、5列,其他扔掉-33。数据透视前的“瘦身”利器。
TAKE / DROP —— 掐头去尾
=TAKE(A2:C100, 5) // 取前5行 =DROP(A2:C100, 5) // 去掉前5行
TAKE保留指定数量的行/列,DROP删除指定数量的行/列-。常用于去掉标题行或只取最新N条记录。
三、高级迭代:SCAN、REDUCE、MAKEARRAY
SCAN —— 带“记忆”的遍历
合并单元格填充是SCAN的经典场景:
=SCAN("", B2:B9, LAMBDA(a, b, IF(b="", a, b)))遍历B2:B9,遇到空单元格就用上一个非空值填充。一次性把合并单元格补全。
REDUCE —— 归约计算
把数组“折叠”成一个值:
=REDUCE(0, A2:A100, LAMBDA(a, b, a+b))
遍历A2:A100,把每个值累加到初始值0上。相当于自己写了一个SUM。
MAKEARRAY —— 按规则生成矩阵
=MAKEARRAY(5, 3, LAMBDA(r, c, r*10+c))
生成5行3列,每个单元格的值由行号和列号计算得出-。需要自定义矩阵时非常灵活。
四、行/列遍历:BYROW、BYCOL
BYROW —— 逐行处理
=BYROW(E2:G100, SUM)
对每一行求和,返回每行的合计-。用LAMBDA做更复杂的行内计算:
=BYROW(B2:D100, LAMBDA(row, MAX(row)-MIN(row)))
每行最大值减最小值。
BYCOL —— 逐列处理
=BYCOL(B2:F100, SUM)
对每一列求和。
五、函数版透视表:GROUPBY、PIVOTBY
这两个函数是2026年Excel的重磅更新,被称为“函数版数据透视表”。
GROUPBY —— 分组汇总
=GROUPBY(A2:A100, C2:C100, SUM)
按A列分组,对C列求和-。数据更新,结果自动刷新——透视表还得手动点刷新,它不用。
PIVOTBY —— 分组+交叉汇总
=PIVOTBY(A2:A100, B2:B100, C2:C100, SUM)
A列做行标签,B列做列标签,C列求和。一个公式生成完整的交叉汇总表。
六、一个必须掌握的技巧:# 溢出引用
动态数组返回的结果是一个“溢出范围”。如果想在其他公式中引用这个范围,在源单元格后面加#就行。
假设A1输入了=UNIQUE(B2:B100),结果溢出了A1:A20。想对结果求和:
=SUM(A1#)
无论溢出范围是10行还是100行,SUM都会自动覆盖全部-。配合FILTER、SORT用尤其顺手。
七、常见错误与避坑
- #SPILL!错误:溢出区域被其他内容挡住了。把挡住的东西移开就行。
- 公式放在表格(Table)内部:动态数组公式不能放在Excel表格的单元格里,必须在表格外部写。
- #VALUE!或#CALC!:LAMBDA里的参数写错了,检查一下参数个数和引用范围。
动态数组带来的最大改变是思维方式的转变——从一个格子一个格子地填公式,变成用一个公式描述一整片区域的逻辑-。数据变了,结果自动变;数据多了,结果自动扩。不用维护公式范围,不用手动更新报表-。这六个类别的函数基本覆盖了日常工作的大部分场景,剩下的就是遇到具体问题时,想想“哪个函数能帮我一次搞定”。

