2010-08-07 85 views
1

如何將多維數組或嵌套數組傳遞到允許我引用其他範圍的Excel UDF中?將多維數組傳遞到VBA中的Excel UDF中

我有一個UDF定義爲「ARY」,它執行的是Array()在VBA中的工作表函數。

這使我有一個工作表式等

= TEST1(ARY(ARY( 「A」, 「B」), 「C」))

= TEST1(ARY(ARY( A1,B1),C1)

不過,我得到錯誤2015年執行TEST1當作爲工作表函數,如果我從VBA執行TEST1,它工作正常,並返回 「A」。

Public Function TEST1(Params As Variant) As Variant 
    TEST1 = Params(0)(0) 
End Function 

'Returns 1D ARRAY 
Public Function ARY(ParamArray Params() As Variant) 
    ReDim result(0 To UBound(Params)) As Variant 
    Dim nextIndex As Integer 
    Dim p As Variant 

    nextIndex = 0 

    For Each p In Params 
     result(nextIndex) = p 
     nextIndex = nextIndex + 1 
    Next 

    ARY = result 
End Function 

回答

2

一般,你不能這樣做。VBA很好,嵌套數組作爲值,但Excel不是。這是有道理的,因爲Excel最終必須將它從UDF獲得的任何值視爲可以進入工作表網格的東西。

如果中間結果不必服從這個限制,那將會很好。在你上面的例子中,你並沒有試圖把一個鋸齒狀的數組放入任何單元格中;你只是想創建它並將其傳遞給'TEST1'。不幸的是,Excel不能這樣工作。它將公式中的每個表達式評估爲合法的Excel值,並且#VALUE!是「不合法價值」的全部。 (還有其他的限制,除了鋸齒返回數組。例如,超過一定規模的陣列也導致#VALUE!錯誤。)

注意,嵌套在該都一樣長數組可以傳遞從後UDF:

Public Function thisKindOfNestingWorks() 
    thisKindOfNestingWorks = Array(Array(1, 2), Array(3, 4)) 
End Function 

當您構建一些列表時,您實際上希望強制轉換爲2-D陣列,這非常有用。

因此,調用上面你ARY功能這應該只是罰款:

=ARY(ARY(A1, B1), ARY(C1, D1)) 

但是,你TEST1功能會失敗,因爲調用

=TEST1(ARY(ARY(A1, B1), ARY(C1, D1))) 

將導致2-d陣列被傳遞給TEST1,而不是1-D數組的一維陣列。

您也可能會發現這個問題,我的答案,它是有幫助的:

Return a User Defined Data Type in an Excel Cell

很久以後編輯:

順便說一句,你的「ARY」功能可能是短了很多。這已經無關,與你原來的問題,但它是值得一提:

Public Function arr(ParamArray args()) 
    arr = args 
End Function 

有一個在這個答案使用它的一個例子:

Excel Select Case?