假設我們有A1保存在細胞一些長式:VBA - 經由Application.Evaluate
=SomeArrayFunction(
IF(SUM(D3:D6)>1,"A-B-C-D-E-F-G-H-I-J-K-L-M-N-O-P-Q-R-S-T-U-V-W-X 01",
"part_one"),
IF(SUM(D3:D6)>1,"A-B-C-D-E-F-G-H-I-J-K-L-M-N-O-P-Q-R-S-T-U-V-W-X 02",
IF(SUM(D3:D6)>1,"A-B-C-D-E-F-G-H-I-J-K-L-M-N-O-P-Q-R-S-T-U-V-W-X 03",
"part_two"))
)
它採用下面的VBA函數
Public Function SomeArrayFunction(sOne As String, sTwo As String) As Variant
Dim V() As Variant
ReDim V(1 To 2, 1 To 1)
V(1, 1) = sOne
V(2, 1) = sTwo
SomeArrayFunction = V
End Function
返回一個2×1陣列。
現在,當我把這個VBA函數
Public Sub EvaluateFormula()
Dim vOutput As Variant
vOutput = Application.Evaluate(Selection.Formula)
If VarType(vOutput) >= vbArray Then
MsgBox "Array:" & vbCrLf & vOutput(1, 1) & vbCrLf & vOutput(2, 1)
Else
MsgBox "Single Value: " & vbCrLf & vOutput
End If
End Sub
同時具有選定單元格A1 我得到一個錯誤,因爲Application.Evaluate不能超過255個字符處理公式(例如,見VBA - Error when using Application.Evaluate on Long Formula) 。另一方面,如果我寫
vOutput = Application.Evaluate(Selection.Address)
改爲(如上面的鏈接中提出的),那麼它工作得很好。除了陣列不再被重新調整角色,即MsgBox「單值:」被調用而不是MsgBox「Array:」。
所以我的問題是:如何評估使用VBA的長公式(返回數組)?
編輯:我要強調,我需要這個工作的時候,我只選擇一個細胞是conains公式(不是一個區域或幾個單元)。我還沒有進入它作爲一個數組公式(即沒有大括號):
EDIT2:我來回答的原因:我目前的工作需要我有這麼大的公式的一個長長的清單在電子表格中。而且由於它們被組織在一個列表中,所以每個這樣的公式只能佔用一個單元格。在幾乎所有情況下,公式都返回單個值(因此一個單元足以存儲/顯示輸出)。但是,如果在評估公式時發生內部錯誤,則公式會返回錯誤消息。這些錯誤消息通常很長,因此會返回爲不同大小的數組(取決於錯誤消息的長度)。所以我的目標是編寫一個VBA函數,該函數首先會從列表中獲取並輸出給定選定條目的完整錯誤消息。
感謝您的原因。現在這變得越來越有趣。在閱讀你的描述之後,我首先想到的是:你能輸入填充到當前列(「列表」)旁邊的列中的數組公式嗎?您可以在公式上調用TRANSPOSE來將列變爲行。這有點「髒」,但如果足夠大以捕獲所有錯誤輸出,您可以將它們全部設置爲10個單元。我真的不認爲你會得到一個數組輸出沒有像公式的數組。問題將是如何最好地做到這一點。 –
您的錯誤消息是否真的超過了32k(或者您是否試圖解決單元內顯示限制)?在任何情況下,您似乎都可以使用「scratch」範圍來放置公式,然後對它們調用Evaluate。 –
@Byron:我也想過轉置它,但是我經常有幾個列表相鄰,這使得這種方法變得不可能。 –