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

Posted

技术标签:

【中文标题】将多维数组传递到 VBA 中的 Excel UDF【英文标题】:Pass multidimensional array into Excel UDF in VBA 【发布时间】:2010-08-07 01:36:30 【问题描述】:

如何将多维数组或嵌套数组传递到允许我引用其他范围的 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】:

一般情况下,您不能这样做。 VBA 可以将嵌套数组作为值,但 Excel 却不行。这是有道理的,因为 Excel 最终必须将它从 UDF 中获取的任何值视为可以进入工作表网格的内容。

如果 intermediate 结果不必遵守此限制,那就太好了。在上面的示例中,您并没有尝试将锯齿状数组放入任何单元格中;您只想创建它并将其传递给“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?

【讨论】:

以上是关于将多维数组传递到 VBA 中的 Excel UDF的主要内容,如果未能解决你的问题,请参考以下文章

从工作表将二维数组传递给 VBA/UDF 函数

Excel VBA - 确定数组 UDF 的列或行目标

Excel VBA 宏中的数组

VBA:多维数组中的字符串索引

VBA Excel UDF保留原始值

excel VBA - 从函数中重新获得可变长度数组