【发布时间】:2012-04-30 10:06:34
【问题描述】:
我的目的是为一个 Excel 单元格区域分配一个二维变量数组的值。
分配工作正常,但我面临内存问题(泄漏):当我启动 Excel 时,该过程需要或多或少 22 Mo 的 Ram。运行以下代码后(创建新工作簿、分配范围、关闭工作簿而不保存),该过程占用 33 Mo 的 RAM。
有人知道我做错了什么吗?
问候, 亚历山大
这里是代码
Option Explicit
Sub test()
Dim nLines As Long
Dim xSize As Long
Dim j As Long
Dim i As Long
'Creating New Empty Workbook
Application.Workbooks.Add
Range("A1").Select
Application.ScreenUpdating = False
nLines = 10000
xSize = 200
Dim myRange As Range
Dim myArray() As Variant
ReDim myArray(1 To nLines, 1 To xSize)
'Assigning some values
For j = 1 To nLines:
For i = 1 To xSize:
myArray(j, i) = i * 4 / 3#
Next i
Next j
Set myRange = Range(ActiveCell, ActiveCell.Offset(nLines - 1, xSize - 1))
myRange .Value = myArray
'Cleaning up
Erase myArray
Set myRange = Nothing
'Closing workbook without saving
Application.ActiveWorkbook.Close (False)
Application.ScreenUpdating = True
End Sub
【问题讨论】:
-
不确定 Mo 是什么,但是即使没有 VBA,运行 Excel 时 11 MB 无法解释的 RAM 也很常见...
-
Does anyone have an idea what I am doing wrong ?你没有做错任何事 :) 33-45 mb 的内存来处理你正在创建的数组是很正常的 :) 这是一篇关于“Excel 内存限制 - Charles威廉斯”,您可能喜欢阅读? decisionmodels.com/memlimitsc.htm -
感谢您的回答。 11 MB(法语为 Mo,抱歉),我同意这不是一个重要的泄漏,但我发布的代码只是我必须为非常大的范围做的一个示例。如果我设置 xSize=2000 而不是 200,我会得到 100 MB 的泄漏...逐行调试代码显示指令“Set myRange = Nothing”不会释放任何内存。有什么想法吗?
-
FWIW,我在 Excel 2010 32 位、Win7 64 位中使用这些结果运行此代码:在运行宏之前打开工作表并添加此代码 - 31Meg,在
.Close行上运行宏直到中断 - 52Meg,让宏完成 - 31Meg。即no内存泄漏 -
我在 Win7 32 位上运行 Excel 2007 32 位。我第一次打开 Excel 并中断“Application.ScreenUpdating = False”语句,22 MB,运行到中断。关闭行 50 MB,让宏完成 34 MB。第二次重新启动宏不再显示任何泄漏,内存使用稳定在 34 MB。感谢您的帮助,但我还是有点担心(不知道到底发生了什么)。
标签: excel vba memory range memory-leaks