Excel,VBA:清除内存

Excel, VBA: Clear memory

我有一个Excel宏,没有什么花哨的东西,没有对象,只是带有公式的简单旧循环。基本上是这样的:

我在一行中的各行之间循环,将相当大的SUMPRODUCT函数分配给单元格而不执行它们。循环浏览完行后,我将执行Range.Value = Range.Value两次以执行公式并将结果另存为值。然后我进入下一篇专栏。

随着Excel使用的每一列内存显着增加,并且在完成宏并保存文件后-内存仍在使用(如果我可以信任任务管理器)。关闭并重新打开文件后,所有内存当然都已释放,我可以继续工作。由于内存限制,我已经无法处理32位Excel上需要的所有列。

我想知道,也许我可以在各列之间实施一些技巧,以使Excel忘记它要记住的内容?我并不在乎它是否会影响性能(以防它缓存了任何对进一步计算有用的东西),我只需要防止内存使用量过大而无法处理。我在Google上搜索了一下,但所有建议都与将大对象设置为空无关-我实际上并没有对任何东西设置太多内容,只是循环浏览,所以这可能不适用于我的情况。

代码是这样的(现在不要放在我身上,但这是其中的通用简化版本):

1
2
3
4
5
6
7
8
9
10
11
12
for i = 1 to 12
    ThisWorkbook.ActiveWorksheet.Range(Cells(1,i),Cells(x,i)).Font.Color = vbWhite

    for m = 1 to x
        ThisWorkbook.ActiveWorksheet.Cells(m, i).Formula ="'=SUMPRODUCT(blah)"
    next m

    ThisWorkbook.ActiveWorksheet.Range(Cells(1,i),Cells(x,i)).Value = ThisWorkbook.ActiveWorksheet.Range(Cells(1,i),Cells(x,i)).Value
    ThisWorkbook.ActiveWorksheet.Range(Cells(1,i),Cells(x,i)).Value = ThisWorkbook.ActiveWorksheet.Range(Cells(1,i),Cells(x,i)).Value

    ThisWorkbook.ActiveWorksheet.Range(Cells(1,i),Cells(x,i)).Font.Color = vbBlack
next i

基本上,我将它们涂成白色,所以看不到凌乱的函数文本,添加函数,执行它,另存为值,将文本颜色为黑色。
重要补充:我使用SUMPRODUCT对关闭文件中的某些单元格求和。


这真的不足以帮助您提高效率。我现在可以为您指出一些技巧。

要记住的第一件事是在宏开始时将应用程序屏幕更新切换为false。

Application.ScreenUpdating = False

然后在宏代码结束之前将其切换回

Application.ScreenUpdating = True

现在无需更改字体颜色。在执行宏时,屏幕将被锁定以刷新,因此在宏完成工作之前您将看不到更改。

考虑一下,也禁用事件。

Application.EnableEvents = FalseApplication.EnableEvents = true与屏幕更新的想法相同。

第二件事是利用Evaluate()函数。请搜索它,并阅读该功能的效率。

除了将函数放入单元格然后执行.Value = .Value之外,您还可以Evaluate()一个表达式并将结果直接返回到单元格中,这要快得多!

所以你可以做类似的事情

1
2
3
for i = 1 to 12
    ThisWorkbook.ActiveWorksheet.Range(Cells(1,i),Cells(x,i)).Value = Evaluate("=SUM(blah)")
next i

希望您能明白。

以下是一些有关如何加速宏的提示的链接:


我知道这是一个古老的问题,但是一种可行的方法是保存工作簿。偶尔运行ThisWorkbook.Save,如果您在任务管理器中监视EXCEL,您会注意到它清除了大量内存。

似乎Excel可能正在缓存某些函数调用或某些内容,并且保存会清除此缓存。