多条件查找、一对多查找,都是挺常见的查找需求,除了大家常用的那些公式,我要安利两个你们意想不到的函数,光看其功能,是无论如何想不到要用它们做查找的。
案例 1:提取出下图 1 中 E、F 列的条件,从左侧的数据表中匹配出对应的数量,效果如下图 2 所示。
解决方案 1:当然是最传统的 vlookup 或 xlookup 函数啦。
在 G2 单元格中输入以下公式:
=XLOOKUP(E2&F2,A2:A21&B2:B21,C2:C21)
公式释义:
E2&F2:将 E2 和 F2 单元格连接起来,作为查找项;
A2:A21&B2:B21:将两个区域连接起来,作为被查找区域;
XLOOKUP(...,...,C2:C21):在上述区域中查找出符合条件的行,返回对应的 C 列值
解决方案 2:依然是经典的组合查找公式。
输入以下公式:
=INDEX(C2:C21,MATCH(E2&F2,A2:A21&B2:B21,0))
公式释义:
MATCH(E2&F2,A2:A21&B2:B21,0):将 E2&F2 合并的值与 A2:A21&B2:B21 合并区域绝对匹配,返回一个代表值在序列中的位置的数字;
INDEX(C2:C21,...):从区域 C2:C21 中提取出处于上述位置的值
解决方案 3:这个公式就有点脑洞大开了。
输入以下公式:
=TOCOL(C2:C21/(A2:A21&B2:B21=E2&F2),2)
公式释义:
A2:A21&B2:B21=E2&F2:将区域 A2:A21 和 B2:B21 合并,并将合并后的每一个值依次与 E2 和 F2 的合并值相比较,结果为 true 或 false;
C2:C21/...:用 C 列的数值依次除以上述逻辑值,只有分母为 true 的可以得到 C 列的值,其他为 false 的都会得出错误值;
TOCOL(...,2):将上述区域转换成一列,参数 2 表示忽略错误值,因此只会提取出有值的那个元素
上述公式还可以写成:
=TOROW(C2:C21/(A2:A21&B2:B21=E2&F2),2)
将 tocol 换成了 torow,表示转换成行,由于最终结果只有一个单元格,所以用这两个函数得到的效果是一样的。
从 tocol 和 torow 函数的这种用法,我们可以衍生出另一种用途:批量一对多查找。
案例 2:根据 E 列菜品,查找出购买了该菜品的所有人员名单,并横向列出。
效果如下图 2 所示。
解决方案:在 F2 单元格中输入以下公式 --> 下拉复制公式:
=TOROW(IF(B2:B21=E2,A2:A21,NA()),2)
公式释义:
IF(B2:B21=E2,A2:A21,NA()):如果 B2:B21 区域中的值等于 E2,则返回 A2:A21 区域中对应的值,否则返回错误值 NA();
TOROW(...,2):将上述结果转换成一行,忽略其中的错误值