Menu

Excel 多条件查找:XLOOKUP 与 INDEX MATCH

=XLOOKUP(1,(A2:A7=E2)*(B2:B7=F2),C2:C7) 返回 A 列等于 E2 且 B 列等于 F2 的那一行中的值。本文还介绍 INDEX MATCH 写法、VLOOKUP 的辅助列,以及用 FILTER 返回所有匹配项。

本页的每张表格都是实时的:修改数字或公式,就会重新计算。

=XLOOKUP(1,(A2:A7=E2)*(B2:B7=F2),C2:C7) 返回商品为 E2 并且 规格为 F2 的那一行的价格。每个比较都会检查每一行,两者相乘后只有都成立的行才是 1,XLOOKUP 查找的就是这个 1。它需要 Excel 2021 或 Microsoft 365;下面的 INDEX MATCH 写法适用于所有版本。

按商品和规格查价格
G2
ABCDEFG
1ProductSizePriceProductSizePrice
2CoffeeSmall$2.50TeaLarge$3.00
3CoffeeLarge$3.50
4TeaSmall$2.00
5TeaLarge$3.00
6JuiceSmall$3.00
7JuiceLarge$4.00
点击单元格查看它的公式。修改数字或公式,表格会重新计算。

Tea 和 Large 在第 5 行相交,所以 G2 返回 3.00。选择Juice和Small:结果还是3.00。选择 Juice 和 Small:结果还是 3.00,但来自另一行。为没有任何行同时满足两个条件的情况加上第四个参数:=XLOOKUP(1,(A2:A7=E2)*(B2:B7=F2),C2:C7,"No such item")。

条件相乘的原理

A2:A7=E2 把每个商品与 E2 比较,返回六个 TRUE 或 FALSE。两个这样的列表相乘时,TRUE 变成 1,FALSE 变成 0,只有在两个列表中都是 1 的行结果才是 1。D 列显示的就是这个列表,由一个公式溢出得到。

XLOOKUP 查找的数组
D2
ABCDEFG
1ProductSizePriceBoth matchProductSize
2CoffeeSmall$2.500TeaLarge
3CoffeeLarge$3.500
4TeaSmall$2.000
5TeaLarge$3.001
6JuiceSmall$3.000
7JuiceLarge$4.000
点击单元格查看它的公式。修改数字或公式,表格会重新计算。

只有 D5 是 1。修改 F2 或 G2,这个 1 就会移动。每增加一个条件,就多一个 *(range=value),而且条件不一定是相等比较:*(C2:C7<3) 加上了“价格低于 3”。每个区域必须覆盖相同的行(A2:A7、B2:B7、C2:C7):如果返回区域与条件区域大小不同,XLOOKUP 会返回 #VALUE!。

多条件的 INDEX MATCH

在 Excel 2019 及更早版本中,可以让 MATCH 在同样的数组中查找 1,再由 INDEX 返回该位置的价格。

用 INDEX 和 MATCH 实现两个条件
G2
ABCDEFG
1ProductSizePriceProductSizePrice
2CoffeeSmall$2.50CoffeeLarge$3.50
3CoffeeLarge$3.50
4TeaSmall$2.00
5TeaLarge$3.00
6JuiceSmall$3.00
7JuiceLarge$4.00
点击单元格查看它的公式。修改数字或公式,表格会重新计算。

Coffee 和 Large 是数组中的第 2 个位置,INDEX 返回 $3.50。在 Excel 2019 及更早版本中,这是一个数组公式:要按 Ctrl+Shift+Enter(Mac 上按 Cmd+Shift+Enter)而不是 Enter,Excel 会把它显示在花括号中。在那些版本里直接按 Enter 通常会返回 #N/A 或 #VALUE!。在 Excel 365 中按 Enter 就够了。单条件的写法见 INDEX 和 MATCH 页面。

把多个条件拼成一个键

另一种方法是把两个条件拼接成一个。VLOOKUP 需要把拼接后的值放在表格开头的辅助列中(VLOOKUP 页面介绍了这种写法)。XLOOKUP 可以在公式内部拼接区域,所以不需要辅助列。

