5

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

4 回答 4

3

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

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

funA因为公式在启动之前已经计算出结果,所以funB它试图funB在已经计算出错误的函数上运行。

这似乎是一种解决方法,就像 Brad 发布的那样(即funB(funA(n))在自身内部计算的第三个函数)在计算完成之前将单元格排除在等式之外,所以它工作正常。

于 2012-06-28T03:38:15.307 回答
3

因为一维数组作为一行列传递回 Excel,所以您已经达到 Excel 2007 对列数 (64K) 的限制。

如果您将数组设为二维并作为行返回,则它应该可以工作:

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

或者,您可以使用 Transpose 将数组从行旋转到列,但这可能不如首先创建二维数组有效。

于 2012-06-28T08:16:42.693 回答
2

这似乎与我能找到的解决方法一样接近。从 VBA 执行函数间调用

如果你做这样的事情

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

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

于 2012-06-28T02:51:07.157 回答
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 数组大小限制

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

于 2012-06-28T03:00:10.503 回答