动态引用给定工作簿的单元格内的另一个工作簿

时间:2018-04-09 20:08:05

标签: excel

我有一个工作簿wkb1,其中有一个单元格,其中包含一个数据验证列表,该列表基于另一个工作簿wkb2中的某些列数组(名称可以说)。此列旁边是许多其他列,其中包含与这些名称对应的数据(让我们说年龄,生日等)。在wkb1中,我通过=OFFSET([wkb1]Sheet1!A3, MATCH(...), colsindex)公式在各种单元格中获取这些数据。

现在,想象一下,wkb2有大量同类的工作簿,只有不同的数据(不同的名字,年龄,生日)。我想要做的是:在一张wkb1张中的某个单元格中,我会输入wkb2之一的路径,然后输入所有单元格({ {1}})我有上述公式加上包含验证列表的单元格,我希望wkb1成为路径所指向的公式。

1 个答案:

答案 0 :(得分:1)

我不相信可以在包含工作簿路径的字符串上使用INDIRECT。

使用Mac Excel 2016,以下内容可直接在单元格中使用:

{=' /用户/ XXXX /桌面/ [Book1.xlsx] Sheet 1中' $ A $ 1:$ B $ 2}

{= INDIRECT("' /用户/ XXXX /桌面/ [Book1.xlsx] Sheet 1中' $ A $ 1:$ B $ 2")}

给出#REF!

没有路径,两者都有效:

{=' [Book1.xlsx] Sheet 1中' $ A $ 1:$ B $ 2}

{= INDIRECT("' [Book1.xlsx] Sheet 1中' $ A $ 1:$ B $ 2")}

(虽然INDIRECT是易变的,而第一个版本不是)

网上有一个建议,定义如下名称可行: 在一些单元格中,$ H $ 6说,放置路径字符串(例如,' / Users / xxxx / Desktop / [Book1.xlsx] Sheet1'!$ A $ 1:$ B $ 2)

使用Insert>名称>使用以下值定义名称,创建名称,例如ExternalRange: =评估(Sheet 1中!$ H $ 6)

在工作簿中,= ExternalRange应该为您提供外部工作簿值。 对我来说,这只有在$ H $ 6中的字符串不包含路径时才有效。换句话说,与INDIRECT完全相同的行为。 (请注意,将字符串放入以&#39开头的单元格中需要额外的开头。但我不认为这是问题的根源,因为我观察到同样的行为打字直接使用字符串,这样就不需要额外的'

对于你的问题,无论如何我会尝试不同的方法。 OFFSET和INDIRECT都是易失性的,每次工作表重新计算时都会重新计算,而不是仅在输入更改时重新计算。这有可能造成巨大的性能损失。

要创建从单独的工作表填充的验证,我将使用使用INDEX和MATCH定义的名称。我最后给出了一个例子。

为了能够动态更改包含验证信息的源工作簿,我将采取的方法取决于:

(1)您是否需要同时使用来自众多wkb2的值? 要么 (2)您是否需要能够在各种wkb2之间动态切换,但是一次只能使用单个wkb2中的数据?

另外,wkb2的预先设定是否已知?或者用户可以键入wkb2的任意路径吗?

根据上面的答案,我要么创建一堆链接(通过名称)到完整的可能的wkb2(假设设置的大小不是太大),然后动态更改哪个名称我的验证指向(可能使用CHOOSE,再次通过名称),或者我会根据需要更改单个链接的来源。我只知道如何使用界面(数据>编辑链接...>更改源)或通过VBA(Workbook.ChangeLink方法)更改链接的来源。请注意,如果您有链接,则仅显示“编辑链接...”菜单项。

如果我不得不采用这种方法,我会选择将路径放到单元格中,提供一个链接到VBA并进行更改的按钮,但我想可以有一个自定义的VBA功能采用路径并更改链接。就个人而言,我认为使用自定义VBA功能会很难看。即使使用链接到VBA的按钮也不是很好,所以如果可能的话,我会选择预定义所有可能的链接。 (我可能会使用VBA,但这将是一次使用的VBA,而不是最终电子表格的一部分。)

以下是我设置验证以避免使用OFFSET或INDIRECT的方法,以及将来更容易更改验证数据。

(1)在wkb2中,我在单元格$ A $ 1到$ C $ 5中有以下数据:

Name    Gender  Age
Peter   Male    23
Sally   Female  21
Roger   Male    34
Abad    Male    27

(2)在wkb2中,使用Insert>定义以下名称。名称>定义名称,(或者如果你做了很多的话,用VBA):

Header1 =Sheet1!$A$1:$C$1 (The Sheet1! makes it a local name)
Data1 =Sheet1!$A$2:$C$5 (The Sheet1! makes it a local name)

我更喜欢使用仅在特定工作表上定义的本地名称,这使得在同一工作簿中复制工作表更容易。它们确实要求您使用sheetname引用名称(因此Sheet1!Data1而不仅仅是Data1)。如果您愿意,全局名称也可以在此示例中使用。

(3)在wkb1中,定义以下名称:

NameValidation =INDEX([wkb2.xlsx]Sheet1!Data1,,MATCH("Name",[wkb2.xlsx]Sheet1!Header1,0))

NameValidation现在引用"名称" wkb2的Data1中的列。您可以调整Data1的大小,插入新列,更改列的顺序等,NameValidation仍然会指向" Name"柱。或者,您也可以将wkb2中的名称定义为仅列。所以" Names"的名称," Gender"等的不同名称。如果数据长度不同,或者数据不在每个数据旁边,这将是一个很好的方法另外在wkb2上。

(4)在wkb1中,使用数据>验证>设置:允许列表并选择源为= NameValidation(请注意,我不认为可以放置公式= INDEX([wkb2.xlsx] Sheet1!Data1 ,, MATCH(" Name&#34) ;,[wkb2.xlsx] Sheet1!Header1,0))直接进入验证。我相信你需要通过名称,例如我使用NameValidation)