如何将多维数组或嵌套数组传递到Excel UDF中,以便我引用其他范围?
我有一个定义为“ARY”的UDF,它执行Array()在VBA中但在工作表函数中的作用。
这允许我有一个像
这样的工作表公式 = TEST1(ARY(ARY(“A”,“B”),“C”))
或
= TEST1(ARY(ARY(A1,B1),C1)
但是,当我将TEST1作为工作表函数执行时,我得到了错误2015。如果我从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
答案 0 :(得分:2)
一般情况下,你不能这样做。 VBA 可以使用嵌套数组作为值,但Excel不是。这是有道理的,因为Excel最终必须将从UDF获取的任何值视为可以进入工作表网格的内容。
如果中间结果不必遵守此限制,那就太好了。在上面的示例中,您不是要尝试将锯齿状数组放入任何单元格中;你只想创建它并将其传递给'TEST1'。不幸的是,Excel只是不起作用。它将公式中的每个表达式计算为合法的Excel值,并且#VALUE!是“非法律价值”的全部。 (除了锯齿状外,返回的数组还有其他限制。例如,超过一定大小的数组也会导致#VALUE!错误。)
请注意,可以从UDF传回长度的嵌套数组:
Public Function thisKindOfNestingWorks()
thisKindOfNestingWorks = Array(Array(1, 2), Array(3, 4))
End Function
当您构建一些实际上想要强制转换为二维数组的列表列表时,这非常有用。
所以,像这样调用你的ARY函数应该可以正常工作:
=ARY(ARY(A1, B1), ARY(C1, D1))
但是,自从调用
以来,您的TEST1功能将失败=TEST1(ARY(ARY(A1, B1), ARY(C1, D1)))
会导致二维数组传递给TEST1,而不是一维数组的一维数组。
您可能也会发现这个问题以及我的回答是有帮助的:
Return a User Defined Data Type in an Excel Cell
多次编辑:
顺便提一下,你的'ARY'功能可能要短得多。这与您的原始问题无关,但值得一提:
Public Function arr(ParamArray args())
arr = args
End Function
在这个答案中有一个使用它的例子: