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

  封页

  多表合并,是“表哥”“表姐”们经常遇到的问题,如果表头顺序完全一致,合并起来很容易。但是,对于众多的“表哥”“表姐”们而言,表头顺序不一样的多表合并,也是家常便饭。

  如图所示,是全年12个月的销售数据,但是每个表的顺序并不同,要求将12个月的数据合并。

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

  问题描述

  思路拆解:

  表头顺序不一致,可以用CHOOSECOLS+XMATCH组合,强制将子表的数据按照汇总表的顺序排列。共12个报表,每张表都执行一次CHOOSECOLS+XMATCH,可以使用遍历,让同样的操作重复执行12次。这是REDUCE函数最经典的用法。

  第一步:获取所有子表表名

  WPS中可以使用SHEETSNAME函数批量获取工作表名,Excel中没有类似的函数,需要使用CELL+TEXTAFTER函数组合获取工作表名。

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

  获取表名1

  选择第一张子表,按下Shift键不放,再鼠标左键单击最后一张子表,在空白单元格输入以下公式:

  =TEXTAFTER(CELL("filename",A1),"]")

  然后,在汇总表空白单元格输入以下公式:

  =VSTACK('1月:12月'!J2)

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

  获取表名2

  这样,就快速地批量获取了子表的表名。

  第二步:定义算法

  将上一步获取的表名数组作为遍历对象,使用CHOOSECOLS+XMATCH函数组合,根据汇总表的表头来合并数据。

  以第1张表为例,输入公式,验证结果。

  =CHOOSECOLS(TRIMRANGE(INDIRECT(I2&"!A2:H50000")),XMATCH($A$1:$H$1,INDIRECT(I2&"!A1:H1")))

  因为没法确定每个表的有效数据区域,索性将数据范围放大到5万行,外层嵌套TRIMRANGE函数自动修剪。

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

  定义算法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"))))))

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

  定义算法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个表合并,也轻松拿捏

  最终公式

  这个时候,就可以将刚才构造的辅助列和辅助单元格删除了。

  以上是表头不一样的跨表合并,难度不算大,但综合性偏强,多练习几遍就熟练了。如果看文章有疑惑,可以看我相关视频的实操讲解:掌握此技巧,即使100个表头都不一致,也能轻松应对跨表问题