Excel,VBA:清除内存

时间:2013-10-22 08:53:22

标签: excel vba excel-vba memory

我有一个用于Excel的宏,没有什么太花哨,没有对象,只有普通的公式循环。基本上是这样的:

我循环遍历一列中的行,为单元格分配相当大的SUMPRODUCT函数而不执行它们。一旦我循环遍历该行,我执行Range.Value = Range.Value两次以执行公式并将结果保存为值。然后我去下一栏。

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

我在想,也许我可以在列之间实现一些技巧,让Excel忘记它记忆中的任何东西?我真的不在乎它是否会达到性能(如果它已经缓存了任何对进一步计算有用的东西),我只需要保持内存使用量不会变得太大而无法处理。我用Google搜索了一下,但所有的建议都与将大对象设置为无关 - 我并没有真正设置任何东西,只是循环,所以这可能不适用于我的情况。

代码是这样的(现在没有它,但它是它的内容的一般简化版本):

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对已关闭文件中的某些单元格进行求和。

2 个答案:

答案 0 :(得分:5)

这不足以帮助您提高效率。我现在可以为你指出一些提示。

首先要记住的是在宏的开头将应用程序屏幕更新切换为false。

Application.ScreenUpdating = False

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

Application.ScreenUpdating = True

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

考虑一下,也禁用事件。

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

第二件事是使用Evaluate()函数。请谷歌并阅读该功能的效率。

不是将函数放入单元格然后执行.Value = .Value,而是只需Evaluate()表达式并将结果直接返回到单元格,这要快得多!

所以你可以做类似

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

我希望你明白这一点。

以下是一些链接,其中包含有关如何加速宏的提示:

答案 1 :(得分:2)

我知道这是一个老问题,但似乎有效的方法是保存工作簿。每隔一段时间运行ThisWorkbook.Save,如果您在任务管理器中监控EXCEL,您会发现它会清除大量内存。

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