将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案例?