传统数据合并的局限:
多表纵向合并 | 复制粘贴易错 | 单公式一键堆叠 |
多列横向拼接 | 需逐列插入 | 动态数组自动扩展 |
数据源更新 | 需重新合并 | 公式驱动自动刷新 |
合并时筛选 | 需要辅助列 | 嵌套FILTER一步到位 |
不同列数合并 | 对齐困难 | 自动填充#N/A占位 |
告别复制粘贴,用单公式实现多区域数据智能合并,动态响应源数据变化!
=VSTACK(array1,[array2],...)功能:将多个数组按行方向上下堆叠成一个数组。要求:所有数组的列数必须相同(列数不同时自动填充N/A)。
=HSTACK(array1,[array2],...)功能:将多个数组按列方向左右拼接成一个数组。要求:所有数组的行数必须相同(行数不同时自动填充N/A)。

//合并三个季度的销售数据=VSTACK( Q1!A2:D100,Q2!A2:D100,Q3!A2:D100)效果:
//将姓名、部门、工资三列合并到一行= HSTACK(A2:A10,B2:B10,C2:C10)//表1有3列,表2有4列=VSTACK(表1!A2:C10,表2!A2:D10)//结果:表1部分第4列显示N/A解决方案:使用IFERROR或CHOOSECOLS统一列数
=VSTACK(CHOOSECOLS(表1!A2:C10,1,2,3,NA()),表2!A2:D10)//合并多个地区的大额订单=VSTACK(FILTER(华北!A2:E1000,华北!E2:E1000>10000),FILTER(华东!A2:E1000,华东!E2:E1000>10000),FILTER(华南!A2:E1000,华南!E2:E1000>10000))//添加标题行并合并数据=VSTACK({"日期","产品","销售额"},FILTER(数据表,数据表[销售额]>0))//使用名称管理器定义动态区域名称://华北数据引用:=OFFSET(华北!$A$1,0,0,COUNTA(华北!$A:$A),4)//华东数据引用:=OFFSET(华东!$A$1,0,0,COUNTA(华东!$A:$A),4)=VSTACK(华北数据,华东数据)= UNIQUE(VSTACK(表1,表2,表3))=SORT( VSTACK(表1,表2,表3),2,-1)//按第2列降序
需求:汇总1-6月销售数据,并计算总销售额
=LET(合并数据,VSTACK(一月!A2:C100,二月!A2:C100,三月!A2:C100,四月!A2:C100,五月!A2:C100,六月!A2:C100),总销售额,SUM(INDEX(合并数据,3)),"总销售额: "&TEXT(总销售额,"#,##0"))需求:合并人事、财务、技术三部门名单,去重后排序
=SORT(UNIQUE(VSTACK(人事部!A2:B100, 财务部!A2:B100, 技术部!A2:B100)),1//按姓名排序)
需求:将预算与实际数据并排对比
= HSTACK({"项目","预算","实际","差异"},VSTACK(项目列表,预算数据,实际数据,预算数据-实际数据))//需转置处理,此处为示意需求:从多个质检表中提取不良品记录
=VSTACK(FILTER(质检1!A2:G1000,质检1!F2:F1000="不良"),FILTER(质检2!A2:G1000,质检2!F2:F1000="不良"),FILTER(质检3!A2:G1000,质检3!F2:F1000="不良"))//自动补足列数较少的表=LET(max_cols,MAX(COLUMNS(表1),COLUMNS(表2)),pad_array,LAMBDA(arr,IF(COLUMNS(arr)<max_cols,HSTACK(arr,MAKEARRAY(ROWS(arr),max_cols-COLUMNS(arr),LAMBDA(r,c,NA()))),arr)),VSTACK(pad_array(表1),pad_array(表2)))//在每张表之间插入空白分隔行=VSTACK(表1,{"","",""},//空白分隔行(列数与表1一致)表2,{"","",""},表3)//只合并符合条件的表=LET(tables,{"销售表","库存表","采购表"},filter_tables,FILTER(tables,条件判断),REDUCE(表头,filter_tables,LAMBDA(acc,t,VSTACK(acc,INDIRECT(t&"!A2:E100")))))//合并后按产品分组求和=LET(合并数据,VSTACK(表1,表2,表3),GROUPBY(INDEX(合并数据,1), INDEX(合并数据,3),SUM))限制引用范围:避免整列引用(A:A → A2:A10000)
预筛选:先FILTER再VSTACK
使用LET缓存:避免重复计算
//低效=UNIQUE(VSTACK(表1,表2))=SORT(VSTACK(表1,表2))//高效=LET(combined,VSTACK(表1,表2),SORT(UNIQUE(combined)))问题:表1(3列)+表2(4列)=第4列出现N/A=VSTACK(表1!A2:C10, 表2!A2:D10)解决方案1:统一列数=VSTACK(CHOOSECOLS(表1!A2:C10,1,2,3,NA()),表2!A2:D10)解决方案2:只取公共列=VSTACK(CHOOSECOLS(表1!A2:C10,1,2),CHOOSECOLS(表2!A2:D10,1,2))问题:表1(100行) + 表2(80行)=多出的行显示N/A=HSTACK(表1!A2:A101,表2!B2:B81)解决方案:先统一行数=LET(max_rows,MAX(ROWS(表1!A2:A101),ROWS(表2!B2:B81)),pad_array,LAMBDA(arr,VSTACK(arr,MAKEARRAY(max_rows-ROWS(arr),1,LAMBDA(r,c,"")))),HSTACK(pad_array(表1!A2:A101),pad_array(表2!B2:B81)))问题:每张表都有标题行,合并后标题重复=VSTACK(表1!A2:C10,表2!A2:C10)//标题行出现两次解决方案:单独添加标题=VSTACK({"产品","销量","金额"},FILTER(表1!A2:C100,表1!A2:A100<>""),FILTER(表2!A2:C100,表2!A2:A100<>""))问题:表1金额为数字,表2金额为文本=VSTACK(表1!A2:C10,表2!A2:C10)//文本列导致计算错误解决方案:统一数据类型=VSTACK(表1!A2:C10,HSTACK(表2!A2:A10,表2!B2:B10,VALUE(表2!C2:C10)))//合并各子公司损益表=VSTACK(子公司A!A2:F100,子公司B!A2:F100,子公司C!A2:F100)//配合GROUPBY进行汇总//合并各部门培训记录= SORT(UNIQUE(VSTACK(销售部培训,技术部培训,行政部培训)),1// 按日期排序)//合并多个仓库的库存预警=VSTACK(FILTER(仓库1!A2:E1000,仓库1!E2:E1000<安全库存),FILTER(仓库2!A2:E1000,仓库2!E2:E1000<安全库存),FILTER(仓库3!A2:E1000,仓库3!E2:E1000<安全库存))//合并多期调研问卷结果=LET(Q1,问卷1!A2:J500,Q2,问卷2!A2:J450,Q3,问卷3!A2:J480,all_data,VSTACK(Q1,Q2,Q3),FILTER(all_data,INDEX(all_data,,5)="满意"))核心公式:
=VSTACK(区域1,区域2, ...)//上下堆叠=HSTACK(区域1,区域2, ...)//左右拼接最佳搭档:
UNIQUE:合并后去重
SORT:合并后排序
FILTER:合并前筛选
CHOOSECOLS:统一列数
适用场景对比:
工作流示意:

终极验证
=LET( table1, {"A",1;"B",2},table2
,{"C",3;"D",4},combined,VSTACK
(table1, table2),"合并后行数:"
&ROWS(combined)&"列数:"
&COLUMNS(combined))
输出:合并后行数:4 列数:2
//VSTACK成功堆叠!