查找!查找!永恒的查找!

excelperfect

查找,永恒的主题。

从一大堆数据中找出我们需要的数据,这是Excel中常用的操作。如果使用公式来进行查找,那么Excel提供了丰富的函数,让你随条件不同获取想要的数据。其中,最常见或我们最熟悉的就是VLOOKUP函数、INDEX函数/MATCH函数,等等。

本文从一个特殊的查找问题开始,其效果演示如下图1所示。

图1

通常,我们根据图书名称查找其售价,一般使用VLOOKUP函数能够方便完成。然而,这里是根据大致的价格来查找相应的图书。

我们在单元格C2中输入一个价格,在下面的表中查找在这个价格1元范围内的图书,并在单元格B5中显示图书名称。

显然,VLOOKUP函数已不能应对此种情况,我们要使用经典的INDEX+MATCH函数组合了。

如果单元格C2中的价格刚好是表中某行的价格,那么:

MATCH($C$2,$C$9:$C$21,0)

就会返回该行的行号,传递给INDEX函数就可以获取对应的图书名称了。

如果单元格C2中的价格在表中找不到呢,那么我们就要判断表中是否有价格处于这个价格的±1范围内,如果有则返回其对应的图书名称。那么:

($C$9:$C$21>=($C$2-1))*($C$9:$C$21<=($C$2+1))

会对表中的价格进行比较,返回一个由1/0组成的数组,其中的1值表明该价格处于指定的范围内。这样,我们找到这个1值所在的位置:

MATCH(1,($C$9:$C$21>=($C$2-1))*($C$9:$C$21<=($C$2+1)),0)

就是要查找的图书对应的位置,传递给INDEX函数就可以获取对应的图书名称。

因此,完整的公式为:

=IFERROR(INDEX($B$9:$B$21,IFERROR(MATCH($C$2,$C$9:$C$21,0),MATCH(1,($C$9:$C$21>=($C$2-1))*($C$9:$C$21<=($C$2+1)),0))),'没有找到')

这是一个数组公式,输入完成后要按Ctrl+Shift+Enter组合键。

然而,如果与单元格C2的价格相差1元的价格不止1个呢?如下图2所示。

图2

如何实现查找重复值?

假设如果有多个符合要求的价格,我只要查找满足价格的图书最多3本,此时LARGE函数就要上场了。

上文中,我们使用:

($C$9:$C$21>=($C$2-1))*($C$9:$C$21<=($C$2+1))

获取了哪些价格满足条件,即数组中是1的值所在的位置的价格。在此基础上,我们乘以:

ROW($C$11:$C$23)-ROW($C$11)+1

就可以得到一个由满足条件的价格所在行位置和0组成的数组,即:

($C$11:$C$23>=($C$2-1))*($C$11:$C$23<=($C$2+1))*(ROW($C$11:$C$23)-ROW($C$11)+1)

对于图2所示的查找数据来说,这个返回的数组是:

{1;0;0;0;0;0;0;0;0;10;11;0;0}

即,表中的第1行、第10行、第11行对应满足我们条件的价格。

然后,使用LARGE函数依次返回这些行位置:

LARGE(($C$11:$C$23>=($C$2-1))*($C$11:$C$23<=($C$2+1))*(ROW($C$11:$C$23)-ROW($C$11)+1),SUM(($C$11:$C$23>=($C$2-1))*($C$11:$C$23<=($C$2+1)))-ROW(A1)+1)

其中,SUM(($C$11:$C$23>=($C$2-1))*($C$11:$C$23<=($C$2+1)))统计共有多少个返回值,传递给INDEX函数可返回相对应的图书。

这样,在单元格B5中的公式:

=IFERROR(INDEX($B$11:$B$23,IFERROR(MATCH($C$2,$C$11:$C$23,0),LARGE(($C$11:$C$23>=($C$2-1))*($C$11:$C$23<=($C$2+1))*(ROW($C$11:$C$23)-ROW($C$11)+1),SUM(($C$11:$C$23>=($C$2-1))*($C$11:$C$23<=($C$2+1)))-ROW(A1)+1))),'没有找到')

这是一个数组公式,输入完成后要按Ctrl+Shift+Enter组合键。

然后,将其下拉复制到单元格B7。

好了!接下来我们举一反三,再来谈谈几种特殊的查找。

如果我们只想查找价格的整数部分,那么可以使用数组公式:

=IFERROR(INDEX($B$9:$B$21,MATCH($C$2,INT($C$9:$C$21),0)),'没有找到')

如果想要查找大于指定价格且书名含有“Excel”的图书,那么可以使用数组公式:

=IFERROR(INDEX($B$9:$B$21,MATCH(1,($C$9:$C$21>$C$2)*ISNUMBER(FIND('Excel',$B$9:$B$21)),0)),'没有找到')

以上两种情形,如果涉及到有重复的结果,则可参照上文公式进一步拓展。

如果想要查找最接近指定价格的书名,可以使用数组公式:

=IFERROR(INDEX($B$9:$B$21,MATCH(MIN(ABS($C$9:$C$21-$C$2)),ABS($C$9:$C$21-$C$2),0)),'没有找到')

看到了吧,查找条件变化,公式也随之调整,以求出想要的结果。

(0)

相关推荐