Excel145 | INDEX+SMALL,一对多查找的又一犀利组合

韩老师曾经写过一篇:Excel | VLOOKUP一对多查找:不连续相同内容对应的多个数据一次提取,今天有朋友说:这个公式写起来好麻烦啊!

我们的“office天天学”群里有位高手朋友说他更喜欢INDEX+SMALL,那韩老师今天就把INDEX+SMALL这一神组合完成一对多查找的方法给大家讲一讲。

结果是这样的:

Excel145 | INDEX+SMALL,一对多查找的又一犀利组合_第1张图片

公式实现

在F2单元格输入公式:

=INDEX(B:B,SMALL(IF(A$2:A$13=E$2,ROW(A$2:A$13),ROWS(B:B)),ROW(A1)))&"",以三键组合结束。

Excel145 | INDEX+SMALL,一对多查找的又一犀利组合_第2张图片

公式分步解析

我们以查找“张二”的消费记录为例来分析:

第一步:

IF(A$2:A$13=E$2,ROW(A$2:A$13),ROWS(B:B))

用IF函数,建立一新的数组,这一新的数组建立的规则是:

如果A$2:A$13区域中的单元格内容等于E2单元格内容,则返回该单元格所在的行,否则返回整个工作表的行数。

所以:此部分返回的数组是:

{1048576;3;1048576;1048576;1048576;7;1048576;1048576;10;1048576;1048576;13}

可以看到:凡是A列单元格内容等于张二的,返回的都是对应的行数,不等于张二的,返回的都是工作表的行数1048576。

第二步:

SMALL(IF(A$2:A$13=E$2,ROW(A$2:A$13),ROWS(B:B)),ROW(A1)

在第一步形成的数组中,查找第第一小的数值。

用ROW(A1)做SMALL函数的第二个参数,即第几小。

ROW(A1)是一个动态的数值,公式往下填充一行,行数加1,即当公式在F2单元格时,是ROW(A1),当公式填充到F3单元格是,是ROW(A2),当到F4单元格时,是ROW(A3)……

这样,就在第一步的数组中找到了第1、2、3、4小的值,即3、7、10、13。

第三步:

INDEX(B:B,SMALL(IF(A$2:A$13=E$2,ROW(A$2:A$13),ROWS(B:B)),ROW(A1)))

当公式在F2单元格时,返回B列第3行的值,即张二的第一次消费记录7478。因为公式中IF部分是数组计算,所以公式以三键组合结束。

公式向下填充,得到B列第7、10、13行的值。

第四步:

INDEX(B:B,SMALL(IF(A$2:A$13=E$2,ROW(A$2:A$13),ROWS(B:B)),ROW(A1)))&""

在最后加上&"",这一步是容错处理。用空单元格与空文本合并返回空文本的特性,将超出结果数量的部分不显示出来。

你可能感兴趣的:(Excel145 | INDEX+SMALL,一对多查找的又一犀利组合)