Excel中的高级VLOOKUP:多重、双重、嵌套

  • Share This
Michael Brown

这些例子将教你如何对多个标准进行Vlookup,返回一个特定的实例或所有的匹配,在多个工作表中做动态Vlookup,以及更多。

这是该系列的第二部分,将帮助你利用Excel VLOOKUP的力量。 这些例子意味着你知道这个函数是如何工作的。 如果没有,那么从Excel中VLOOKUP的基本用途开始就很合理。

在进一步行动之前,让我简单地提醒你一下语法的问题。

VLOOKUP(lookup_value, table_array, col_index_num, [range_lookup] )

现在大家都在同一起跑线上了,让我们仔细看看高级VLOOKUP公式的例子。

    如何Vlookup多个标准

    当涉及到在整个数据库中搜索某个数值时,Excel的VLOOKUP功能确实很有帮助。 然而,它缺少一个重要的功能--它的语法只允许一个查询值。 但是,如果你想用几个条件来查询呢? 有一些不同的解决方案供你选择。

    公式1.有两个标准的VLOOKUP

    假设你有一个订单列表,想根据2个条件找到数量。 客户名称 产品 一个复杂的因素是,每个客户都订购了多个产品,如下表所示。

    在这种情况下,通常的VLOOKUP公式不会起作用,因为它是根据你指定的一个查询值来返回第一个找到的匹配。

    为了克服这个问题,你可以添加一个辅助列,并将两个查询列的值连接起来( 客户 产品 )。 重要的是,帮助列应该是 最左边的 列,因为Excel VLOOKUP总是在这一列搜索查找值。

    因此,在你的表格左边添加一列,并在该列上复制下面的公式。 这将用B列和C列的值来填充辅助列(为了更好地阅读,中间的空格字符是连接起来的)。

    =B2&" "&C2

    然后,使用一个标准的VLOOKUP公式,将两个标准放在 查找_值 参数,用空格隔开。

    =VLOOKUP("Jeremy Sweets", A2:D11, 4, FALSE)

    或者,在不同的单元格(在我们的例子中是G1和G2)中输入标准,然后将这些单元格连接起来。

    =VLOOKUP(G1&" "&G2, A2:D11, 4, FALSE)

    因为我们想从D列返回一个值,D列是表格数组中的第四个,我们用4来表示 col_index_num ...... 范围查询 参数设置为FALSE,以实现Vlookup的精确匹配。 下面的截图显示了结果。

    如果你的查询表是在 另一张 例如,在你的VLOOKUP公式中包括工作表的名称。

    =VLOOKUP(G1&" "&G2, Orders! A2:D11, 4, FALSE)

    或者,为查询表创建一个命名的范围(比如。 订单 ),使公式更容易阅读。

    =VLOOKUP(G1&" "&G2, Orders, 4, FALSE)

    更多信息,请看如何在Excel中从另一个工作表进行Vlookup。

    注意:为了使公式正常工作,辅助列中的值应以完全相同的方式连接在一起。 查找_值 例如,我们在帮助列(B2&" "&C2)和VLOOKUP公式(G1&" "&G2)中都使用空格字符来分隔标准。

    公式2.带有多个条件的Excel VLOOKUP

    理论上,你可以使用上述方法来Vlookup两个以上的标准。 然而,有几个注意事项。 首先,一个查找值被限制在255个字符,其次,工作表的设计可能不允许添加一个帮助列。

    幸运的是,微软Excel经常提供不止一种方法来做同样的事情。 要Vlookup多个标准,你可以使用INDEX MATCH组合或最近在Office 365中引入的XLOOKUP功能。

    例如,要根据3个不同的值进行查询( 日期 , 客户名称 产品 ),使用以下公式之一。

    =index(d2:d11, match(1, (g1=a2:a11) * (g2=b2:b11) * (g3=c2:c11), 0)

    =xlookup(1, (g1=a2:a11) * (g2=b2:b11) * (g3=c2:c11), d2:d11)

    在哪里?

    • G1是标准1(日期)。
    • G2是标准2(客户名称)。
    • G3是标准3(产品)。
    • A2:A11是查询范围1(日期)。
    • B2:B11是查询范围2(客户名称)。
    • C2:C11是查询范围3(产品)。
    • D2:D11是返回范围(数量)。

    注意:在除Excel 365以外的所有版本中,INDEX MATCH应该作为CSE数组公式按Ctrl + Shift + Enter输入。 在支持动态数组的Excel 365中,它也可以作为一个普通公式使用。

    关于公式的详细解释,请参见。

    • 有多个标准的XLOOKUP
    • 具有多个标准的索引匹配公式

    如何使用VLOOKUP获得第2、第3或第n个匹配的信息

    正如你已经知道的,Excel VLOOKUP只能获取一个匹配值,更确切地说,它返回第一个找到的匹配值。 但是,如果你的查找数组中有几个匹配值,而你想获取第2或第3个实例,该怎么办? 这个任务听起来相当复杂,但解决办法确实存在

    公式1.Vlookup第N个实例

    假设你在一栏里有客户的名字,在另一栏里有他们购买的产品,你想找到某个客户购买的第二或第三件产品。

    最简单的方法是像我们在第一个例子中那样,在表的左边添加一个辅助列。 但是这一次,我们将用客户名称和发生数来填充它,比如" John Doe1 ", " John Doe2 ",等等。

    要获得出现的情况,使用COUNTIF函数和混合范围引用(第一个引用是绝对的,第二个是相对的,如$B$2:B2)。 由于相对引用根据复制公式的单元格的位置而改变,在第3行它将成为$B$2:B3,在第4行--$B$2:B4,以此类推。

    与客户名称(B2)串联后,公式为以下形式。

    =B2&COUNTIF($B$2:B2, B2)。

    上述公式进入A2,然后根据需要向下复制到多个单元格。

    之后,在不同的单元格(F1和F2)中输入目标名称和出现次数,并使用下面的公式来Vlookup一个特定的出现次数。

    =VLOOKUP(F1&F2, A2:C11, 3, FALSE)

    公式2.Vlookup第二次出现

    如果你正在寻找查找值的第2个实例,那么你可以不使用辅助列。 相反,通过使用INDIRECT函数和MATCH动态地创建表数组。

    =VLOOKUP(E1, INDIRECT("A"&(MATCH(E1, A2:A11, 0)+2)&":B11"), 2, FALSE.)

    在哪里?

    • E1是查询值
    • A2:A11是查询范围
    • B11是查询表的最后一个单元格(右下角)。

    请注意,上述公式是为查询表中的数据单元从第2行开始的特定情况编写的。 如果你的表在工作表的中间某处,请使用这个通用公式,其中A1是查询表中包含列标题的左上角单元。

    =VLOOKUP(E1, INDIRECT("A"&(MATCH(E1, A2:A11, 0)+1+ROW(A1))& ":B11"), 2, FALSE)

    这个公式如何运作

    这里是公式的关键部分,它创建了一个 动态Vlookup范围 :

    INDIRECT("A"&(MATCH(E1, A2:A11, 0)+2)&" :B11")

    配置为精确匹配的MATCH函数(最后一个参数为0)将目标名称(E1)与名称列表(A2:A11)进行比较,并返回找到的第一个匹配的位置,在我们的例子中是3。 这个数字将被用作vlookup范围的起始行坐标,所以我们给它加2(+1以排除第一个实例,+1以排除第1行的列标题)。另外,你可以使用1+ROW(A1)来根据标题行(在我们的例子中是A1)的位置自动计算出必要的调整。

    结果,我们得到以下文本字符串,INDIRECT将其转换为一个范围引用。

    INDIRECT("A"&5&":B11") -> A5:B11

    这个范围到了 表_数组 VLOOKUP的参数,迫使它从第5行开始搜索,忽略了查找值的第一个实例。

    vlookup(e1, a5:b11, 2, false)

    如何在Excel中进行Vlookup并返回多个值

    Excel的VLOOKUP函数被设计成只返回一个匹配项。 有没有一种方法可以Vlookup多个实例? 是的,有,尽管不是很容易。 这需要综合使用几个函数,如INDEX、SMALL和ROW是一个数组公式。

    例如,下面可以在B2:B16的查询范围内找到所有出现的查询值F2,并从C列返回多个匹配值。

    {=iferror(index($c$2:$c$11, small(if($f$1=$b$2:$b$11, row($c$2:$c$11)-1,""), row()-1)),"") }

    在你的工作表中,有2种方法可以输入公式。

    1. 在第一个单元格中输入公式,按Ctrl + Shift + Enter ,然后向下拖动到其他几个单元格。
    2. 选择单列中相邻的几个单元格(下面截图中的F1:F11),输入公式,按Ctrl + Shift + Enter完成。

    无论哪种方式,你输入公式的单元格数量应该等于或大于可能匹配的最大数量。

    关于公式逻辑的详细解释和更多的例子,请看如何在Excel中VLOOKUP多个值。

    如何在行和列中进行Vlookup(双向查找)。

    双向查询 (aka 矩阵查询 二维查询 在Excel中,有几种不同的方法来进行二维查找,但由于本教程的重点是VLOOKUP函数,我们自然会使用它。

    在这个例子中,我们将利用下表的月度销售额,并制定一个VLOOKUP公式来检索某个月的特定项目的销售数字。

    项目名称在A2:A9,月份名称在B1:F1,目标项目在I1,目标月份在I2,公式如下。

    =vlookup(i1, a2:f9, match(i2, a1:f1, 0), false)

    这个公式如何运作

    该公式的核心是标准的VLOOKUP函数,用于搜索与I1中的查询值完全匹配的数据。 但是,由于我们不知道具体月份的销售额究竟在哪一列,所以我们不能直接向该公式提供列号。 col_index_num 为了找到这一列,我们使用以下MATCH函数。

    匹配(i2, a1:f1, 0)

    翻译成英文,该公式说:查找A1:F1中的I2值,并返回它在数组中的相对位置。 通过给第三个参数提供0,你指示MATCH找到与查找值完全相等的值(这就像用FALSE表示 范围查询 VLOOKUP的参数)。

    是在查找数组中的第4列,MATCH函数返回4,这将直接进入 col_index_num VLOOKUP的参数。

    vlookup(i1, a2:f9, 4, false)

    请注意,虽然月份名称从B列开始,但我们使用A1:I1作为查询数组。 这样做是为了使MATCH返回的数字与该列在《中国统计年鉴》中的位置相对应。 表_数组 的VLOOKUP。

    要了解在Excel中执行矩阵查询的更多方法,请看INDEX MATCH MATCH和其他二维查询的公式。

    如何在Excel中做多个Vlookup(嵌套Vlookup)?

    有时可能发生的情况是,你的主表和查询表没有一个共同的列,这使你无法在两个表之间做Vlookup。 然而,存在另一个表,它不包含你正在寻找的信息,但与主表有一个共同的列,与查询表有另一个共同的列。

    下面的图片说明了这种情况。

    我们的目标是将价格复制到主表,根据 项目IDs 问题是,包含价格的表格中没有 项目IDs 这意味着我们将不得不在一个公式中做两个Vlookups。

    为方便起见,让我们先创建几个命名的范围。

    • 查询表1被命名为 产品 (D3:E10)
    • 查询表2被命名为 价格 ( G3:H10 )

    这些表格可以在同一或不同的工作表中。

    而现在,我们将执行所谓的 双重Vlookup ,又名 嵌套Vlookup .

    首先,做一个VLOOKUP公式,在查找表1中查找产品名称(名为 产品 ) 基于项目ID(A3)。

    =VLOOKUP(A3, Products, 2, FALSE)

    接下来,将上述公式放入 查找_值 另一个VLOOKUP函数的参数,从查询表2中提取价格(名为 价格 ) 基于嵌套的VLOOKUP返回的产品名称。

    =VLOOKUP(VLOOKUP(A3, Products, 2, FALSE), Prices, 2, FALSE)

    下面的截图显示了我们的嵌套Vlookup公式的运行情况。

    如何动态地Vlookup多个工作表

    有时,你可能有相同格式的数据被分割到几个工作表中,而你的目的是根据某个单元格的关键值从特定的工作表中提取数据。

    这一点从一个例子中可能更容易理解。 假设,你有几个相同格式的区域销售报告,你希望得到某个特定产品在某些地区的销售数字。

    像前面的例子一样,我们从定义几个名字开始。

    • CA表的A2:B5范围被命名为 CA_Sales .
    • FL表的A2:B5范围被命名为 FL_Sales .
    • KS表的A2:B5范围被命名为 KS_Sales .

    正如你所看到的,所有命名的范围都有一个共同的部分( 销售 )和独特的部分( CA , FL , 锦州 请确保以类似的方式命名你的范围,因为这对我们将要建立的公式至关重要。

    公式1.INDIRECT VLOOKUP,动态地从不同的工作表中提取数据

    如果你的任务是检索多个工作表的数据,VLOOKUP INDIRECT公式是最好的解决方案--紧凑且易于理解。

    对于这个例子,我们以这种方式组织汇总表。

    • 在A2和A3中输入感兴趣的产品,这些是我们的查询值。
    • 在B1、C1和D1中输入命名范围的唯一部分。

    现在,我们将包含唯一部分(B1)的单元格与普通部分("_Sales")连接起来,并将结果字符串送入INDIRECT。

    INDIRECT(B$1&"_Sales")

    INDIRECT函数将字符串转换为Excel可以理解的名称,你将它放在 表_数组 VLOOKUP的参数。

    =VLOOKUP($A2, INDIRECT(B$1& "_Sales"), 2, FALSE)

    上面的公式到了B2,然后你把它向下和向右复制。

    请注意,在查找值($A2)中,我们用绝对单元格引用锁定了列坐标,这样当公式被复制到右边时,该列保持固定。 在B$1引用中,我们锁定了行,因为我们希望列坐标改变,并根据公式被复制到的列,向INDIRECT提供一个适当的名称部分。

    如果你的主表组织方式不同,查询值在一行,范围名称的唯一部分在一列,那么你应该在查询值中锁定行坐标(B$1),在名称部分锁定列坐标($A2)。

    =VLOOKUP(B$1, INDIRECT($A2& "_Sales"), 2, FALSE)

    公式2.VLOOKUP和嵌套IF来查询多个工作表

    在你只有两到三个查询表的情况下,你可以使用一个相当简单的VLOOKUP公式和嵌套的IF函数,根据特定单元格的关键值选择正确的表。

    =VLOOKUP($A2, IF(B$1="CA", CA_Sales, IF(B$1="FL", FL_Sales, IF(B$1="KS", KS_Sales")), 2, FALSE)

    其中$A2是查询值(项目名称),B$1是关键值(状态)。

    在这种情况下,你不一定需要定义名称,可以使用外部引用来引用另一个工作表或工作簿。

    更多的公式例子,请看如何在Excel中跨多个工作表进行VLOOKUP。

    这就是在Excel中使用VLOOKUP的方法。 感谢你的阅读,希望下周能在我们的博客上见到你

    供下载的实践工作手册

    高级VLOOKUP公式示例(.xlsx文件)。

    Michael Brown is a dedicated technology enthusiast with a passion for simplifying complex processes using software tools. With more than a decade of experience in the tech industry, he has honed his skills in Microsoft Excel and Outlook, as well as Google Sheets and Docs. Michael's blog is dedicated to sharing his knowledge and expertise with others, providing easy-to-follow tips and tutorials for improving productivity and efficiency. Whether you're a seasoned professional or a beginner, Michael's blog offers valuable insights and practical advice for getting the most out of these essential software tools.