Table of contents
本教程展示了如何使用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多个工作表,请执行以下步骤。
- 在工作簿的某处写下所有的查询表名称,并将该范围命名为( 查阅表(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)。
结果,我们得到的公式是在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文件)。