2012-06-28 85 views
5

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

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

下面的代码:

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年

+1

这里有一些背景[Excel 2007工作表函数中的最大数组大小?](http://windowssecrets.com/forums/showthread.php/128704-Max-Array-size-in-Excel-2007-Worksheet-Function)。你真的需要用UDF做什么?这将指导我们的建议。 – brettdj

+0

该引用看起来像是该问题的一个变体。我需要做的事情就是你所看到的,除了数组将填充数字(一个样本分布),funB用它来做有趣和令人兴奋的事情。 –

回答

2

这似乎与我所能找到的工作很接近。做跨功能从VBA

调用

如果你做这样的事情

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

似乎工作直到n = 2^24 = 2^8^3(这看起来不像任何在VBA数据类型突破点,这是在挂断,但是这是一个相当大的阵列)

+0

Yee-Hah!这就是它。很好的接收。 –

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

3

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

作为一个实验,在细胞公式中突出funA(2^16)并命中F9 - 它会给你一个'#VALUE!'错误。

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

看起来像Brad发布的一个解决方法(即第三个函数可以计算内部的funB(funA(n))),直到计算完成后,该单元格保持不变,所以它可以正常工作。

+0

我回来了。它在VBE中工作正常 - 不知道为什么它第一次尝试失败。 –

2

由于一维数组以列的形式传回给Excel,因此您已达到列数(64K)的Excel 2007限制。

如果你让你的阵列2维和回报排它应该工作:

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

或者您可以使用移调从行到列的排列旋转,但是这可能不是创造效率较低首先是一个二维数组。

+1

dim_d(n,1)的二维列数组实际上是原始代码使用的,它表现出完全相同的症状。我把它放到一个维度来简化这个例子。也许我不应该有。 –

+0

您对VBA功能是正确的。这不会发生在C XLL函数中,因此它看起来像代码中的错误是将VBA变量数组转换回Excel单元格:对于大网格,尚未更新。 –