filter 用来按条件筛选数据,vstack 可以把多组筛选结果纵向拼接到一起。想把不同地区、不同月份、甚至不同表里的明细拼成一张新表,核心逻辑很简单:先让每一个 filter 返回的列数都一模一样,再丢给 vstack 合并就行。
本次演示用的是 Microsoft 365 版本的 Excel,拿一份订单明细表举例,我们要把华东、华南两个区域的订单单独抽出来,拼成一个新的结果表。如果你用的是 WPS 或者旧版 Excel,先确认自己的软件版本支持 FILTER 和 VSTACK 这两个函数再操作。
第一步:整理源数据和返回列
先把源数据整理成连续的整块区域,示例里的源数据范围是 A1:D9,列顺序是订单号、客户、地区、金额。后面写的每一个 FILTER,都要保证返回整整 4 列,要是有的返回 4 列有的只返回 3 列,VSTACK 合并的时候很容易错位或者直接报错。

如果源数据分散在多张工作表里,也要提前统一列名和列数。比如 1 月表和 2 月表,都按“订单号、客户、地区、金额”的顺序排列,后续写出来的公式才好维护。
第二步:先写一个 FILTER 验证条件
先在空白的结果区域输入单个 FILTER 公式:=FILTER(A2:D9,C2:C9="华东","无符合记录")。这一步只筛出华东地区的订单,用来确认你选的条件列、条件值、返回区域都没有写错。要是结果能正常自动溢出到多行,说明 FILTER 本身的写法没问题。

FILTER 的语法是 =FILTER(array, include, [if_empty])。array 是你想要返回的内容区域,include 是筛选条件,if_empty 是找不到符合条件的记录时,公式自动返回的提示内容。示例里的 C2:C9="华东" 会生成一组由 TRUE/FALSE 组成的判断结果,FILTER 只会保留 TRUE 对应的行。
第三步:用 VSTACK 叠加多个 FILTER
确认单个 FILTER 运行正常后,再把多个 FILTER 一起放进 VSTACK 里:=VSTACK(FILTER(A2:D9,C2:C9="华东"),FILTER(A2:D9,C2:C9="华南"))。第一个 FILTER 输出华东订单,第二个 FILTER 输出华南订单,VSTACK 会自动把第二组结果接在第一组结果的下面。

VSTACK 的语法是 =VSTACK(array1, [array2], ...)。它本身不做筛选,只负责纵向堆叠数组合并,所有筛选规则都写在对应的 FILTER 里面就好。后续想再加“西南”地区的订单,直接在 VSTACK 的参数里追加一段 FILTER(A2:D9,C2:C9="西南") 就行。
第四步:给空结果留处理方式
写组合公式最容易踩的坑就是某一个筛选条件找不到匹配的记录。你可以在每个 FILTER 里补上第三个参数,比如 =VSTACK(FILTER(A2:D9,C2:C9="华东","无华东记录"),FILTER(A2:D9,C2:C9="华北","无华北记录"))。这样哪怕某个地区没有订单,公式也不会直接抛出空数组错误,只会返回一行提示,你一眼就能看出来是哪一段的筛选条件没命中。

正式做报表的时候,如果不想让提示行出现在最终结果里,可以把条件列表单独放在单元格里,再用更完整的动态数组写法处理。日常办公用的话,先用 if_empty 把问题暴露出来反而更直观,等确认所有筛选条件都没问题了,再改成空白或者其他自定义提示就行。
语法和参数拆解
| 函数 | 语法 | 参数说明 |
|---|---|---|
| FILTER | =FILTER(array, include, [if_empty]) |
array 是返回区域;include 是筛选条件;if_empty 是没有符合记录时显示的内容。 |
| VSTACK | =VSTACK(array1, [array2], ...) |
array1、array2 可以是普通单元格区域,也可以是 FILTER 返回的动态数组;所有输入数组的列数最好保持一致。 |
常见错误判断方法
| 现象 | 多半原因 | 处理办法 |
|---|---|---|
#CALC! |
某个 FILTER 没有返回记录,并且没写 if_empty
|
给每个 FILTER 补上第三个参数,先排查出是哪组条件的返回结果为空。 |
#VALUE! |
VSTACK 里的数组列数不一致,或条件区域的行数和返回区域的行数不匹配 | 逐一检查每个 FILTER 的返回区域列数,确认条件列的行数和返回区域的行数完全一致。 |
#SPILL! |
结果要溢出的区域下方或者右侧已经有内容,动态数组没法完全展开 | 清空公式溢出范围内的其他内容,或者把公式挪到完全空白的区域。 |
| 结果少了标题行 | 公式只返回了数据行,没有把表头拼进去 | 可以直接写成 =VSTACK(A1:D1,FILTER(...),FILTER(...)),把标题行放在 VSTACK 的第一个参数位置。 |
扩展示例
| 需求 | 公式思路 | 适合场景 |
|---|---|---|
| 把标题行一起带出来 | =VSTACK(A1:D1,FILTER(A2:D9,C2:C9="华东"),FILTER(A2:D9,C2:C9="华南")) |
临时生成一张可以直接复制使用的明细表。 |
| 按金额筛选后合并 | =VSTACK(FILTER(A2:D9,D2:D9>1000),FILTER(A2:D9,C2:C9="华南")) |
把不同筛选规则的结果放在同一块区域统一查看。 |
| 跨工作表合并 | =VSTACK(FILTER(一月!A2:D100,一月!C2:C100="华东"),FILTER(二月!A2:D100,二月!C2:C100="华东")) |
多个月度明细表结构一致时,快速拼出汇总清单。 |
| 用单元格控制条件 | =VSTACK(FILTER(A2:D9,C2:C9=G1),FILTER(A2:D9,C2:C9=G2)) |
把地区条件单独放在 G1、G2 单元格里,后续改条件不用动公式主体。 |
这个函数组合的使用关键不是把公式写得越长越好,而是先保证每一段 FILTER 都能独立返回正确结果。单段筛选都跑通稳定后,再用 VSTACK 合并,后续排查问题会省很多事。


















