将多维数组传递到 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的主要内容,如果未能解决你的问题,请参考以下文章