使用 INDIRECT 在封闭的 Excel 工作簿中引用值?

Referencing value in a closed Excel workbook using INDIRECT?

提问人:Chris 提问时间:2/12/2015 最后编辑:Chris 更新时间:10/12/2023 访问量:178288

问:

我想使用公式(不是 VBA!工作表名称存储为变量(在以下示例中,C13 为“Sheet2”)。

如果另一个文件处于打开状态,则以下工作正常:

=INDIRECT("[myExcelFile.xlsm]" & C13 & "!$A$1")

如果文件已关闭,则上述公式不起作用,因为没有给出绝对路径。但是我通过以下方式让它工作(注意“而不是”:

='C:\data\[myExcelFile.xlsm]Sheet2'!$A$1

现在我想用动态引用值替换硬编码的“Sheet2”,即 C13(如第一个代码片段所示)。

有没有人知道不使用 VBA 或其他库的解决方案?

excel-公式

评论


答:

14赞 Ben I. 2/12/2015 #1

使用标准公式绝对没有办法做到这一点。然而,可以在这里找到一个疯狂的答案。它仍然避免了 VBA,并且允许您动态获取结果。

  1. 首先,制作将生成公式的公式,但不要在开头添加!=

  2. 让我们假设您已经在 的单元格中创建了这个公式,并且您希望在列中计算该公式。B2Sheet1c

  3. 现在,转到“公式”选项卡,然后选择“定义名称”。给它起个名字(或你选择的任何名字),然后在“引用”下写下(注意myResult=evaluate(Sheet1!$B2)$)

  4. 最后,转到 ,并写 。向下拖动,然后...瞧!C2=myResult

评论

2赞 Chris 2/12/2015
谢谢你的回答,+1。但正如您已经添加到您的答案中的那样:这只给了我一个动态创建的公式。但是我想复制整个工作表并将公式应用于这些 - 而无需创建一对名称定义。为什么你确定(通过设计),绝对没有其他办法?
2赞 Ben I. 2/12/2015
我引用了为什么我如此明确,以至于没有其他方法(除了 VBA),并且我删除了“设计”(因为我没有参与 Excel 的设计 - “将文本评估为常规函数”似乎不符合 Excel 的精神。我可能夸大了我的情况)。此外,我找到了一个更好的答案引用,这导致了一个更有用、可拖动的功能。希望这能更好地满足您的需求!
1赞 Chris 2/14/2015
我不知道为什么(而且我没有添加“=”),但不幸的是,上面的解决方案(名称定义中的评估函数)对我的问题不起作用(#REF 错误)。对于其他示例,它有效(简单的 1+2 操作等) - 也通过向下拖动您的第二个提示工作 - 但不适用于关闭的工作簿。
3赞 Peter K. 11/26/2018
@Chris 非常古老的问题,但为了完整起见(因为这个问题在搜索结果中弹出得相当高),特此提出一个解决方法:stackoverflow.com/a/53477902/9211191
2赞 hymced 6/13/2019
对于关闭的工作簿字符串引用的间接公式也对我不起作用
3赞 Daniel Silva 8/3/2016 #2

检查 INDEX 功能:

=INDEX('C:\path\[file.xlsm]Sheet1'!A10:B20;1;1)

评论

9赞 JS1204 1/18/2019
如果工作簿已关闭,则此操作有效。但是,如果我们想将工作表名称设为变量,则不起作用,例如: .file.xlsm"'C:\path\[file.xlsm]" & A1 & "'!A10:B20"
0赞 Allan 9/8/2016 #3

=INDIRECT(“'C:\Data[”&A8&“]SheetNAME'!$G 9”)

其中 A8 包含 myExcelFile.xlsm

G9 包含源工作簿的宝贵数据。

评论

0赞 Chris 9/9/2016
关于可变工作表名称的问题,意味着在您提出的解决方案中使“SheetNAME”变得灵活。
0赞 Stefan 9/28/2016 #4

如果您知道要引用的纸张数量,则可以使用以下功能来找出名称。而不是您可以在间接功能中使用它。

Public Function GETSHEETNAME(address As String, Optional SheetNumber As Integer = 1) As String

    Set WS = GetObject(address).Worksheets
    GETSHEETNAME = WS(SheetNumber).Name

End Function

此解决方案不需要打开引用的工作簿 - Excel 将自行打开它(但它将被隐藏)。

评论

0赞 Sorin Postelnicu 5/4/2017
亲爱的 Stefan,您的 VBA 示例中的“地址”是什么?是文件路径吗?
0赞 Stefan 5/4/2017
是的,它是一个完整的文件路径,例如 C:\Users\Stefan\Desktop\file.xlsx。通常,为了方便起见,我会在单元格中输入文件路径。
0赞 Guest guy 3/23/2017 #5

还行

下面是 Office 2010 上的恐龙方法。

使用concatenate(合并文本的“&”方法)写下您想要的完整地址。

对您需要的所有地址执行此操作。它应如下所示:

=“=”&“'\FULL NETWORK ADDRESS,包括 [电子表格名称]”&W3&“'!$w 4”

W3 是我正在使用的工作表的动态引用,W4 是我想从工作表中获取的单元格。

一旦你有了这个,启动一个宏录制会话。复制单元格并将其粘贴到另一个单元格中。我将其粘贴到合并的单元格中,它给了我经典的“相同大小”错误。但是它所做的一件事是从我的连接中粘贴生成的文本(包括额外的“=”)。

复制你为多少人这样做。然后,进入每个粘贴的单元格,选择文本,然后按回车键。它会将其更新为活动的直接引用。

完成后,将光标放在合适的位置并停止宏。将其分配给一个按钮,您就完成了。

第一次这样做有点 PITA,但一旦你这样做了,你就让方形钉子适合那个妞妞的圆孔。

5赞 Tiffany 1/31/2018 #6

我也在寻找在封闭的工作簿中引用单元格的答案。这是下面的解决方案(正确公式)的链接。我已经在我当前的项目(引用单个单元格和单元格数组)上尝试过它,它运行良好,没有错误。我希望它对你有所帮助。

https://www.extendoffice.com/documents/excel/4226-excel-reference-unopened-file.html

在公式中,是未打开的工作簿的完整文件路径,是工作簿的名称,是包含您需要引用的单元格值的工作表名称,并表示将在关闭的工作簿中引用该单元格。您可以根据需要更改它们。E:\Excel file\test.xlsxSheet2A:A,2,1A2

如果要手动选择要引用的工作表,请使用此公式

=INDEX('E:\Excel file\[test.xlsx]sheetname'!A:A,2,1)

应用此公式后,您将获得一个 选择工作表 对话框,请选择一个工作表,然后单击 OK 按钮。然后,将立即引用此工作表的某个单元格值。

评论

3赞 Chris 4/6/2018
它是否也适用于可变工作表名称,这是核心问题之一?
0赞 Luke Warneminde 7/27/2018 #7

至少在 Excel 2016 中,您可以将 INDIRECT 与完整路径引用一起使用;整个参照(包括图纸名称)需要用字符括起来。'

所以这应该对你有用:

= INDIRECT("'C:\data\[myExcelFile.xlsm]" & C13 & "'!$A$1")

注意最后一个字符串中的结束(即用''!$A$1"")

评论

6赞 Chris 8/21/2018
不幸的是,相同的行为:它仅适用于开源工作簿。该问题的专长是创建对另一个封闭 (!) 工作簿的引用。
4赞 Philipp 2/25/2019 #8

问题是指向已关闭文件的链接适用于 index( 但不适用于 index(indirect(

在我看来,这是索引函数的编程问题。 我用 if 子句行解决了它

C2=sheetname
if(c2=Sheet1,index(sheet1....),if(C2="Sheet2",index(sheet2....

我做了五张纸,这是一个很长的公式,但可以满足我的需要。

0赞 Anh 2/20/2021 #9

这似乎适用于关闭的文件:将源的数据透视表(行、表格布局、无小计、无总计)添加到当前工作簿,然后从该数据透视表中引用您想要的所有内容,间接、查找,...

3赞 Andrew G 3/27/2021 #10

谢谢你的好问题。我想澄清并附议 Philipp 发布的解决方案。该解决方案执行以下操作:

  1. 关闭的 Excel 文件中更新数据,以及
  2. “动态地”这样做(尽管不完全是 - 你会看到)

在上面的回答中,菲利普说:“问题在于,指向封闭文件的链接与index()一起使用,但不能与index(indirect()一起使用。

我相信这仍然是正确的。(我在 2021 年 3 月在这里使用 Office 365。如果 Microsoft 允许 INDIRECT 和 INDEX 与关闭的文件一起很好地播放,那就太好了!

我可以确认,实际上,菲利普的解决方法确实有效。从用户的角度来看,感觉就像 OP Chris 想要做的事情。

假设您希望从 Sheet1、Sheet2 或 Sheet3 中提取给定单元格的内容,这些内容来自封闭文件 myExcelFile.xlsm。您将通过更改特定单元格的内容来选择哪张工作表(C13,如OP Chris的问题)。一种方法是将其设为下拉列表(使用数据>数据验证>允许 [列表])。该列表将具有以下名称:

表1 表2 表3

(这将在没有下拉列表的情况下进行概括。例如,您只需在 C13 中输入“Sheet2”,就会出现关闭文件中的相关数据;如果然后键入“Sheet3”,则将显示工作表中的数据。或者,您可以有一个包含工作表名称的列,以及下一列 [使用下面的公式,调整] 用于关闭文件的输出。

将包含来自另一个闭合工作表 (myExcelFile.xlsm) 的引用数据的单元格将具有:

=IFS(
C13="Sheet1",'C:\data\[myExcelFile.xlsm]Sheet1'!$A$1,
C13="Sheet2",'C:\data\[myExcelFile.xlsm]Sheet2'!$A$1,
C13="Sheet3",'C:\data\[myExcelFile.xlsm]Sheet3'!$A$1
)

就是这样。

在关闭myExcelFile.xlsm的情况下,第一次执行此操作时,它会抛出一个 #REF 错误,但您可以转到“数据>查询和连接”>“编辑链接>更新值”,并且关闭文件中的值应该会出现。(就我个人而言,我设置了一个带有按钮的宏来进行更新,而不是通过菜单进行搜索。神奇的是,当您执行“更新值”时,关闭文件中所有工作表的数据都会加载到当前 Excel 文件中 - 因此您不必每次将引用切换到不同的工作表(例如,Sheet2 到 Sheet3)时都进行更新。

安德鲁

-1赞 NikoSilver 4/13/2021 #11

我很失望,所以我做了以下解决方法:

  1. 我创建了我的间接命令,并将它们存储在所需范围之外。当然,当源工作簿关闭时,我会遇到错误,但当它打开时,它们会亮起。
  2. 所以我暂时打开了源工作簿。
  3. 然后,我创建了一个宏,用于从范围外部复制间接公式并将它们粘贴到范围内。所有单元格都填充了正确的值。
  4. 然后,宏将范围的值复制粘贴到其顶部的区域。这将删除公式,但保留其值。
  5. 然后我关闭源工作簿。我的值在我想要的地方保持不变,我的间接公式保持在所需范围之外,以防我想通过重复该过程来刷新它们!

这种解决方法为我节省了关闭源工作簿时间接公式的错误,最重要的是,它节省了大量重新计算的时间!

希望这也对你有用!

1赞 Brethlosze 7/10/2023 #12

您无需为此运行任何宏

将此函数放在任何模块(即 Modules>Module1)中:

Function EXTINDIRECT(sFolder As String, sFile As String, sSheet As String, sRef As String) As Variant
' Returns a value with INDIRECT from a Closed File
    EXTINDIRECT = GetObject(sFolder & sFile).Worksheets(sSheet).Range(sRef)
End Function

而且,对于任何函数,这在任何单元格中都工作,如下所示:

=EXTINDIRECT("c:\my\path";"MyFile.xlsx";"MySheet1";"$A$1")    

不要滥用它,因为每次使用它时实际上都会在后台打开一个文件。 最后,选择不保存文件,因为如果您选择保存它,该过程会隐藏它。GetObject

在 MS Excel 2013 中测试。