c++函数返回多个值_Excel函数技巧之返回多个匹配结果

5386095e4d4d0a20f2c51c94c590eb73.png

d891ef1958f279c52d32fc59961d28f6.png

在Excel中进行查找一般都用VLOOKUP和INDEX+MATCH,但是这些函数都只能返回一个匹配结果。比如:

6603277491a9d52c1e915b53d10dad8a.png

尽管在右边的表中有两行都是可乐类的产品,但是VLOOKUP只返回第一个值。用MATCH也类似。

那么,如果想要把所有匹配的行都返回,应该怎么办?

01

第一种方法 Index+Small

这里,我们需要用到一个比较复杂的公式:

=INDEX($G$3:$G$6,SMALL(IF($F$3:$F$6=B3,ROW($F$3:$F$6)-2,1000),ROW()-2))

这是一个数组公式,需要用CTRL+SHIFT+ENTER输入。

4831326be2d2aa8ca57af2a1494d7d2b.png

下面简单介绍一下这个公式。

先看最内层的部分:

SMALL(IF($F$3:$F$6=B3,ROW($F$3:$F$6)-2,1000),ROW()-2)

SMALL是一个很简单的函数,就是从一堆数中选择第n小的值,例如SMALL({2,1.5,8},1)就是返回第一小的值,结果就是1.5。

在我们的公式中,SMALL的第一个参数是一个IF函数,这个函数去判断F列每个单元格bu是否跟B3单元格相等,如果是,就返回F列对应单元格的行号,如果不是,就返回1000(实际上是一个比较大的数,超过可能的最大行号即可),第二个参数就是取第几小的值,因为B3单元格对应的是第一个返回结果,所以取第1小的值:ROW()-2=3-2=1。

这部分公式的计算过程就是:

1bbcb172109200f2a01633c749a56c02.png

于是,整个公式就变成了:

INDEX($G$3:$G$6,2)

得到了一个匹配值。

通过拖拽填充即可得到后续的结果:

1384bc197b0f82d1adea00292a8aa1de.png

但是,如果填充超出了我们需要的行数,就会返回错误。此时,我们可以使用IFERROR来进行处理:

=IFERROR(INDEX($G$3:$G$6,SMALL(IF($F$3:$F$6=B3,ROW($F$3:$F$6)-2,1000),ROW()-2)),"")

b36fcc5cdfefb96dec90effc38507d2a.png

02

提高公式可读性

这个公式只用了两个函数嵌套在一起:INDEX和SMALL(ROW函数很简单,所有不算),总体不算复杂。但是可读性还是比较差,不容易一下就看明白这个公式的作用:

我们可以通过定义名称来提高公式的可读性:

6e74576cd3d9dc4c18445374f569683f.png

再定义G列为产品明细:

594d2b017b975eb13fd7b60bc4406800.png

于是公式可以写为:

=IFERROR(INDEX(产品明细,SMALL(IF(类别=B3,ROW(类别)-2,1000),ROW()-2)),"")

一个就知道这些参数的含义。

b36fcc5cdfefb96dec90effc38507d2a.png

好了,今天的分享就到这里了!

c84226f171f8b2dc7e192c1bfbf38077.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值