将多维数组传递到VBA中的Excel UDF

时间:2010-08-07 01:36:30

标签: excel vba

如何将多维数组或嵌套数组传递到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

1 个答案:

答案 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

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

Excel Select Case?