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