Excel 仅当WB打开时,使用IndexMatch或Vlookup引用不同工作簿中的表才有效

Excel 仅当WB打开时,使用IndexMatch或Vlookup引用不同工作簿中的表才有效,excel,vba,Excel,Vba,Excel 2013 64位,赢得7分 目标=在公式中使用索引匹配的已关闭工作簿中的表名引用(或vLookup,如果需要,解决方法) 看起来很简单,但在关闭引用表工作簿后重新计算时,这些都不起作用。这一个应该有效,我尝试了很多其他的事情,但没有成功。(编辑:我的理解是,不可能在一个封闭的工作簿中引用一个表?转到底部解决方案) 仅当工作簿打开时有效,关闭时显示#REF! =索引('C:\Vendors.xlsm'!VendName[[#All],[Qty]],匹配(A1,'C:\Vendors.x

Excel 2013 64位,赢得7分

目标=在公式中使用索引匹配的已关闭工作簿中的表名引用(或vLookup,如果需要,解决方法)

看起来很简单,但在关闭引用表工作簿后重新计算时,这些都不起作用。这一个应该有效,我尝试了很多其他的事情,但没有成功。(编辑:我的理解是,不可能在一个封闭的工作簿中引用一个表?转到底部解决方案)

仅当工作簿打开时有效,关闭时显示#REF!
=索引('C:\Vendors.xlsm'!VendName[[#All],[Qty]],匹配(A1,'C:\Vendors.xlsm'!VendName[#All],[SKU]],0))

对于vlookup,同样的事情,它只在工作簿打开时才起作用

=VLOOKUP(A1,'C:\Vendors.xlsm'!VendName[#All],3,0)
但是,如果我使用命名范围而不是表,它将工作

=VLOOKUP(A1,'C:\Vendors.xlsm'!VendName,3,0)
那么为什么不使用名称范围和索引匹配呢?我不知道如何告诉索引匹配使用指定范围的特定列,就像我使用表一样。ie在表名后面加上[#All]、[SKU]]。而且我发现很难相信你不能在一个封闭的工作簿中引用一个表,我一定是错过了正确的解决方案

我在第一个公式中做错了什么,这样当表WB关闭时它就不起作用了?我如何使用命名范围,但告诉它在索引匹配公式中引用命名范围的第三行

更新:我认为我需要抛弃外部表,只使用外部常规名称范围,但如何引用名称范围/2列

=INDEX(ExcelFile.xlsx!NamedRange,MATCH(F4,ExcelFile.xlsx!NamedRange,0))
在本例中,命名范围为5列宽,如何告诉它与第一行匹配并引用第三行。Ie=索引(ExcelFile.xlsx!NamedRange,第(2)行或其他什么


我不知道如何告诉Index match使用命名范围的特定列。在下面:Name range指的是a:D列。硬编码匹配第3列末尾的数据非常好。但导致此公式失败的是第二次使用NameRange。公式需要引用B列(范围NameRange的第二列).我该如何强制呢?类似于NameRange[Column2](我制定了表达目标的格式)

=索引(名称范围,匹配(H10,名称范围,0),3)

您可以执行一个索引(data_table,match1,match2),该索引通过比较搜索项与引用列来提取match1,并通过比较搜索项与引用行来提取match2

ie:假设数据表工作簿上的引用列是A:A。假设引用行(用于标题)是1:1

设置3个命名范围:

(1) A1:Z100=“FullData”将完整数据表显示为二维范围。 (2) A:A=“ItemIndex”仅显示参考列。 (3) 1:1=“HeaderIndex”仅显示参考行

在结果工作簿中引用此项的公式为:

=INDEX('C:\Vendors.xlsm'!FullData,MATCH($A1,'C:\Vendors.xlsm'!ItemIndex,0),MATCH("HEADER NAME TO MATCH",'C:\Vendors.xlsm'!HeaderIndex,0))
用它来引用一本封闭的书可能会有一些更广泛的问题,但我对这个一般过程不太熟悉,所以有人可能会想一个更好的方法让你整体上做到这一点。这至少回答了你最初提出的用你的方法来做这件事的问题

编辑

由于您有20多个表,并且标题总是以相同的顺序排列,因此您可以像这样简单地使用建议的vlookup;这将避免您需要为每个选项卡声明3个名称范围;相反,您只需要为每个选项卡创建一个命名范围,如下所示:

=vlookup(A1,'C:\Vendors.xlsm'!FullData,5)
这将硬编码以拉入第5列,正如您所说,表格之间的标题相同,不会改变。要使其从所需的标题中拉入,请在“结果”选项卡中创建一个搜索索引行(假设第2页的第1行,单元格B1中的标题搜索词):


我的结论如下:

  • 无法为索引匹配和vLookup引用已关闭工作簿中的表。请使用简单的名称范围

  • 下面是如何对包含多个列的NameRanges使用索引匹配。 =索引(名称范围,匹配(H10,索引(名称范围,0,1),0),3)

  • 针对第一个NameRange的返回值列的具体解决方案是添加该结尾,3)从而在第三列中返回值

    指定要匹配的查找列的解决方案不是只放置匹配项(A1,NameRange,.use match(A1,INDEX(NameRange,0,1)),而是告诉它使用该命名范围中的第一列


    此解决方案允许您为标准表格布局编写一个公式,只需更改每个范围的名称并跨范围应用。然后,我可以将此公式与间接公式一起使用,以便整个工作表中的公式都可以引用顶部的辅助单元格,这样在添加更多供应商时就不必更改它。

    感谢此方法,但它确实如此似乎不适合我的需要。我必须为20个表(供应商)中的每个表创建3个唯一的范围,这缺乏我想要的灵活性和简单性。而且它们的标题在同一行中,具有相同的值。我需要能够使用一个表名或每个供应商的NamedRange来实现这一点。@Bryan有两件事:(1)在制定问题的时候,你应该包括这样的细节——你提供的信息越多,就越容易看出什么对你有实际帮助如果标题相同,则无需为每个选项卡创建名为Range的标题,只需对结果工作簿上创建的单个标题选项卡使用匹配函数即可。如果数字永远不会更改,甚至可以硬编码数字。请参阅我的编辑以解决此问题。1)注意,谢谢。2)是的,这个Vlookup正在与NamedRange合作,感谢您提供了灵活的替代方案,但在我的设置中,硬代码可以工作。但是,我意识到您不能以这种方式引用封闭工作簿中的表。因此,我将只使用NameRange。这是迄今为止我拥有的最好的解决方案,但我想尝试使用索引匹配来实现这一点。(这是一个庞大的设置,需要大量的同时计算。)
        =vlookup(A1,'C:\Vendors.xlsm'!FullData,MATCH(B1,Sheet2!1:1,0))