一对多的匹配excel题
图一源数据列表图二题目要求

拿到满足两个条件的所有匹配值
这里看到有两个问题是需要我们解决的:
1.需要拿到B列第二个“-”后面的内容。
2.需要拿到满足两个条件的所有匹配值。
解决问题1
由2个“-”分开成3个数直接采用分列
利用wps里面的数据栏-分列/智能分列功能,拿到3列数据,解决问题1。
图三(Sheet1 (2))

解决问题2
这里一般来说解决一对多匹配有两种思路:
1.利用两个条件合并成为一个唯一的索引值,然后采用vlookup进行匹配。
2.利用数组形式进行解决。
一般能够采用第1种方式那么优先采用,但是这里发现此时并不唯一例如满足LR以及CCC两个条件的就已经有了3组值,那么这里考虑数组的方法来解决。
源数据里面取出与结果所在的整列数据,然后在从里面进行筛选,满足条件的就取出来。
需要取出结果所在的整列数据,我们想到index函数
可以这样理解这个函数,例如INDEX(B3:D6,4,3),意思就是在B3:D6这个区间内取出位于第4行第3列的那个值。
INDEX函数一般在一个数组里面取出一个值,当第一个区间只有1列时,可以省略掉第3个参数(列参数),直接用行参数就可以取到这个值。
最终如何将满足条件的值留下,不满足的值进行剔除掉呢?
这里要提到另一个函数SMALL函数,返回第k个最小的值。
可以这样理解这个函数,例如SMALL(A1:A4,3),这个就是在A1:A4区间内返回第3个最小的值,如果A1=1,A2=2,A3=3,A4=4,那么这个时候会返回3。
如果选中结果所在列后,满足两个条件对应的值的行数全部都很小,不满足条件的值行数都很大(大到不可能取到就OK)那么我们就可以解决这个问题。
解题思路已出来,接下来开始写函数
先看结果,再来一步步解释

1.首先
=INDEX('Sheet1 (2)'!$D:$D,待完善)
2.其次
SMALL的参数范围到时候有效值会特别小,无效值会特别大,那我们需要从第一个最小的值开始取
=INDEX(SMALL(待完善,ROW('Sheet1 (2)'!$A1)))
3.再者
IF('Sheet1(2)'!$B$2:$B$29=$A$8,IF('Sheet1(2)'!$I$2:$I$29=B$1,ROW($2:$29),2^100),2^100)
4.最后
函数就变为
=IFERROR(INDEX(SMALL(IF('Sheet1(2)'!$B$2:$B$29=$A$8,IF('Sheet1(2)'!$I$2:$I$29=B$1,ROW($2:$29),2^100),2^100),ROW('Sheet1 (2)'!$A1))),"")
注意数组函数使用Ctrl+Shift+Enter
有其他想法欢迎大家一起交流哦。
