数组大小限制在VBA中传递数组参数

时间:2012-06-28 02:05:27

标签: arrays excel vba excel-vba

Excel-VBA 2007似乎对作为参数传递的数组大小有64k的限制。

是否有人知道修复或解决方法?

以下是代码:

Public Function funA(n)
    Dim ar()
    ReDim ar(n)
    funA = ar
End Function

Public Function funB(x)
    funB = UBound(x)
End Function

来自Excel:

=funB(funA(2^16-1))   '65536 as expected

=funB(funA(2^16))    'Gives a #VALUE

在里面看,funA()工作正常但是,传递给funB,参数x是一个错误2015。

4 个答案:

答案 0 :(得分:3)

我认为这是电子表格单元本身的限制,而不是VBA。 Excel可以在函数之间传递大于2 ^ 16的数组,但显然它不能在单元格中包含该大小的数组。

作为实验,请在单元格公式中突出显示funA(2^16)并点击F9 - 它会给您'#VALUE!'错误。

由于公式在funA启动funB之前已经计算了funB的结果,因此它会尝试在已经计算错误的函数上运行funB(funA(n))

似乎像布拉德发布的那样(即在其自身内计算{{1}}的第三个函数)的解决方法将单元格保持在等式之外,直到计算完成,因此它工作正常。

答案 1 :(得分:3)

由于一维数组作为一行列传回Excel,因此您已达到Excel 2007对列数(64K)的限制。

如果你将数组设为2维并以行的形式返回它应该有效:

Public Function funA(n)
    Dim ar()
    ReDim ar(n,1)
    funA = ar
End Function

或者,您可以使用Transpose将数组从一行旋转到一列,但这可能比首先创建一个二维数组效率低。

答案 2 :(得分:2)

这似乎与我能找到的工作接近。从VBA进行功能间调用

如果你做这样的事

Public Function funBA(n As Variant) As Variant
    funBA = funB(funA(n))
End Function

它似乎可以达到n = 2 ^ 24 = 2 ^ 8 ^ 3(它看起来不像VBA中的任何数据类型断点,这是挂断的地方,但是那个' sa相当大的数组)

答案 3 :(得分:1)

这不是VBA问题,因为您可以运行此操作并且不会出现错误

Public Sub test()

  x = funB(funA(2 ^ 16 - 1))
  y = funB(funA(2 ^ 16))

  Debug.Print x; y

End Sub

这似乎是一个将其传回Excel的问题 - 没有太多文档,但似乎是Excel限制。

这是另一个链接,但没有解决方案WorksheetFunction array size limit

和另一个 http://answers.microsoft.com/en-us/office/forum/office_2007-excel/passing-arrays-to-excel-worksheet-functions-in/56d76732-9a15-4fd2-9cad-41263a4045d4