提问人:Chris 提问时间:2/12/2015 最后编辑:Chris 更新时间:10/12/2023 访问量:178288
使用 INDIRECT 在封闭的 Excel 工作簿中引用值?
Referencing value in a closed Excel workbook using INDIRECT?
问:
我想使用公式(不是 VBA!工作表名称存储为变量(在以下示例中,C13 为“Sheet2”)。
如果另一个文件处于打开状态,则以下工作正常:
=INDIRECT("[myExcelFile.xlsm]" & C13 & "!$A$1")
如果文件已关闭,则上述公式不起作用,因为没有给出绝对路径。但是我通过以下方式让它工作(注意“而不是”:
='C:\data\[myExcelFile.xlsm]Sheet2'!$A$1
现在我想用动态引用值替换硬编码的“Sheet2”,即 C13(如第一个代码片段所示)。
有没有人知道不使用 VBA 或其他库的解决方案?
答:
使用标准公式绝对没有办法做到这一点。然而,可以在这里找到一个疯狂的答案。它仍然避免了 VBA,并且允许您动态获取结果。
首先,制作将生成公式的公式,但不要在开头添加!
=
让我们假设您已经在 的单元格中创建了这个公式,并且您希望在列中计算该公式。
B2
Sheet1
c
现在,转到“公式”选项卡,然后选择“定义名称”。给它起个名字(或你选择的任何名字),然后在“引用”下写下(注意
myResult
=evaluate(Sheet1!$B2)
$
)最后,转到 ,并写 。向下拖动,然后...瞧!
C2
=myResult
评论
检查 INDEX 功能:
=INDEX('C:\path\[file.xlsm]Sheet1'!A10:B20;1;1)
评论
file.xlsm
"'C:\path\[file.xlsm]" & A1 & "'!A10:B20"
=INDIRECT(“'C:\Data[”&A8&“]SheetNAME'!$G 9”)
其中 A8 包含 myExcelFile.xlsm
G9 包含源工作簿的宝贵数据。
评论
如果您知道要引用的纸张数量,则可以使用以下功能来找出名称。而不是您可以在间接功能中使用它。
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 将自行打开它(但它将被隐藏)。
评论
还行
下面是 Office 2010 上的恐龙方法。
使用concatenate(合并文本的“&”方法)写下您想要的完整地址。
对您需要的所有地址执行此操作。它应如下所示:
=“=”&“'\FULL NETWORK ADDRESS,包括 [电子表格名称]”&W3&“'!$w 4”
W3 是我正在使用的工作表的动态引用,W4 是我想从工作表中获取的单元格。
一旦你有了这个,启动一个宏录制会话。复制单元格并将其粘贴到另一个单元格中。我将其粘贴到合并的单元格中,它给了我经典的“相同大小”错误。但是它所做的一件事是从我的连接中粘贴生成的文本(包括额外的“=”)。
复制你为多少人这样做。然后,进入每个粘贴的单元格,选择文本,然后按回车键。它会将其更新为活动的直接引用。
完成后,将光标放在合适的位置并停止宏。将其分配给一个按钮,您就完成了。
第一次这样做有点 PITA,但一旦你这样做了,你就让方形钉子适合那个妞妞的圆孔。
我也在寻找在封闭的工作簿中引用单元格的答案。这是下面的解决方案(正确公式)的链接。我已经在我当前的项目(引用单个单元格和单元格数组)上尝试过它,它运行良好,没有错误。我希望它对你有所帮助。
https://www.extendoffice.com/documents/excel/4226-excel-reference-unopened-file.html
在公式中,是未打开的工作簿的完整文件路径,是工作簿的名称,是包含您需要引用的单元格值的工作表名称,并表示将在关闭的工作簿中引用该单元格。您可以根据需要更改它们。E:\Excel file\
test.xlsx
Sheet2
A:A,2,1
A2
如果要手动选择要引用的工作表,请使用此公式
=INDEX('E:\Excel file\[test.xlsx]sheetname'!A:A,2,1)
应用此公式后,您将获得一个 选择工作表 对话框,请选择一个工作表,然后单击 OK 按钮。然后,将立即引用此工作表的某个单元格值。
评论
至少在 Excel 2016 中,您可以将 INDIRECT 与完整路径引用一起使用;整个参照(包括图纸名称)需要用字符括起来。'
所以这应该对你有用:
= INDIRECT("'C:\data\[myExcelFile.xlsm]" & C13 & "'!$A$1")
注意最后一个字符串中的结束(即用'
'!$A$1
""
)
评论
问题是指向已关闭文件的链接适用于 index( 但不适用于 index(indirect(
在我看来,这是索引函数的编程问题。 我用 if 子句行解决了它
C2=sheetname
if(c2=Sheet1,index(sheet1....),if(C2="Sheet2",index(sheet2....
我做了五张纸,这是一个很长的公式,但可以满足我的需要。
这似乎适用于关闭的文件:将源的数据透视表(行、表格布局、无小计、无总计)添加到当前工作簿,然后从该数据透视表中引用您想要的所有内容,间接、查找,...
谢谢你的好问题。我想澄清并附议 Philipp 发布的解决方案。该解决方案执行以下操作:
- 从关闭的 Excel 文件中更新数据,以及
- “动态地”这样做(尽管不完全是 - 你会看到)
在上面的回答中,菲利普说:“问题在于,指向封闭文件的链接与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)时都进行更新。
安德鲁
我很失望,所以我做了以下解决方法:
- 我创建了我的间接命令,并将它们存储在所需范围之外。当然,当源工作簿关闭时,我会遇到错误,但当它打开时,它们会亮起。
- 所以我暂时打开了源工作簿。
- 然后,我创建了一个宏,用于从范围外部复制间接公式并将它们粘贴到范围内。所有单元格都填充了正确的值。
- 然后,宏将范围的值复制粘贴到其顶部的区域。这将删除公式,但保留其值。
- 然后我关闭源工作簿。我的值在我想要的地方保持不变,我的间接公式保持在所需范围之外,以防我想通过重复该过程来刷新它们!
这种解决方法为我节省了关闭源工作簿时间接公式的错误,最重要的是,它节省了大量重新计算的时间!
希望这也对你有用!
您无需为此运行任何宏。
将此函数放在任何模块(即 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 中测试。
评论