Table of contents
本教程介绍了XLOOKUP--Excel中垂直和水平查找的新功能。 左侧查找、最后匹配、多条件Vlookup以及更多过去需要火箭科学学位才能完成的事情,现在变得像ABC一样简单。
每当你需要在Excel中查询时,你会使用哪个函数? 是基石VLOOKUP还是它的横向兄弟姐妹HLOOKUP? 在更复杂的情况下,你会依靠典型的INDEX MATCH组合还是把工作交给Power Query? 好消息是,你不必再选择了--所有这些方法都在为一个更强大和通用的继任者,XLOOKUP函数让路。
XLOOKUP如何更好呢? 在很多方面!它可以纵向和横向,向左和向上看,用多个条件搜索,甚至可以返回整列或整行的数据,而不仅仅是一个值。 微软花了30多年时间,但他们终于成功地设计了一个强大的功能,克服了VLOOKUP的许多令人沮丧的错误和弱点。
有什么问题吗? 唉,有一个。 XLOOKUP功能只在Excel for Microsoft 365、Excel 2021和Excel for the web中可用。
Excel XLOOKUP函数--语法和用途
Excel中的XLOOKUP函数在一个范围或数组中搜索一个指定的值,并从另一列返回相关的值。 它可以纵向和横向查找,并进行精确匹配(默认)、近似(最接近)匹配或通配符(部分)匹配。
XLOOKUP函数的语法如下。
XLOOKUP(lookup_value, lookup_array, return_array, [if_not_found], [match_mode], [search_mode]。前3个参数是必须的,后3个参数是可选的。
- 查询_价值 - 要搜索的值。
- 查找_数组 - 要搜索的范围或阵列。
- 返回数组 - 返回值的范围或数组。
- 如果没有找到 [optional] - 如果没有找到匹配,将返回的值。 如果省略,将返回一个#N/A错误。
- 匹配_mode [可选] - 要执行的匹配类型。
- 0或省略(默认)--完全匹配。 如果没有找到,会返回#N/A错误。
- -1 - 完全匹配或下一个更小的值。 如果没有找到完全匹配,则返回下一个更小的值。
- 1 - 完全匹配或下一个更大的值。 如果没有找到完全匹配,则返回下一个更大的值。
- 2 - 通配符匹配。
- 搜索_mode [可选] - 搜索的方向。
- 1或省略(默认)--从头到尾搜索。
- -1 - 按相反的顺序搜索,从最后一个到第一个。
- 2--对数据进行升序排序的二进制搜索。
- -2 - 在数据上进行二进制搜索,排序为降序。
根据微软的说法。 二进制搜索 它是一种特殊的算法,通过与数组的中间元素进行比较,找到一个查找值在排序数组中的位置。 二进制搜索比普通搜索快得多,但只在排序的数据上正确工作。
基本的XLOOKUP公式
为了获得更多的理解,让我们以最简单的形式建立一个Xlookup公式来进行精确查找。 为此,我们只需要前3个参数。
假设你有一个汇总表,上面有地球上五个大洋的信息。 你想在F1中得到一个特定大洋的输入面积( 查找_值 与A2:A6的海洋名称( lookup_array )和C2:C6的面积( return_array ),该公式如下。
=xlookup(f1, a2:a6, c2:c6)
翻译成简单的英语,它说:在A2:A6中搜索F1值,并返回同一行C2:C6中的一个值。 没有列索引号,没有排序,没有Vlookup的其他可笑的怪癖!它只是工作:)
Excel中的XLOOKUP与VLOOKUP的比较
与传统的VLOOKUP相比,XLOOKUP有很多优点。 它在哪些方面比VLOOKUP好呢? 这里列出了最好的10个功能,这些功能使Excel中的其他查找功能都大打折扣。
- 垂直和水平查询 XLOOKUP函数因其能够纵向和横向查找而得名。
- 向任何方向看:右、左、下或上 虽然VLOOKUP只能在最左边的一列中搜索,HLOOKUP只能在最上面的一行中搜索,但XLOOKUP却没有这样的限制。 在Excel中臭名昭著的左键查找不再是一件痛苦的事了!
- 默认为完全匹配 在大多数情况下,你将寻找一个精确的匹配,XLOOKUP默认返回它(不像VLOOKUP函数默认为近似匹配)。 当然,如果需要,你也可以让XLOOKUP执行一个近似匹配。
- 使用通配符的部分匹配 当你只知道查询值的某些部分,而不是全部时,通配符匹配就会派上用场。
- 按相反顺序搜索 早些时候,为了得到最后出现的数据,你必须颠倒源数据的顺序。 现在,你只需设置 搜索_mode 参数为-1,以强制你的Xlookup公式从后面搜索并返回最后的匹配。
- 返回多个值 通过操纵 return_array 参数,你可以拉出与你的查询值有关的整行或整列的数据。
- 用多种标准搜索 .Excel XLOOKUP原生处理数组,这使得它可以执行多条件的查找。
- 如果错误功能 传统上,我们使用IFNA函数来捕获#N/A错误。 XLOOKUP将这一功能纳入了 if_not_found 参数,如果没有找到有效的匹配,允许输出你自己的文本。
- 列的插入/删除 VLOOKUP最令人恼火的问题之一是,增加或删除列会破坏公式,因为返回列是由其索引号识别的。 使用XLOOKUP,你提供返回范围,而不是数字,这意味着你可以根据需要插入和删除任意多的列而不破坏任何东西。
- 更好的表现 VLOOKUP可能会拖慢你的工作表,因为它在计算中包括整个表,这导致处理的单元格远远超过实际需要。 XLOOKUP只处理它真正依赖的查找和返回数组。
如何在Excel中使用XLOOKUP--公式示例
下面的例子展示了最有用的XLOOKUP功能。 此外,你将发现一些非琐碎的用途,将使你的Excel查找技能达到一个新的水平。
纵向和横向看
Microsoft Excel过去有两个函数用于不同的查找类型,每个函数都有自己的语法和使用规则:VLOOKUP用于垂直查找一列,HLOOKUP用于水平查找一行。
XLOOKUP函数可以用同样的语法做这两件事,区别在于你为查找和返回数组提供了什么。
对于v-lookup,提供列。
=xlookup(e1, a2:a6, b2:b6)
对于h-lookup,输入行而不是列。
=xlookup(i1, b1:f1, b2:f2)
本机执行的左键查询
在早期版本的Excel中,INDEX MATCH公式是唯一可靠的向左或向上查找的方法。 现在,你不再需要将两个函数结合起来,而一个函数就足够了。 只要指定目标查找数组,XLOOKUP就能顺利处理,无论其位置如何。
作为一个例子,让我们把 级别 我们的目标是在F1中获得海洋输入的等级。 VLOOKUP在这里会陷入困境,因为它只能从查找列右侧的列中返回一个值。 Xlookup公式可以轻松应对。
=xlookup(f1, b2:b6, a2:a6)
以类似的方式,你可以在水平搜索行时看上面。
具有精确和近似匹配的XLOOKUP
匹配行为由第五个参数控制,称为 Match_mode 默认情况下,会进行精确匹配。
请注意,即使你选择了一个近似的匹配 ( Match_mode 不同的是,如果没有找到精确的查找值,它将返回什么。
Match_mode参数。
- 0 或省略 - 完全匹配;如果没有找到 - #N/A错误。
- -1 - 完全匹配;如果没有找到 - 下一个较小的项目。
- 1 - 完全匹配;如果没有找到 - 下一个更大的项目。
完全匹配的XLOOKUP
这是你在Excel中做查询时可能使用的99%的选项。 因为精确匹配是XLOOKUP的默认行为,你可以省略掉 Match_mode 并只提供前三个必要的参数。
然而,在某些情况下,精确匹配是行不通的。 一个典型的情况是当你的查询表不包含所有的值,而是包含 "里程碑 "或 "界限",如基于数量的折扣,基于销售的佣金等。
我们的示例查询表显示了考试分数和成绩之间的相关性。 正如你在下面的截图中所看到的,只有当某个学生的分数与查询表中的数值完全匹配时,精确匹配才起作用(如第3行的Christian)。 在所有其他情况下,会返回一个#N/A错误。
=xlookup(f2, $b$2:$b$6, $c$2:$c$6)
为了得到成绩而不是#N/A错误,我们需要寻找近似匹配,如下例所示。
近似匹配 XLOOKUP
要执行一个近似的查询,请将 Match_mode 参数为-1或1,这取决于你的数据是如何组织的。
在我们的案例中,查找表列出了成绩的下限。 因此,我们设置 Match_mode 为-1,以便在没有找到完全匹配的情况下搜索下一个较小的值。
=xlookup(f11, $b$11:$b$15, $c$11:$c$15, ,-1)
例如,布莱恩的分数是98分(F2)。 公式在B2:B6中搜索这个查询值,但找不到。 然后,它搜索下一个较小的项目,发现90分,对应的是A级。
如果我们的查找表包含了成绩的上限,我们将设置 Match_mode 为1,以便在完全匹配失败时搜索下一个更大的项目。
=xlookup(f2, $b$2:$b$6, $c$2:$c$6, ,1)
该公式搜索98,又没有找到。 这次,它试图找到下一个更大的值,得到100,对应于A级。
提示:当复制一个Xlookup公式到多个单元格时,用绝对的单元格引用(如$B$2:$B$6)锁定查找或返回范围,以防止它们改变。
XLOOKUP与部分匹配(通配符)。
要执行部分匹配查询,请设置 Match_mode 参数为2,它指示XLOOKUP函数处理通配符。
- 星号(*)--代表任何序列的字符。
- 问号(?)--代表任何单一的字符。
为了了解它是如何工作的,请考虑下面的例子。 在A栏,你有几个智能手机型号,在B栏,是它们的电池容量。 你对某个智能手机的电池很好奇。 问题是,你不确定你能准确地输入A栏中出现的型号名称。为了克服这个问题,输入肯定存在的部分,并取代其余的用通配符的字符。
例如,要获得iPhone X的电池信息,使用这个公式。
=XLOOKUP("*iphone X*", A2:A8, B2:B8, ,2)
或者,在某个单元格中输入查询值的已知部分,并将单元格引用与通配符连接起来。
=XLOOKUP("*"&E1& "*", A2:A8, B2:B8, ,2)
XLOOKUP以相反的顺序得到最后出现的情况
如果你的表包含多个查询值的出现,你有时可能需要返回 最后一场比赛 要做到这一点,请配置你的Xlookup公式,以便按相反顺序搜索。
搜索的方向由第6个参数控制,该参数名为 搜索_mode :
- 1或省略(默认)--从第一个值到最后一个值进行搜索,即从上到下的垂直查找或从左到右的水平查找。
- -1 - 按照从最后一个值到第一个值的相反顺序搜索。
作为一个例子,让我们返回一个特定销售人员的最后一次销售。 为此,我们把前三个必要的参数(G1为 查找_值 ,B2:B9为 lookup_array ,而D2:D9为 return_array ),并在第5个参数中放入-1。
=xlookup(g1, b2:b9, d2:d9, , ,-1)
直截了当,简单易行,不是吗?
XLOOKUP用于返回多个列或行
XLOOKUP还有一个令人惊奇的特点,就是它能够返回与同一匹配有关的多个值。 所有这些都是用标准的语法完成的,没有任何额外的操作!
从下表中,假设你想检索与感兴趣的销售人员(F2)有关的所有细节。 你需要做的是提供一个范围,而不是一个单独的列或行,用于 return_array 争论。
=xlookup(f2, a2:a7, b2:d7)
你在结果范围的左上角单元格中输入公式,Excel会自动将结果溢出到相邻的空白单元格中。 在我们的例子中,返回数组(B2:D7)包括3列( 日期 , 项目 和 数量 ),所有三个值都被返回到G2:I2的范围内。
如果你想在一列中垂直排列结果,可以将XLOOKUP嵌套到TRANSPOSE函数中来翻转返回的数组。
=transpose(xlookup(g1, a2:a7, b2:d7))
以类似的方式,你可以返回一整列的数据,比如说 数量 为此,使用包含 "Amount "的F1单元格作为 查找_值 ,包含列标题的A1:D1范围为 lookup_array 和包含所有数据的范围A2:D7为 return_array .
=xlookup(f1, a1:d1, a2:d7)
注意:由于多个值被填充到相邻的单元格中,请确保你在右边或下面有足够的空白单元格。 如果Excel找不到足够的空白单元格,就会出现#SPILL!错误。
提示:XLOOKUP不仅可以返回多个条目,还可以用你指定的其他值来替换它们。 这种批量替换的例子可以在这里找到:如何用XLOOKUP搜索和替换多个值。
有多个标准的XLOOKUP
XLOOKUP的另一大优势是它可以原生处理数组。 由于这种能力,你可以直接在数组中评估多个条件。 lookup_array 争论。
XLOOKUP(1, ( 标准_范围1 标准1 ) * ( 标准_范围2 标准2 ) * (...), return_array )这个公式如何运作 :每个标准测试的结果是一个由TRUE和FALSE值组成的数组。 数组的乘法将TRUE和FALSE分别转换成1和0,并产生最终的查找数组。 正如你所知,乘以0总是得到0,所以在查找数组中,只有符合所有标准的项目才用1表示。 因为我们的查找值是 "1",所以Excel将第一个 "1" lookup_array (第一个匹配)并返回来自 return_array 在同一位置。
为了看到这个公式的作用,让我们从D2:D10中抽取一个金额( return_array ),具备以下条件。
- 标准1(日期)= G1
- 标准2(销售人员)=G2
- 标准3(项目)= G3
与A2:A10中的日期( 标准_范围1 ),B2:B10的销售人员姓名( 标准_范围2 )和C2:C10的项目( 标准_范围3 ),这个公式是这样的。
=xlookup(1, (b2:b10=g1) * (a2:a10=g2) * (c2:c10=g3), d2:d10)
虽然Excel的XLOOKUP函数是处理数组的,但它是作为一个普通的公式工作的,而且是通过通常的回车键完成。
有多个条件的XLOOKUP公式不限于 "等于 "条件,你也可以自由使用其他逻辑运算符。 例如,要过滤G1或更早日期的订单,在第一个条件中放入"<=G1"。
=XLOOKUP(1, (A2:A10<=G1) * (B2:B10=G2) * (C2:C10=G3), D2:D10)
双倍XLOOKUP
要找到某一行和某一列的交叉点上的数值,要执行所谓的 双重查询 或 矩阵查询 是的,Excel的XLOOKUP也可以做到这一点!你只需将一个函数嵌套在另一个函数中。
XLOOKUP( lookup_value1 , lookup_array1 , XLOOKUP( lookup_value2 , lookup_array2 , 数据值 ))这个公式如何运作 : 这个公式是基于XLOOKUP返回整行或整列的能力。 内部函数搜索其查询值并返回相关数据的一列或一行。 该数组进入外部函数作为 return_array .
在这个例子中,我们要找到某位销售人员在某一季度的销售额。 为此,我们在H1(销售人员姓名)和H2(季度)中输入查询值,并通过以下公式进行双向Xlookup。
=xlookup(h1, a2:a6, xlookup(h2, b1:e1, b2:e6))
或者反过来说。
=xlookup(h2, b1:e1, xlookup(h1, a2:a6, b2:e6))
其中A2:A6是销售人员名称,B1:E1是季度(列标题),B2:E6是数据值。
双向查找也可以通过INDEX匹配公式和其他一些方式进行。 更多信息,请参见Excel中的双向查找。
如果错误XLOOKUP
当没有找到查询值时,Excel XLOOKUP会返回一个#N/A的错误。 对于专家级用户来说,这是非常熟悉和可以理解的,但对于新手来说,这可能是相当混乱的。 要用一个用户友好的信息来取代标准的错误符号,在第四个参数中输入你自己的文本,名为 if_not_found .
回到本教程讨论的第一个例子,如果有人在E1中输入一个无效的海洋名称,下面的公式将明确告诉他们 "没有找到匹配"。
=XLOOKUP(E1, A2:A6, B2:B6, "未找到匹配项")
注意事项。
- ǞǞǞ if_not_found 参数只捕获#N/A错误,而不是所有错误。
- #N/A错误也可以用IFNA和VLOOKUP来处理,但语法要复杂一些,而且一个公式要长一些。
区分大小写的XLOOKUP
默认情况下,XLOOKUP函数将小写字母和大写字母视为相同的字符。 要使其对大小写敏感,请使用EXACT函数对 lookup_array 争论。
xlookup(true, exact( 查找_值 , lookup_array ), return_array )这个公式如何运作 : EXACT函数将查找值与查找数组中的每个值进行比较,如果它们完全相同,包括字母大小写,则返回TRUE,否则返回FALSE。 这个逻辑值数组将进入 lookup_array 作为结果,XLOOKUP在上述数组中搜索TRUE值,并从返回数组中返回一个匹配值。
例如,要从B2:B7获取价格( return_array ) 为E1中的项目( lookup_value) ,E2中的公式是。
=XLOOKUP(TRUE, EXACT(E1, A2:A7), B2:B7, "未找到" )
注意:如果在查找数组中有两个或更多完全相同的值(包括字母大小写),将返回第一个找到的匹配值。
Excel XLOOKUP不工作
如果你的配方不能正常工作或导致错误,很可能是由于以下原因。
XLOOKUP在我的Excel中不可用
XLOOKUP函数不向后兼容。 它只在Excel for Microsoft 365和Excel 2021中可用,不会出现在早期版本中。
XLOOKUP返回错误的结果
如果你明显正确的Xlookup公式返回一个错误的值,有可能是查找或返回的范围在公式向下或向对面复制时 "移位 "了。 为了防止这种情况发生,确保总是用绝对的单元格引用锁定两个范围(如$A$2:$A$10)。
XLOOKUP返回#N/A错误
一个#N/A的错误只是意味着没有找到查询值。 要解决这个问题,可以尝试搜索近似的匹配,或者通知你的用户没有找到匹配。
XLOOKUP返回#VALUE错误
如果查找和返回数组的尺寸不兼容,就会发生#VALUE!错误。 例如,不可能在一个水平数组中查找,并从一个垂直数组中返回值。
XLOOKUP返回#REF错误
当在两个不同的工作簿之间查找时,其中一个已经关闭,会出现#REF!错误。 要解决这个错误,只需打开两个文件即可。
正如你刚才所看到的,XLOOKUP有许多了不起的功能,使它成为Excel中几乎所有查找的功能。 我感谢你的阅读,希望下周在我们的博客上看到你。
供下载的实践工作手册
Excel XLOOKUP公式示例(.xlsx文件)。