您的公式已經在訪問這些值,以便在打開的工作簿中對它們進行求和。你做不需要需要重新打開工作簿以評估參考值,也不解析活動工作簿中的公式。
假設您的公式引用關閉的工作簿,用一個簡單的求和函數,如:
='C:\Users\david_zemens\Desktop\[test.xlsx]Sheet1'!$A$1 + ='C:\Users\david_zemens\Desktop\[test.xlsx]Sheet1'!$B$1
可以解析公式無論是在VBA或工作表上使用字符串函數。正如你注意到的,對於這個例子,通過+
運算符解析就足夠了。因爲我認爲你知道如何做到這一點,所以我的示例沒有演示如何解析公式。
只要您知道或可以從公式獲得參考,您應該可以通過公式訪問這些單元格的值,或者使用ExecuteExcel4Macro
以編程方式在VBA中訪問這些單元格的值。
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中訪問一個未打開的工作簿中的數據」我真的不知道如何我只是知道它確實是。
請參閱下面的答案。如果你可以解析公式,你當然可以使用'ExecuteExcel4Macro'來評估外部引用**,而不需要**重新打開外部工作簿。 –