【问题标题】:Pass multidimensional array into Excel UDF in VBA将多维数组传递到 VBA 中的 Excel UDF
【发布时间】: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

【问题讨论】:

    标签: excel vba


    【解决方案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?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-09-23
      • 1970-01-01
      • 2012-09-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多