要把excel里多个表格的数据合并到一起,用动态数组公式就能把几张结构完全相同的明细表按行纵向拼接起来。下面示例用 vstack 合并华东表和华南表,再搭配 filter 删掉预留区域里的空行,特别适合每月销售明细、门店流水、人员清单这类“表头统一、后续行数会持续新增”的场景。
当前操作软件:Microsoft Excel
软件版本:Microsoft 365,Excel 16.93
第一步
先把所有待合并的表调整成完全一致的列顺序。示例里左边放华东销售明细,右边放华南销售明细,两张表都按“日期、区域、商品、数量、金额”排列。表头对不齐的话,公式不会自动帮你匹配对应列,这一步一定要提前处理好。

第二步
找页面右侧的空白区域,手动输入汇总表的表头。示例里把汇总区设在 M1:Q1 单元格,表头同样写成“日期、区域、商品、数量、金额”。这么操作的好处是公式只会自动返回数据行,表头完全由你自己控制,后续做筛选、排序或套用表格格式的时候逻辑更清晰。

第三步
点选汇总表的第一个数据单元格 M2,输入基础合并公式 =VSTACK(A2:E4,G2:K4)。这里的 A2:E4 是第一张华东表的数据行范围,G2:K4 是第二张华南表的数据行范围,VSTACK 会按照你写的先后顺序,把两个区域的内容上下拼接起来。

第四步
要是后续源表还会继续新增记录,别只引用当前已经填了内容的3行,把引用范围预留得大一点,再用 FILTER 把多余的空行筛掉就行。示例公式是 =FILTER(VSTACK(A2:E20,G2:K20),CHOOSECOLS(VSTACK(A2:E20,G2:K20),1)<>""),逻辑很简单:先合并 A2:E20 和 G2:K20 两个大区域,再只保留第一列“日期”不为空的行。

第五步
公式算出结果后,核对下汇总区的总行数、总金额是不是和预期一致。示例里华东有3行数据、华南有3行数据,合并完汇总区应该得到6行数据;要是行数对不上,一般是你选的源区域没把新增内容包进去,或者筛选条件误把有效行排除了。

公式语法拆开看
VSTACK 的语法是 =VSTACK(array1,[array2],...),作用是把多个数组或单元格区域按行向下追加拼接。FILTER 的语法是 =FILTER(array,include,[if_empty]),用来按条件保留符合要求的行。示例中 CHOOSECOLS(VSTACK(...),1) 提取出合并结果的第 1 列,配合 <>"" 判断这一列的内容不是空白。
| 参数 | 在示例中的写法 | 作用 |
|---|---|---|
array1 |
A2:E20 |
第一张表的数据区域,不包含表头。 |
array2 |
G2:K20 |
第二张表的数据区域,列数要和第一张表一致。 |
array |
VSTACK(A2:E20,G2:K20) |
准备筛选的合并结果。 |
include |
CHOOSECOLS(...,1)<>"" |
只保留第一列不为空的记录。 |
if_empty |
可省略,也可写成 "暂无数据"
|
没有匹配记录时返回的提示。 |
版本兼容和常见错误
VSTACK、FILTER、CHOOSECOLS 都是近年新出的动态数组函数,当前示例可以直接在 Microsoft 365 版 Excel 中正常运行;如果使用 WPS 或旧版 Excel,需要先确认是否支持该函数。旧版 Excel 用不了这些函数的话,可以改用 Power Query 的“追加查询”功能,或者手动复制粘贴搭配表格引用来维护汇总表。
单元格返回 #SPILL! 报错,通常是汇总区域下方有其他内容,挡住了动态数组的溢出结果,清空 M2:Q20 这类目标区域后再重试就行。遇到 #VALUE! 报错,重点检查所有待合并区域的列数是否一致,比如 A2:E20 是 5 列,第二张表也必须是 5 列。遇到 #NAME? 报错,多半是当前软件版本不识别函数名,先核对 Excel 版本,再考虑用 Power Query 的替代方案。
扩展示例
需要合并三张表时,直接把第三张表的区域写到 VSTACK 参数后面即可:=VSTACK(A2:E20,G2:K20,A25:E40)。如果只想保留金额大于 300 的记录,可以把筛选条件改成对应第5列(金额列)大于300:=FILTER(VSTACK(A2:E20,G2:K20),CHOOSECOLS(VSTACK(A2:E20,G2:K20),5)>300)。如果希望没有符合条件的数据时不显示报错,直接补全 FILTER 的第三个参数就行:=FILTER(VSTACK(A2:E20,G2:K20),CHOOSECOLS(VSTACK(A2:E20,G2:K20),1)<>"","暂无数据")。


















