问题场景:有两个表格,B表需要从A表匹配数据,如下表,表格B从表格A获取公司名跟编码相同条件的数量,单价,金额
假设只能用订单号&编码这两列去做匹配,也就是匹配第一列的数据,如果直接用XLOOKUP去做匹配,由于订单号&编码 会有重复的,然后这样匹配会只匹配到第一行,如果只有两行重复的,用XLOOKUP正向+反向查找可以完成,如果有三行或者以上就不太行了,方法应该有很多,这里讨论一种用公式解决的方案。大概流程就是,插入一列做为辅助列,用来保存当前查找到的值在A表的行数,然后根据行数去表格A中获取相关数据。
先用COUNTIF判断是否有重复数据,如果没有重复的,则直接用XLOOKUP 查找,如果有重复的,就需要判断行数,判断当前查找值是否是所有重复值位置的第一个,如果当前查找值位置是在第一个,则也直接用XLOOKUP 查找就可以了,因为XLOOKUP查到的就是第一个,所以不用做其他判断,假如重复数据不是在第一个,那就得先找到上一个重复值所在的行号,再用这个行号+1去作为现在这个查找值的开始范围,
比如上表B我们现在从上往下开始查找,第一行是重复的数据,然后位置又是在重复行数的第一行,所以直接用XLOOKUP就可以匹配到行数
ROW(XLOOKUP(A3,[表格B.xlsx]Sheet1!$A:$A,[表格B.xlsx]Sheet1!$D:$D))
现在开始匹配第二行,第二行数据不在重复值的第一行,要先拿到上一行重复数据的行号,由上条公式可以得出上一行在表格A中行数为2,所以这里的第二行在表格A中的查找范围要跳过第2行之前的,所以这里查找范围为行号+1=A$3:A$31。
判断重复值位置是否在第一行公式:
COUNTIF(A$1:INDIRECT("A"&(ROW()-1)),A3)=0
获取上一行重复数据的行数(用XLOOKUP反向从当前行-1查找至第一行)
XLOOKUP(A3,A$1:INDIRECT("A$"&ROW()-1),G$1:INDIRECT("G$"&ROW()-1),0,0,-1)
以下为完整公式:
=IF(COUNTIF([表格B.xlsx]Sheet1!$A:$A,A3)>1,IF(COUNTIF(A$1:INDIRECT("A"&(ROW()-1)),A3)=0,ROW(XLOOKUP(A3,[表格B.xlsx]Sheet1!$A:$A,[表格B.xlsx]Sheet1!$D:$D)),ROW(XLOOKUP(A3,INDIRECT("[表格B.xlsx]Sheet1!A$"&(XLOOKUP(A3,A$1:INDIRECT("A$"&ROW()-1),G$1:INDIRECT("G$"&ROW()-1),0,0,-1))+1):[表格B.xlsx]Sheet1!A$999,INDIRECT("[表格B.xlsx]Sheet1!B$"&(XLOOKUP(A3,A$1:INDIRECT("A$"&ROW()-1),G$1:INDIRECT("G$"&ROW()-1),0,0,-1))+1):INDIRECT("[表格B.xlsx]Sheet1!B$999")))),ROW(XLOOKUP(A3,[表格B.xlsx]Sheet1!$A:$A,[表格B.xlsx]Sheet1!$E:$E)))
INDIRECT函数是将文本转成单元格引用,比如将文本“A3”转成单元格 A3 ,这样就能通过这个函数去拼凑单元格,达到获取单元格值的目的。
最后根据行号,去获取对应列的数据,比如获取单价,在D列,G2行
=INDEX([表格B.xlsx]Sheet1!$D:$D,G2)