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

Arrays 数组大小限制在VBA中传递数组参数,arrays,vba,excel,Arrays,Vba,Excel,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

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是一个错误。

这似乎是我能找到的最接近解决方法。执行来自VBA的函数间调用

如果你做这样的东西

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

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

这不是VBA的问题,因为您可以运行它并且不会出错

Public Sub test()

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

  Debug.Print x; y

End Sub
这似乎是一个将其传回Excel的问题—文档不多,但似乎是Excel的限制

这里是另一个链接,但没有解决方案

还有一个

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

作为一个实验,在单元格公式中突出显示
funA(2^16)
,然后点击F9-它会给你一个
“#值!”错误

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


这似乎是一个类似Brad posted的解决方案(即,第三个函数本身计算
funB(funA(n))
),在计算完成之前将单元格排除在方程之外,因此它工作正常

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

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

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

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

这里有一些背景。你到底需要用UDF做什么?这将指导我们的建议。参考资料看起来像问题的变体。我需要用udf做的事情和你看到的差不多,除了数组将充满数字(一个样本分布),funB用它做有趣和令人兴奋的事情。Yee-Hah!就这样。很好的捕捉。一个2-D列数组dim'D(n,1)实际上是原始代码所使用的,它表现出完全相同的症状。为了简化这个例子,我把它简化为一维。也许我不该这么做。你使用VBA函数是正确的。C XLL函数不会出现这种情况,因此,将VBA变量数组转换回Excel单元格的代码中似乎存在缺陷:这还没有针对大网格进行更新。我收回这一点。它在VBE中运行良好-我不知道第一次尝试时失败的原因。