任务
我正在开发一个 VBA 项目,其中我将工作表中的数据存储在
Variant Array
中,使用 Array
中的数据进行一系列计算,将这些计算的结果存储在其他几个 Arrays
中,然后最后我将所有“结果数组”存储在另一个Variant Array
中,并将该数组写入新工作表中的范围。
注意:自从我第一次编写该程序以来,这个过程一直运行良好。
问题
经过非常小的逻辑更改后,我的最终
Array
将不再写入指定范围。当我尝试时,我会得到Run-time error '7': Out of memory
。我改变了逻辑以防万一这是我的问题,但我仍然收到错误。
经过一些研究,我尝试在写入范围之前删除所有数组(包括包含所有工作表数据的数组),但这也不起作用。我检查了任务管理器,显示我的 RAM 有大量可用空间(近 6K MB 可用空间和超过 1k Mbs“空闲”空间)。 (任务管理器显示 Excel 进程使用了大约 120 MB。)
代码(片段)
Dim R As Range
Dim ALCount As Long
Dim All(5) As Variant
Dim sht As Worksheet
Dim Arr1() As Long
Dim Arr2() As Date
Dim Arr3() As Date
Dim Arr4() As Long
Dim Arr5() As String
All(1) = Arr1
All(2) = Arr2
All(3) = Arr3
All(4) = Arr4
All(5) = Arr5
Set R = sht.Cells(2,1)
R.Resize(ALCount - 1, 5).Value = Application.Transpose(All)
更多详情
My device: Win 7 64-Bit
Excel: 2010 32-Bit
File Size: <20 MBs
Macro Location: Personal Workbook
Personal WB Size: < 3 MBs
编辑:数组大小:773x5
对于为什么会发生这种情况有什么想法吗?
我解决了这个问题。
Arr5
(字符串数组)是罪魁祸首。该数组中的每个元素的设置如下:
StrVariable = StrVariable & "--" & StrVariable
Arr5(ALCount) = StrVariable
我忘记包含这一行以在每次循环后重置
StrVariable
:
StrVariable = vbNullString
结果意味着,到第 773 次迭代时,Arr5(773) 的字符串长度很大……事实上,太大了,即使我的代码可以处理数组,但工作表却不能。
我通过在迭代 200 处停止并将
All
的输出检查到工作表中发现了错误(在迭代 200 时,Arr5(200)
的字符数已经接近 3k)。
感谢您花时间帮助解决此问题!
我也遇到了同样的问题,将数组写入某个范围会出现内存不足错误。 我终于发现了问题:代码试图将 1900 年之前的日期写入工作表。
学到的教训:似乎 Excel 在将数组写入某个范围时,一旦遇到将其中一个数组值写入工作表时遇到问题,就会抛出“内存不足”错误。
如果出现此错误,请检查您尝试写入的所有数组值。
您可以使用此代码重现它:
sub BogusOutOfMemoryError()
dim dtdate as date
dim varArr(1 to 1, 1 to 1) as variant
dtdate = #1/1/1900#
dtdate = dtdate - 10
varArr(1,1) = dtdate
activecell = vararr
)