在Excel中跨越多个工作表的VLOOKUP与实例

  • Share This
Michael Brown

本教程展示了如何使用VLOOKUP函数从另一个工作表或工作簿中复制数据,在多个工作表中进行Vlookup,以及动态查找,将不同工作表中的数值返回到不同的单元格中。

在Excel中查找一些信息时,所有的数据都在同一张工作表上的情况很少。 更多的时候,你必须在多个工作表甚至不同的工作簿上进行搜索。 好消息是,微软Excel提供了不止一种方法,坏消息是,所有的方法都比标准的VLOOKUP公式要复杂一些。 但只要有一点耐心,我们就可以会想办法解决的 :)

    如何在两个工作表之间进行VLOOKUP

    首先,让我们研究一个最简单的案例--使用VLOOKUP从另一个工作表中复制数据。 这与在同一工作表中搜索的普通VLOOKUP公式非常相似。 不同的是,你在搜索中包括工作表名称。 表_数组 参数来告诉你的公式,查找范围位于哪个工作表中。

    从另一个工作表进行VLOOKUP的通用公式如下。

    VLOOKUP(lookup_value, 板块!范围 , col_index_num, [range_lookup])

    作为一个例子,让我们拉出以下的销售数字 报告给 摘要 为此,我们定义了以下参数。

    • 查询值 是在A栏中的 摘要 工作表,我们指的是第一个数据单元格,也就是A2。
    • 表_数组 要引用它,请在引用范围前加上工作表的名称和感叹号:Jan!$A$2:$B$6.这就是Jan工作表的A2:B6范围。

      请注意,我们用绝对的单元格引用来锁定该区域,以防止将公式复制到其他单元格时发生变化。

      Col_index_num 是2,因为我们想从B列复制一个值,这是表格数组中的第2列。

    • 范围_查询 被设置为FALSE,以查找精确匹配。

    把这些论点放在一起,我们得到这个公式。

    =VLOOKUP(A2, Jan! $A$2:$B$6, 2, FALSE)

    向下拖动公式,你会得到这样的结果。

    以类似的方式,你可以用Vlookup数据从 2月 片。

    =VLOOKUP(A2, Feb!$A$2:$B$6, 2, FALSE)

    =VLOOKUP(A2, Mar! $A$2:$B$6, 2, FALSE)

    提示和说明。

    • 如果工作表名称包含 空间 非字母字符 ,它必须用单引号括起来,如 '一月销售'!$A$2:$B$6 欲了解更多信息,请参见如何在Excel中引用另一个工作表。
    • 与其在公式中直接输入工作表名称,你可以切换到查找工作表,并在那里选择范围,Excel将自动插入一个具有正确语法的参考,省去你检查名称和排除故障的麻烦。

    来自不同工作簿的Vlookup

    要在两个工作簿之间进行VLOOKUP,在方括号中包括文件名,然后是工作表名称和感叹号。

    例如,要在A2:B6范围内搜索A2值,在 列表中的 销售报告.xlsx 工作簿,使用这个公式。

    =VLOOKUP(A2, [Sales_reports.xlsx]Jan! $A$2:$B$6, 2, FALSE)

    完整的细节,请看Excel中另一个工作簿的VLOOKUP。

    用IFERROR在多个工作表中进行Vlookup

    当你需要在两个以上的工作表之间进行查询时,最简单的解决方案是将VLOOKUP与IFERROR结合使用。 其思路是将几个IFERROR函数嵌套在一起,逐一检查多个工作表:如果第一个VLOOKUP在第一个工作表上没有找到匹配,就在下一个工作表上进行搜索,以此类推。

    iferror(vlookup(...), iferror(vlookup(...), ..., " 未找到 "))

    为了了解这种方法在现实生活中的数据是如何运作的,让我们考虑下面的例子。 下面是 摘要 表,我们希望通过在数据库中查找订单号来填充物品名称和金额。 西部 东部 片。

    首先,我们要拉出项目。 为此,我们指示VLOOKUP公式来搜索A2中的订单号,在 东部 表,并返回B列的值(在第2列的 表_数组 A2:C6)。 如果没有找到完全匹配,则在 西部 如果两个Vlookups都失败了,返回 "未找到"。

    =IFERROR(VLOOKUP(A2, East!$A$2:$C$6, 2, FALSE), IFERROR(VLOOKUP(A2, West!$A$2:$C$6, 2, FALSE), "未找到" ))

    要返回金额,只需将列索引号改为3。

    =IFERROR(VLOOKUP(A2, East!$A$2:$C$6, 3, FALSE), IFERROR(VLOOKUP(A2, West!$A$2:$C$6, 3, FALSE), "未找到" ))

    提示:如果需要,你可以为不同的VLOOKUP函数指定不同的表阵列。 在这个例子中,两个查找表都有相同的行数(A2:C6),但你的工作表可能大小不同。

    多个工作簿中的Vlookup

    要在两个或多个工作簿之间进行Vlookup,请将工作簿名称放在方括号内,并放在工作表名称之前。 例如,你可以在以下情况下Vlookup 两个不同的文件 ( 第一册 第二册 ),只用一个公式。

    =IFERROR(VLOOKUP(A2, [Book1.xlsx]East!$A$2:$C$6, 2, FALSE), IFERROR(VLOOKUP(A2, [Book2.xlsx]West!$A$2:$C$6, 2, FALSE), "未找到" )。

    使列的索引号成为动态的Vlookup多列

    当你需要从几个列中返回数据时,使 col_index_num 动态可以为你节省一些时间。 有几项调整要做。

    • 对于 col_index_num 参数,使用COLUMNS函数返回指定数组中的列数:COLUMNS($A$1:B$1)。 行坐标并不重要,可以是任何行。
    • 查找_值 参数,用$符号($A2)锁定列的引用,所以当把公式复制到其他列时,它仍然是固定的。

    结果,你得到一种动态公式,从不同的列中提取匹配的值,这取决于公式被复制到哪一列。

    =IFERROR(VLOOKUP($A2, East!$A$2:$C$6, COLUMNS($A$1:B$1), FALSE), IFERROR(VLOOKUP($A2, West!$A$2:$C$6, COLUMNS($A$1:B$1), FALSE), "未找到")

    当输入B列时,COLUMNS($A$1:B$1)评估为2,告诉VLOOKUP从表数组的第二列返回一个值。

    当复制到C列时(即你把公式从B2拖到C2),B$1变为C$1,因为列的引用是相对的。 因此,COLUMNS($A$1:C$1)被评估为3,迫使VLOOKUP从第三列返回一个值。

    这个公式对2-3个查询表非常有效,如果你有更多的查询表,重复的IFERRORs就会变得太麻烦。 下一个例子展示了一个更复杂但更优雅的方法。

    用INDIRECT查找多个工作表的Vlookup

    还有一种在Excel的多个工作表之间进行Vlookup的方法是使用VLOOKUP和INDIRECT函数的组合。 这种方法需要一点准备工作,但最终你会有一个更紧凑的公式在任何数量的电子表格中进行Vlookup。

    一个跨工作表的Vlookup通用公式如下。

    VLOOKUP( 查找_值 , INDIRECT("'"&INDEX( 查阅表(Lookup_sheets , MATCH(1, --(COUNTIF(INDIRECT(" '" & 查阅表(Lookup_sheets & "'! 查找_范围 "), 查找_值 )>0), 0)) & "'! 表_数组 "), col_index_num , FALSE)

    在哪里?

    • 查阅表(Lookup_sheets - 一个由查询表名称组成的命名范围。
    • 查询_价值 - 要搜索的值。
    • 查询_范围 - 在查询表中搜索查询值的列范围。
    • 表_数组 - 查询表中的数据范围。
    • Col_index_num - 表数组中的列的编号,从该列返回一个值。

    为使该公式正确工作,请牢记以下注意事项。

    • 这是一个数组公式,必须通过同时按下Ctrl + Shift + Enter键来完成。
    • 所有的床单必须有 列的顺序相同 .
    • 由于我们对所有的查询表都使用一个表阵列,所以指定 最大范围 如果你的工作表有不同的行数。

    如何使用公式进行跨工作表的Vlookup?

    要一次Vlookup多个工作表,请执行以下步骤。

    1. 在工作簿的某处写下所有的查询表名称,并将该范围命名为( 查阅表(Lookup_sheets 在我们的案例中)。

  • 根据你的数据调整通用公式。 在这个例子中,我们将是。
    • 搜索A2值( 查找_值 )
    • 在A2:A6范围内( 查找_范围 )的四个工作表( 东部 , 北方 , 南方 西部 ),以及
    • 从B列拉出匹配的值,也就是第2列( col_index_num )的数据范围A2:C6 ( 表_数组 ).

    有了上述参数,该公式就有了这样的形状。

    =VLOOKUP($A2, INDIRECT("'"&INDEX(Lookup_sheets, MATCH(1, --(COUNTIF(INDIRECT("'"& Lookup_sheets& "'!$A$2:$A$6"), $A2)>0), 0)) & "'!$A$2:$C$6"), 2, FALSE.)

    请注意,我们用绝对的单元格引用锁定了两个范围($A$2:$A$6和$A$2:$C$6)。

  • 在最上面的单元格(本例中为B2)中输入公式,并按Ctrl + Shift + Enter完成。
  • 双击或拖动填充柄,将公式向下复制到该列。
  • 结果,我们得到的公式是在4张表中查找订单号并检索相应的项目。 如果没有找到特定的订单号,就会像第14行那样显示#N/A错误。

    要返回金额,只需将2替换为3即可。 col_index_num 参数,因为金额在表格阵列的第3列。

    =VLOOKUP($A2, INDIRECT("'"&INDEX(Lookup_sheets, MATCH(1, --(COUNTIF(INDIRECT("'" & Lookup_sheets & "'!$A$2:$A$6"), $A2)>0), 0)) & "'!$A$2:$C$6", 3, FALSE.)

    如果你想用你自己的文字取代标准的#N/A错误符号,请将公式包入IFNA函数。

    =IFNA(VLOOKUP($A2, INDIRECT("'"&INDEX(Lookup_sheets, MATCH(1, --(COUNTIF(INDIRECT("'" & Lookup_sheets & "'!$A$2:$A$6"), $A2)>0), 0)) & "'!$A$2:$C$6"), 3, FALSE), "未找到" )

    在工作簿之间Vlookup多个工作表

    这个通用公式(或其任何变化)也可用于Vlookup多个工作表的 不同的工作簿 为此,在INDIRECT内连接工作簿名称,如下面公式所示。

    =IFNA(VLOOKUP($A2, INDIRECT("'[Book1.xlsx]" & INDEX(Lookup_sheets, MATCH(1, --(COUNTIF(INDIRECT("'[Book1.xlsx]" & Lookup_sheets & "'!$A$2:$A$6"), $A2)>0)) & "'!$A$2:$C$6"), 2, FALSE), "未找到")

    在工作表之间进行Vlookup并返回多列

    如果你想从几个列中提取数据,一个 多单元阵列公式 要创建这样一个公式,需要提供一个数组常数给 col_index_num 争论。

    在这个例子中,我们希望返回项目名称(B列)和金额(C列),它们分别是表格数组中的第2列和第3列。 因此,需要的数组是{2,3}。

    =VLOOKUP($A2, INDIRECT("'"&INDEX(Lookup_sheets, MATCH(1, --(COUNTIF(INDIRECT(""& Lookup_sheets &"'!$A$2:$C$6"), $A2)>0), 0)) & "'!$A$2:$C$6"), {2,3}, FALSE.)

    为了在多个单元格中正确输入公式,你需要这样做。

    • 在第一行,选择所有要填充的单元格(在我们的例子中是B2:C2)。
    • 键入公式并按Ctrl + Shift + Enter 。 这将在选定的单元格中输入相同的公式,这将在每一列中返回不同的值。
    • 向下拖动公式到剩余的行。

    这个公式如何运作

    为了更好地理解这个逻辑,让我们把这个基本公式分解到各个函数中。

    =VLOOKUP($A2, INDIRECT("'"&INDEX(Lookup_sheets, MATCH(1, --(COUNTIF(INDIRECT("'"& Lookup_sheets& "'!$A$2:$A$6"), $A2)>0), 0)) & "'!$A$2:$C$6"), 2, FALSE.)

    由内而外的工作,以下是该公式的作用。

    COUNTIF和INDIRECT

    简而言之,INDIRECT建立了所有查询表的引用,COUNTIF计算查询值(A2)在每个表中的出现次数。

    --(COUNTIF( INDIRECT( "'"&Lookup_sheets&"'!$A$2:$A$6"), $A2)>0)

    更详细地说。

    首先,你把范围名称(Lookup_sheets)和范围引用($A$2:$A$6)连接起来,在适当的地方加上撇号和感叹号,形成一个外部引用,然后把得到的文本字符串送入INDIRECT函数,以动态引用查找表。

    INDIRECT({"'东'!$A$2:$A$6";"'南'!$A$2:$A$6";"'北'!$A$2:$A$6";"'西'!$A$2:$A$6"})

    COUNTIF检查每个查询表A2:A6范围内的每个单元格与主表A2中的值,并返回每个表的匹配计数。 在我们的数据集中,A2中的订单号(101)是在 西部 表,它在命名的范围内是第4个,所以COUNTIF返回这个数组。

    {0;0;0;1}

    接下来,你将上述数组的每个元素与0进行比较。

    --({0; 0; 0; 1}>0)

    这产生了一个TRUE(大于0)和FALSE(等于0)值的数组,你通过使用双单数(--)将其强制为1和0,并得到以下数组作为结果。

    {0; 0; 0; 1}

    这个操作是一个额外的预防措施,以处理一个查询表包含多个查询值出现的情况,在这种情况下,COUNTIF将返回一个大于1的计数,而我们希望最终的数组中只有1和0(稍后,你会明白为什么)。

    在所有这些转换之后,我们的公式看起来如下。

    VLOOKUP($A2, INDIRECT("'"&INDEX(Lookup_sheets, MATCH(1, {0;0;0;1} , 0)) &"'!$A$2:$C$6"), 2, FALSE)

    INDEX和MATCH

    在这一点上,一个经典的INDEX MATCH组合介入了。

    INDEX(Lookup_sheets, MATCH(1, {0;0;0;1}, 0))

    配置为精确匹配的MATCH函数(最后一个参数为0)在数组{0;0;0;1}中寻找值1并返回其位置,即4。

    INDEX(Lookup_sheets, 4)

    INDEX函数使用MATCH返回的数字作为行号参数(row_num),并返回指定范围内的第四个值 查阅表(Lookup_sheets ,这就是 西部 .

    因此,该公式进一步简化为

    VLOOKUP($A2, INDIRECT("'"&" West "&"'! $A$2:$C$6"), 2, FALSE)

    VLOOKUP和INDIRECT

    INDIRECT函数处理其内部的文本字符串。

    INDIRECT("'"& "West"&"'! $A$2:$C$6")

    并将其转换为一个引用,转到 表_数组 VLOOKUP的参数。

    VLOOKUP($A2, 'West'! $A$2:$C$6 , 2, FALSE)

    最后,这个非常标准的VLOOKUP公式在A2:C6范围的第一列中搜索A2值。 西部 就这样了!"。

    动态VLOOKUP,将多个工作表的数据返回到不同的单元格中

    首先,让我们定义一下 "动态 "一词在这里的确切含义,以及这个公式将与之前的公式有什么不同。

    如果你有大块相同格式的数据被分割在多个电子表格中,你可能想从不同的表格中提取信息到不同的单元格中。 下面的图片说明了这个概念。

    与之前基于唯一标识符从特定工作表中提取数值的公式不同,这次我们希望一次从几个工作表中提取数值。

    这项任务有两种不同的解决方案。 在这两种情况下,你都需要做一些准备工作,为每个查询表的数据单元格创建命名的范围。 在这个例子中,我们定义了以下范围。

    • 东方_销售 - 东片的A2:B6
    • 北方_销售 - 北片的A2:B6
    • 南方_销售 - 南片的A2:B6
    • 西方_销售 - 西表的A2:B6

    VLOOKUP和嵌套的IFs

    如果你有合理数量的工作表需要查询,你可以使用嵌套的IF函数,根据预定义单元格(在我们的例子中是B1到D1单元格)中的关键词来选择工作表。

    有了A2中的查询值,公式如下。

    =VLOOKUP($A2, IF(B$1="东", East_Sales, IF(B$1="北", North_Sales, IF(B$1="南", South_Sales, IF(B$1="西", West_Sales)))), 2, FALSE)

    翻译成英文后,中频段的内容是:"中频段"。

    如果B1是 东部 ,在名为的范围内寻找 东方_销售 如果B1是 北方 ,在名为的范围内寻找 北方_销售 如果B1是 南方 ,在名为的范围内寻找 南方_销售 ;而如果B1是 西部 ,在名为的范围内寻找 西方_销售 .

    由IF返回的范围是到 表_数组 的VLOOKUP,它从相应工作表的第2列拉出一个匹配值。

    对查找值($A2--绝对列和相对行)和IF的逻辑测试(B$1--相对列和绝对行)巧妙地使用了混合引用,允许将公式复制到其他单元格而不做任何改变--Excel根据行和列的相对位置自动调整引用。

    因此,我们在B2中输入公式,根据需要向右和向下复制到许多列和行,得到以下结果。

    间接的Vlookup

    当处理许多工作表时,多个嵌套层可能使公式过于冗长和难以阅读。 一个更好的方法是创建一个 动态Vlookup范围 在INDIRECT的帮助下。

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

    在这里,我们将包含命名区域唯一部分(B1)和共同部分(_Sales)的单元格的引用连接起来。 这产生了一个类似 "East_Sales "的文本字符串,INDIRECT将其转换为Excel可以理解的区域名称。

    结果,你得到了一个紧凑的配方,在任何数量的纸张上都能很好地工作。

    这就是如何在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.