将multidimensional array传递到VBA中的Excel UDF

如何将multidimensional array或嵌套数组传递给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 

一般来说,你不能这样做。 VBA很好,嵌套数组作为值,但Excel不是。 这是有道理的,因为Excel最终必须将它从UDF获得的任何值视为可以进入工作表网格的东西。

如果中间结果不必服从这个限制,那将是很好的。 在你上面的例子中,你不是想把锯齿arrays放到任何单元格中; 你只是想创build它,并将其传递给“TEST1”。 不幸的是,Excel不能这样工作。 它将公式中的每个expression式评估为合法的Excel值,并且#VALUE! 是“不合法的价值”的全部。 (除锯齿外,还有其他的返回数组的限制,例如,超过一定大小的数组也会导致#VALUE!错误。

请注意,所有长度相同的嵌套数组可以从UDF传回:

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

当你build立一些你想要强制转换成二维数组的列表时,这会很有用。

所以,像这样调用你的ARY函数应该工作得很好:

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

但是,您的TEST1函数将失败,因为调用

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

会导致传递给TEST1的二维数组,而不是一维数组的一维数组。

你也可能会发现这个问题,我的答案是有帮助的:

在Excel单元格中返回用户定义的数据types

很多以后编辑:

顺便说一句,你的“ARY”function可能会缩短很多。 这与你原来的问题没有任何关系,但值得一提的是:

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

有一个在这个答案中使用它的例子:

Excelselect案例?