表头顺序不一致?掌握这个公式,即便是100个表合并,也轻松拿捏

封页
多表合并,是“表哥”“表姐”们经常遇到的问题,如果表头顺序完全一致,合并起来很容易。但是,对于众多的“表哥”“表姐”们而言,表头顺序不一样的多表合并,也是家常便饭。
如图所示,是全年12个月的销售数据,但是每个表的顺序并不同,要求将12个月的数据合并。

问题描述
思路拆解:
表头顺序不一致,可以用CHOOSECOLS+XMATCH组合,强制将子表的数据按照汇总表的顺序排列。共12个报表,每张表都执行一次CHOOSECOLS+XMATCH,可以使用遍历,让同样的操作重复执行12次。这是REDUCE函数最经典的用法。
第一步:获取所有子表表名
WPS中可以使用SHEETSNAME函数批量获取工作表名,Excel中没有类似的函数,需要使用CELL+TEXTAFTER函数组合获取工作表名。

获取表名1
选择第一张子表,按下Shift键不放,再鼠标左键单击最后一张子表,在空白单元格输入以下公式:
=TEXTAFTER(CELL("filename",A1),"]")
然后,在汇总表空白单元格输入以下公式:
=VSTACK('1月:12月'!J2)

获取表名2
这样,就快速地批量获取了子表的表名。
第二步:定义算法
将上一步获取的表名数组作为遍历对象,使用CHOOSECOLS+XMATCH函数组合,根据汇总表的表头来合并数据。
以第1张表为例,输入公式,验证结果。
=CHOOSECOLS(TRIMRANGE(INDIRECT(I2&"!A2:H50000")),XMATCH($A$1:$H$1,INDIRECT(I2&"!A1:H1")))
因为没法确定每个表的有效数据区域,索性将数据范围放大到5万行,外层嵌套TRIMRANGE函数自动修剪。

定义算法1
返回的结果跟查询表表头相匹配,说明可行。
需要做的是,将以上算法运用到12张表去,外面嵌套REDUCE函数,即可实现。
=REDUCE("",I2#,LAMBDA(x,y,VSTACK(x,CHOOSECOLS(TRIMRANGE(INDIRECT(y&"!A2:H50000")),XMATCH($A$1:$H$1,INDIRECT(y&"!A1:H1"))))))

定义算法2
选中REDUCE函数第二参数,按下F9,将引用转为常量数组,外层再嵌套DROP函数舍去第一行,最终公式如下:
=DROP(REDUCE("",{"1月";"2月";"3月";"4月";"5月";"6月";"7月";"8月";"9月";"10月";"11月";"12月"},LAMBDA(x,y,VSTACK(x,CHOOSECOLS(TRIMRANGE(INDIRECT(y&"!A2:H50000")),XMATCH($A$1:$H$1,INDIRECT(y&"!A1:H1")))))),1)

最终公式
这个时候,就可以将刚才构造的辅助列和辅助单元格删除了。
以上是表头不一样的跨表合并,难度不算大,但综合性偏强,多练习几遍就熟练了。如果看文章有疑惑,可以看我相关视频的实操讲解:掌握此技巧,即使100个表头都不一致,也能轻松应对跨表问题
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。
