FILTER、UNIQUE、SORT、SEQUENCE:Excel 365/2021 动态数组

适用场景

想从明细表里筛出某个地区的数据,结果自动更新;想生成去重名单、按金额排序、取前 10 名;想把多张结构相同的表纵向合并。动态数组让一个公式返回一片区域,结果会自动“溢出”到相邻单元格,不用再按 Ctrl+Shift+Enter。

动态数组在 Microsoft 365 和 Excel 2021 中可用;Excel 2019/2016 没有这些函数,打开文件会看到 _xlfn. 前缀或 #NAME?。

溢出与引用

常用函数

函数 作用 示例
FILTER 按条件筛选 =FILTER(A2:D100,C2:C100="华东","无结果")
UNIQUE 去重 =UNIQUE(A2:A100)
SORT 排序 =SORT(A2:D100,4,-1)
SORTBY 按另一列排序 =SORTBY(A2:A100,D2:D100,-1)
SEQUENCE 生成序列 =SEQUENCE(10,1,1,1)
RANDARRAY 生成随机数组 =RANDARRAY(5,2,1,100,TRUE)
CHOOSECOLS 选列 =CHOOSECOLS(A2:D100,1,4)
CHOOSEROWS 选行 =CHOOSEROWS(A2:D100,1,3,5)
TAKE 取前/后 N 行 =TAKE(A2:D100,5)
DROP 去掉前/后 N 行 =DROP(A2:D100,1)
VSTACK 纵向堆叠 =VSTACK(表1,表2)
HSTACK 横向拼接 =HSTACK(A2:B10,D2:E10)
TOCOL 多列转一列 =TOCOL(A2:C10,1)
TOROW 多行转一行 =TOROW(A2:C10,1)

FILTER 示例

假设 A 列地区、B 列产品、C 列金额、D 列日期:

筛选华东的全部列
=FILTER(A2:D100,A2:A100="华东","无结果")

筛选华东且金额大于 10000
=FILTER(A2:D100,(A2:A100="华东")*(C2:C100>10000),"无结果")

筛选华东或华南
=FILTER(A2:D100,(A2:A100="华东")+(A2:A100="华南"),"无结果")

只返回产品列
=FILTER(B2:B100,A2:A100="华东","无结果")

条件之间用 * 表示“且”,用 + 表示“或”。乘除运算优先级高于比较运算,条件要加括号。

UNIQUE 与 SORT

去重名单
=UNIQUE(A2:A100)

只保留出现一次的值
=UNIQUE(A2:A100,FALSE,TRUE)

按金额降序排序
=SORT(A2:D100,4,-1)

先筛选再排序
=SORT(FILTER(A2:D100,A2:A100="华东"),4,-1)

取销售额前 5 名
=TAKE(SORT(FILTER(A2:D100,A2:A100="华东"),4,-1),5)

按另一列的顺序排序
=SORTBY(A2:A100,C2:C100,-1)

SORT 的第二个参数是排序依据的列号(相对数组),第三个参数 1 升序、-1 降序。UNIQUE 默认把空白当成一个值,需要排除空白时先 FILTER(A2:A100,A2:A100<>"")。

合并多表

纵向合并两张结构相同的表
=VSTACK(Sheet1!A2:D100,Sheet2!A2:D100)

横向拼接
=HSTACK(A2:B10,D2:E10)

多列转一列,忽略空白
=TOCOL(A2:C10,1)

VSTACK 要求各表列数一致;列数不同时,缺少的单元格会补 #N/A。先统一列顺序和列数,再合并。

易错点

相关条目

参考链接

读完自测

合上页面,先回答,再展开对照。

  1. #SPILL! 通常是什么原因?
  2. FILTER 的条件里,* 和 + 分别代表什么?
  3. 为什么动态数组公式不能放在 Excel 表格的 calculated column 里?
答案
  1. 溢出区域被其他内容、合并单元格、表格或另一张溢出结果挡住。
  2. * 表示“且”,+ 表示“或”;条件要加括号。
  3. 表格的 calculated column 要求每行返回单值,动态数组会返回一片区域,容易 #SPILL!。
微信小程序码:扫码打开命令速查小程序

小程序版

微信扫码,随时查命令