把商品和规格拼成一个键
G2
ABCDEFG
1ProductSizePriceProductSizePrice
2CoffeeSmall$2.50JuiceLarge$4.00
3CoffeeLarge$3.50
4TeaSmall$2.00
5TeaLarge$3.00
6JuiceSmall$3.00
7JuiceLarge$4.00
点击单元格查看它的公式。修改数字或公式,表格会重新计算。

A2:A7&"|"&B2:B7 构造出六个键,例如 Juice|Large,XLOOKUP 在其中找到 Juice|Large:$4.00。各部分之间要放一个分隔符。不加分隔符的话,“AB”和“C”拼起来的“ABC”与“A”和“BC”拼起来的一样,查找就可能返回错误的行。

如果要找的值是数字,并且每种组合只出现一次,SUMIFS 完全不用数组也能给出同样的答案:=SUMIFS(C2:C7,A2:A7,E2,B2:B7,F2)。没有匹配时它返回 0 而不是错误,这可能会掩盖拼写错误。

用 FILTER 返回所有匹配项

XLOOKUP 和 INDEX MATCH 返回第一个匹配的行。如果有多行匹配并且你想要全部,就用 FILTER 配合同样的条件。

North 的所有 Phone 订单
F2
ABCDEFG
1RegionProductQuarterSalesMatches
2NorthLaptopQ1120Q1210
3NorthPhoneQ1210Q2225
4SouthLaptopQ195Q3240
5NorthPhoneQ2225
6SouthPhoneQ2180
7NorthLaptopQ2135
8NorthPhoneQ3240
点击单元格查看它的公式。修改数字或公式,表格会重新计算。

有三行同时是 North 和 Phone,所以 F2 把它们的季度和销售额溢出到 F2:G4。把 A3 改成 South,列表就缩减为两行。没有任何行匹配时,FILTER 返回 #CALC!;加上第三个参数,例如 "None",就会显示文本。更多用法见 FILTER 页面。

练习:三个条件

按地区、商品和季度查销售额
G4
ABCDEFG
1RegionProductQuarterSalesRegionSouth
2NorthLaptopQ1120ProductLaptop
3NorthLaptopQ2135QuarterQ2
4NorthPhoneQ1210Sales
5SouthLaptopQ195
6SouthPhoneQ2180
7SouthLaptopQ2110
8NorthPhoneQ2225
点击单元格查看它的公式。修改数字或公式,表格会重新计算。

轮到你了: 在 G4 中返回地区为 G1、商品为 G2、季度为 G3 的销售额。

常见问题

怎样用 XLOOKUP 进行多条件查找?

每个条件写一个比较,把它们相乘,然后查找 1:=XLOOKUP(1,(A2:A7=E2)*(B2:B7=F2),C2:C7)。每个比较对每一行给出 TRUE 或 FALSE,只有全部为 TRUE 的行乘积才是 1,XLOOKUP 返回第一个这样的行。

怎样用 INDEX MATCH 进行两个条件的查找?

在 MATCH 中使用同样的条件相乘:=INDEX(C2:C7,MATCH(1,(A2:A7=E2)*(B2:B7=F2),0))。在 Excel 2019 及更早版本中,要按 Ctrl+Shift+Enter(Mac 上按 Cmd+Shift+Enter)确认。

VLOOKUP 能用两个条件吗?

不能直接用。在表格开头加一个辅助列,把两个值拼在一起,例如 =A2&"|"&B2,然后查找拼接后的值:=VLOOKUP(E2&"|"&F2,helper_table,col,FALSE)。

SUMIFS 能代替两个条件的查找吗?

可以,前提是要找的值是数字,并且每种组合只出现一次:=SUMIFS(C2:C7,A2:A7,E2,B2:B7,F2)。没有匹配的行时它返回 0 而不是 #N/A;如果某个组合出现了两次,它会把这些值加起来。

怎样用“或”条件查找?

把条件相加而不是相乘:(A2:A7="Tea")+(A2:A7="Juice") 在任一条件成立时为 1 或更大。然后查找大于 0 的值,例如 =XLOOKUP(TRUE,((A2:A7="Tea")+(A2:A7="Juice"))>0,C2:C7)。

Coddy 编程语言插图

和 Coddy 一起学编程

开始