lookup函数处理合并单元格套路
知乎原题是:
如何将两个EXCEL表中数据做对比找出差异?
1.首先两个excel表来自不同的两个人做的同样的业务。
2.表格中存在合并单元格的问题,所以难以利用vlookup函数。
3.两个表中虽然对象数据都会存在,但是数据顺序不一定一样。
因为有日文,所以我重新模拟了一下数据来回答。
此题关键是合并单元格的处理,这里利用lookup查找末行数据来匹配空单元格内容。
声明,我也只对函数有些了解,所以从函数角度来解决此问题;此文仅说明处理合并单元格的一个套路,不一定最优解。
一、通过lookup确定查询值
这是套路,请牢记!
=LOOKUP("座",$A$3:$A3)公式简析:
1、我们要知道,在excel中,汉字排序默认是按照拼音的顺序排列的,“座”的拼音是zuo,在字典里是很靠后的一个字,所以一般在查找汉字最后一行的内容时,多用“座”为参数。
2、lookup第二参数的锁定$A$3:$A3,这种写法也经常用到,此种写法是将区域的开始单元格锁定,目的是随着向下或者向右拖动公式时,保证lookup第二参数(查询区域)的开始位置不变;结束单元格只锁定了列而没有锁定行,目的是随着公式的拖动,查找区域是逐渐扩大的。
这点对于初学者来说是个难点,一定要亲自写一写,拖一拖,体会参数变化规律。
但为了防备表一B列(姓名列)与表一B列(姓名列)不一致,我们再连接B列内容,形成一个包含班级与姓名的唯一值
=LOOKUP("座",$A$3:$A3)&$B3有了这个唯一值,就可以去另外一个表里查找对应数据了。
二、通过lookup确定查询区域
作为查询值,可以一个格子为一个值,但作为查询区域,就要是一个内存数组了,所以虽然原理相同,但实现方法上有些变化:
1、通过判断合并单元格是否为空来确定行数
=IF($A$15:$A$22>0,ROW($1:$8))按F9查看公式结果
通过上图我们可以看出,在表二数据(除去表头)中,第1、2、3、6行是有内容的。
2、用lookup确定各行要取哪一行对应的数据
=LOOKUP(ROW($1:$8),IF($A$15:$A$22>0,ROW($1:$8)))按F9查看公式结果:
3、为各行匹配班级数据
可能好多同学看到上图的结果,想到的是用indext去表二里引用相应的数据,其实不用。因为lookup还有第三参数。
=LOOKUP(ROW($1:$8),IF($A$15:$A$22>0,ROW($1:$8)),$A$15:$A$22)按F9查看公式结果:
通过上图我们可以看出,这个结果与查询值结果很相似,但查询结果是一个一个的数值,这里是多个值,也就是数组。
4、连接姓名列
=LOOKUP(ROW($1:$8),IF($A$15:$A$22>0,ROW($1:$8)),$A$15:$A$22)&$B$15:$B$22三、match确定引用表二数据行号
=MATCH(LOOKUP("座",$A$3:$A3)&$B3,LOOKUP(ROW($1:$8),IF($A$15:$A$22>0,ROW($1:$8)),$A$15:$A$22)&$B$15:$B$22,0)上图中,出现#na错误,是因为表二中四班、三班姓名模拟数据错误,与表一没有一一对应。鉴于本文只为说明套路,所以也就不再修改。
四、index引用数据
=INDEX($C$15:$E$22,MATCH(LOOKUP("座",$A$3:$A3)&$B3,LOOKUP(ROW($1:$8),IF($A$15:$A$22>0,ROW($1:$8)),$A$15:$A$22)&$B$15:$B$22,0),COLUMN(A1))将表二的数据对应引用到表一,下一步就可以进行对比了,余下的工作,请自行完善,不再赘述!
当然,表二如果是另外一个工作表,无非是函数写得更长一点,路子上没有什么区别。