Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays VBA Excel 2010数组大小限制_Arrays_Vba_Excel - Fatal编程技术网

Arrays VBA Excel 2010数组大小限制

Arrays VBA Excel 2010数组大小限制,arrays,vba,excel,Arrays,Vba,Excel,我最近需要在VBAExcel2010中使用相当大的数组执行计算。然而,令我沮丧的是,我的工作和家庭电脑(一台是PC,另一台是Mac(PC有8GB内存,Mac有4GB)),在我尝试运行我的程序时,不断地抛出相同的内存错误。这让我运行了一些测试来弄清问题的根源 Sub Test1() Dim arr1() As Byte, arr2() As Long ReDim arr1(1 To 268000000) ''These work ReDim arr2(1 To 2680

我最近需要在
VBA
Excel2010中使用相当大的数组执行计算。然而,令我沮丧的是,我的工作和家庭电脑(一台是PC,另一台是Mac(PC有8GB内存,Mac有4GB)),在我尝试运行我的程序时,不断地抛出相同的
内存错误。这让我运行了一些测试来弄清问题的根源

Sub Test1()
    Dim arr1() As Byte, arr2() As Long

    ReDim arr1(1 To 268000000)  ''These work
    ReDim arr2(1 To 268000000)
End Sub

Sub Test2()
    Dim arr3() As Byte, arr4() As Long

    ReDim arr3(1 To 269000000)  '' Both of these fail
    ReDim arr4(1 To 269000000)
End Sub
现在,根据,每个维度的索引都受到
(2^31)-1
的限制。正如你在上面所看到的,我远没有达到这个临界值,而且非常接近
2^28
。根据一些粗略计算,上面每个数组的内存量为:

arr1:  268,000,000 * 1 = 268,000,000 bytes of memory
arr2:  268,000,000 * 8 = 2,144,000,000 bytes of memory
arr3:  269,000,000 * 1 = 269,000,000 bytes of memory
arr4:  269,000,000 * 8 = 2,152,000,000 bytes of memory

您会注意到,
arr3
大约是
arr2
的1/8
大小,但是当尝试
Redim arr3
时,我们会在
Redim arr2
工作正常时出现内存不足错误。这是怎么回事???需要注意的是,虽然类似,但并不适用,因为我在两台机器上都有大量内存,只是询问内存,而不是一个数组中可以放入多少个元素。

我对
arr2
arr4
都不满意。当我单步执行代码时,
arr1
arr3
都会执行
ReDim
,而不会引发错误。MSDN还注意到:“如果试图初始化超过可用RAM数量的数组,公共语言运行库会抛出OutOfMemoryException异常。”“对阵列如何存储在内存中进行任何假设都是不安全的。”对我来说,对于这两个例程,第二个redim炸弹(XL 2010,32位,16 Gb Ram)您使用的是32位还是64位版本的Excel?这会有所不同。有关减少工作簿内存使用的讨论和一些提示,请参阅:所有内容都适用于我,但我运行的是64位Excel 2013,内存为16GB。当我再次尝试使用64位Excel 2010时,这两个例程都可以正常工作。