您的公式已经在访问这些值,以便在打开的工作簿中对它们求和。您不需要重新打开工作簿来评估参考值,也不需要解析活动工作簿中的公式。
假设您的公式引用了一个封闭的工作簿,并带有一个简单的 sum 函数,例如:
='C:\Users\david_zemens\Desktop\[test.xlsx]Sheet1'!$A$1 + ='C:\Users\david_zemens\Desktop\[test.xlsx]Sheet1'!$B$1
您可以在 VBA 中或在工作表上使用字符串函数来解析公式。正如您所注意到的,对于此示例,由+
运算符解析就足够了。由于我认为您了解如何执行此操作,因此我的示例未演示如何解析公式。
只要您知道或可以从公式中获取引用,您就应该能够通过公式访问这些单元格的值,或者在 VBA 中使用ExecuteExcel4Macro
.
Sub GetValsFromClosedWorkbook()
Dim fileName As String
Dim filePath As String
Dim sheetName As String
Dim cellref As String
Dim myFormula As String
'This example might be one of the two arguments in your "A+B" formula:
' 'C:\Users\david_zemens\Desktop\[test.xlsx]Sheet1'!A1
'## Assume you can properly parse the formula to arrive at these:
fileName = "test.xlsx"
filePath = "C:\Users\david_zemens\Desktop\"
sheetName = "Sheet1"
cellref = "A1"
'Concatenate in to R1C1 notation
myFormula = "='" & filePath & "[" & fileName & "]" & sheetName & "'!" & _
Range(cellref).Address(, , xlR1C1)
'## First, demonstrate that we can evaluate external references:
With Range("B1")
.Value = myFormula
MsgBox .Value
.Clear
End With
'## Evaluate the formula using ExecuteExcel4Macro:
MsgBox ExecuteExcel4Macro(Replace(myFormula, "=", vbNullString))
End Sub
附加信息
http://spreadsheetpage.com/index.php/tip/a_vba_function_to_get_a_value_from_a_closed_file/
更新
基于 OP 关于其工作原理的问题(下面的评论),我不确定它在幕后是如何工作的,但这是我的猜测/解释:
首先,请记住,一个单元格可能具有各种属性,如.Text
、.Value
、等.Value2
,.Formula
它们以一种或另一种方式表示其内容。
在计算公式之前,这些值不在活动文件中,此时 Excel 会查询外部文件并返回该Value
引用处的当前值。现在活动文件包含该文件Value
以及Formula
外部文件的引用。
当您继续工作时,活动文件会保留Value
和引用,但可能仅在出现提示时更新值。例如,当您重新打开链接的工作簿时,系统会提示您是否“更新外部链接”。
- 如果您说不,它将使用先前存储的值(仍然保留
Formula
,它只是不评估它。
- 如果您说是,它将重新评估公式(以防外部文件中的值已更改)并返回新的
.Value
所以,这就是我怀疑正在发生的事情。如果您问“ Excel如何访问未打开的工作簿中的数据”,我真的不知道我是怎么知道它确实如此。