ARTICLE · 1085921
Excel 函数教程:VSTACK+TAKE+SORT+FILTER,筛选排序后提取前 N 条数据
Excel 函数教程:VSTACK+TAKE+SORT+FILTER,筛选排序后提取前 N 条数据
业务场景 做人员统计、报表提取时,经常有这类需求:先按条件筛选数据,再按指定列排序,最后只取出前几条记录,并且带上表头。 本例需求:筛选生产部员工,按年龄升序排序,提取年龄最小的 2 个人,一次性输出完整带表头的表格。 传统做法:筛选→排序→复制前几行,一旦原始人员信息变动,整套操作要重做,维护麻烦。这套动态数组组合,一键自动完成全部步骤,源数据更新结果自动刷新。 案例公式 输入在 F1 单元格,一键溢出生成完整表格。 
逐层拆解公式 通用模板 传统方案对比 ✅ VSTACK+TAKE+SORT+FILTER 组合 ❌ 手动筛选排序复制 拓展玩法 & 避坑 取年龄最大的 2 名生产部员工 SORT 第 3 参数改为 1,降序排序。 提取最后 2 条记录(TAKE 负数用法) 报错说明 搭配 CHOOSECOLS,只保留指定列 只提取姓名、年龄,去掉部门列: 小结 这套组合的完整链路:FILTER 筛选 → SORT 排序 → TAKE 截取前 N 行 → VSTACK 拼接表头,是动态数组报表高频组合,适合提取 TOPN 数据、做简易排行榜、自动提取少量样本数据。 

01
02
=VSTACK(A1:C1, TAKE(SORT(FILTER(A2:C11,B2:B11="生产部"),3,2),2))
03
FILTER (A2:C11,B2:B11="生产部")FILTER 筛选,提取所有生产部员工的整行数据,得到生产部人员数组。SORT(...,3,2)SORT 对筛选出来的结果排序:
第 1 参数:待排序的数组(FILTER 返回的生产部清单) 第 2 参数3:按第 3 列(年龄)排序 第 3 参数2:升序排列(从小到大;写 1 代表降序)
TAKE(...,2)TAKE 截取数组,取出排序完成结果里前 2 行,也就是年龄最小的 2 位员工。VSTACK(A1:C1, ...)VSTACK 垂直拼接,把原始表头 A1:C1,拼接在截取好的数据上方,一次性输出带表头的最终表格。
04
=VSTACK(表头区域, TAKE(SORT(FILTER(数据源,筛选条件),排序列号,排序方式),提取行数))SORT 最后参数:2 = 升序,1 = 降序 TAKE 第二个参数写正数取前面 N 行,写负数可以取最后 N 行
05
优点:筛选、排序、截取、拼接表头一步完成;源数据修改自动刷新;无需辅助列,不用反复复制粘贴。 缺点:仅 Microsoft 365 / Excel2021 及更高版本支持动态数组函数。
优点:低版本 Excel 可以操作。 缺点:新增、修改、删除人员后,结果不会自动更新,每次报表都要重复操作,容易遗漏出错。
06
=VSTACK(A1:C1, TAKE(SORT(FILTER(A2:C11,B2:B11="生产部"),3,1),2))=VSTACK(A1:C1, TAKE(SORT(FILTER(A2:C11,B2:B11="生产部"),3,2),-2))#CALC!:Excel 版本不支持动态数组函数; #NO SPILL!:F1 下方单元格有内容,清空溢出区域即可。
=VSTACK({"姓名","年龄"},TAKE(SORT(CHOOSECOLS(FILTER(A2:C11,B2:B11="生产部"),{1,3}),2,2),2))07
