很多讲师都爱讲的这个VLOOKUP高级用法,我劝你千万别用!

HI,大家好,我是星光。

众所周知,使用Excel高效工作有四个必备的函数:

IF条件判断

VLOOKUP条件查询

SUMIF条件求和

COUNTIF条件计数

其中VLOOKUP函数对工作的帮助最大,既简单又实用,就得了个称号叫'大众情人'。

但该函数有一个强规则,查找值必须在查找范围的首列。如果遇到以下这种情况,它就不好用了。

如上图所示,需要根据A:C里的数据,查询E列人名所在的班级信息。

查询所需结果班级是A列,在查询依据列姓名是B列,结果列在查询列的左边,换句话说,查找值就没有在查找范围的首列。

这个时候,通常建议大家使用

INDEX+MATCH函数组合:

=INDEX(A:A,MATCH(E2,B:B,0))

如果你所使用的Excel版本是365,用XLOOKUP也挺好:

=XLOOKUP(E2,B:B,A:A)

总之就不推荐使用VLOOKUP了。

有朋友说,拜托,这个问题VLOOKUP也能解决好不好?何必要用INDEX呢?F2单元格输入以下数组公式就可以了。

=VLOOKUP(E2,IF({1,0},B:B,A:A),2,0)

打个响指,你要这么想,那我就不困了。

有很多函数老人家,比如随风小妞,就很喜欢给新人讲VLOOKUP函数{1,0}的用法,内心戏大概是这样的:是不是觉得这个用法很奇妙?是不是重新认识了VLOOKUP?嘿嘿嘿,我当年也是这么觉得,我当年……

奇妙与否咱先不说,要说的是,无论编写体验,还是运算效率,VLOOKUP的这个用法都是渣的一匹啊。

编写方面,这家伙长度较其它解法更长,其中IF函数的第1参数还用到了数组,对新人而言,计算逻辑的理解就不大友好。另外,作为数组公式,普通Excel版本还需要按数组三键才能正确运行。

关键是运行效率是真渣,宽面大碗都装不下这么多渣。

它先用IF({1,0},B:B,A:A),构建了两列内存数组,第1列是B列,第2列是A列;也就将B列和A列整列调换了顺序,使查找值处在查找范围的首列。

此时,作为数组运算,它会计算整列数据,Excel一列有1048576个单元格,计算B列和A列,也就计算了1048576*2=200多万个单元格。

———这败家娘们爷们,即便是越南盾,单元格也不能这么花啊。

而如果使用公式:

=INDEX(A:A,MATCH(E2,B:B,0))

虽然也使用了整列的计算范围,但每个函数内部都是纯粹的单元格引用,不涉及数组运算,就会享有系统的两大能源补贴。

INDEX和MATCH函数会自动计算实际可用的单元格区域。依本例而言,虽然我们设置了MATCH函数的计算范围是B:B列,但实际上,它只会计算B列存在数据的区域,也就是B1:B9。这有些类似以下VBA语句:

Sub t() Intersect(Range('b:b'), ActiveSheet.UsedRange).SelectEnd Sub

2016版开始,微软对

VLOOKUP/HLOOKUP/MATCH

XLOOKUP等函数

运算机制进行了强力优化,从相同表区域查找多个列时,将为所搜索的列范围创建内部缓存索引,在后续查找中,将重用这一缓存的索引。

简单的说,如果你所使用的Excel版本是2016及以上,当你在其它单元格重复使用F2单元格的INDEX+MATCH函数时,它不会重复从单元格区域里读数据,而是直接从缓存中获取。

如此一来,即便是计算十几万行数据,只要你的Excel版本给力,也是可以高效完成的。

——这儿插句题外话,很多朋友一谈到Excel函数运行很卡顿,就说要换新电脑,这就很败家老爷们。摊手,大哥,这事大可不必,咱们还是先升级下Excel版本再说,省下的钱给老婆大人买个新搓衣板不香了吗?

……

最后,综上所述,

还是推荐使用INDEX/XLOOKUP,

·别用VLOOKUP(IF({1,0}...)这种花里胡哨作用不大自残度却很高的技巧了。

没了,挥挥手说再见,没关注的朋友左上角点个关注,已关注的朋友右下角点个赞,明天咱们继续来聊Excel这些事儿。

(0)

相关推荐