现有AB两表,需核对两表差异
观察AB表可知,表中人数相同,人员不同,且人员对应的销售数据也不同。
所以无法使用选择性粘贴和溢出的方式来做,高级筛选也无法一步到位。
那么怎么做呢?
对于这种没有统一标准的数据,第一步先整理,将无序的数据变为有序的,那么涉及到的函数就得包含sort或者sortby
那排序根据什么排序呢?汉字的变化太多,是不推荐按照汉字排序的,那就是按照数字排序
但是表中没有可以用作排序的数据呀,那就创造一个数组对标每个人员,然后连接后面的数据进行排序
所以
第一步:构建一个序号表,每个人对应一个序号
=IF({1,0},UNIQUE(VSTACK($A$34:$A$40,$H$34:$H$40)),ROW($A$1:$A$8))
VSTACK(A34:A40,H34:H40)表示将表A和表B的第一列人员姓名列上下结构合并到一起,此时得到的结果是包含重复的,UNIQUE去重,得到8个结果
之后用之前介绍过的if({1,0},列1,列2)构建一个序号表,序号部分用SEQUENCE或者ROW都可以
可以将这一步公式定义名称为【序号表】
得到这个表之后我们还是无法区分两个表中的差异,那可以看一下每个人出现的频次,用到FREQUENCY
第二步:合并两表成员,计算每个人出现的次数,定义为出现次数
=FREQUENCY(VLOOKUP(VSTACK($A$34:$A$40,$H$34:$H$40),序号表,2,FALSE),ROW($A$1:$A$7))
这个公式的最外层是FREQUENCY(数组,条件数组)
数组部分=VLOOKUP(VSTACK($A$34:$A$40,$H$34:$H$40), 序号表 ,2,FALSE)
即求两表人数上下组合构成的名单对应的序号,如下图,条件数组=ROW($A$1:$A$7)表示按照1-8进行频次分布
这样我们就得到了每个序号在表中出现的次数,定义名称为【出现次数】
然后我们把【序号表】和【出现频次】两个部分用HSTACK左右合并为一个表,并定义名称为【辅助表】
其实这一步就可以知道哪些数据是两表同时存在的,如上图第三列出现频次为2的就是两表同时存在的人员
接下来就是重新构建表A和表B并排序
第三步:重构表A和表B
=SORT(HSTACK(VLOOKUP($A$34:$A$40,FILTER(辅助表,出现次数=2),2,FALSE),$A$34:$F$40),1,1)
FILTER(辅助表,出现次数=2)表示筛选辅助表中,出现次数为2的人员名单
然后VLOOKUP在FILTER(辅助表,出现次数=2)中查找表A中的人员对应的序号
SORT对上述结果的序号进行升序排列
表B同理
=SORT(HSTACK(VLOOKUP($H$34:$H$40,FILTER(辅助表,出现次数=2),2,FALSE),$H$34:$M$40),1,1)
此时差异的数据都被排列到最后一列了,两表的人员排序是一致的了,我们可以用TAKE函对数据区域相减得到核对结果
把表A和表B定义名称为【表A】、【表B】
=TAKE(表A,6,-5)-TAKE(表B,6,-5)
这只是数据区域,对应的人员名称,可以这样得到
=TAKE(FILTER(辅助表,出现次数=2),6,1)
然后HSTACK合并两者
=HSTACK(TAKE(FILTER(辅助表,出现次数=2),6,1),TAKE(表A,6,-5)-TAKE(表B,6,-5))
最后我们把函数定义为【核对两表】,这样此类数据就可以一键得到了
其实这个公式中涉及的常量我们可以用单元格引用,到时候根据我们核对的数据的实际情况,填写行数,列数,之后用这个提前预设好的流程得到最终的核对结果
OK,总结一下:
图是写公式时打的草稿,本文进行了删减合并,但大致思路是一样的
遇到这种问题,记得先整理数据,了解清楚数据特点,处理成标准的数据,有相同点的数据之后再解决就方便很多了,善用定义名称,对于巨长的公式真的很省空间,很省事
完结,撒花✿✿ヽ(°▽°)ノ✿