Excel,VBA:清除内存

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

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

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

我想知道,也许有一些技巧,我可以在列之间实现,使Excel忘记它一直记住? 我并不在意它是否会影响性能(如果它已经caching了任何对进一步计算有用的东西),我只需要保持内存使用量不会变得太大而无法处理。 我search了一下,但所有的build议都是关于把大的东西设置成什么都没有 – 我没有什么特别的东西,只是循环,所以可能不适用于我的情况。

代码是这样的(现在不要在我身上,但是它是一个简单的版本):

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 

基本上,我把它们染成白色,所以我没有看到杂乱的function文本,添加function,执行它,保存为值,颜色文本黑色。 重要的补充:我使用SUMPRODUCT来从封闭文件中求和一些单元格。

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

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

Application.ScreenUpdating = False

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

Application.ScreenUpdating = True

现在改变字体颜色是不必要的。 在执行macros时,屏幕将被locking以进行刷新,因此在macros完成工作之前您将不会看到更改。

考虑一下,禁用事件。

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

第二件事是使用Evaluate()函数。 请谷歌,并阅读有关该function是如何有效。

而不是把一个函数放到单元格中,然后执行.Value = .Value你可以直接Evaluate()一个expression式,并将结果直接返回到更快的单元格中!

所以你可以做类似的事情

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

我希望你明白这个主意。

这里有几个链接提示如何加快你的macros:

我知道这是一个老问题,但似乎工作的方式是保存工作簿。 运行ThisWorkbook.Save每隔一段时间,如果你在任务pipe理器中监视EXCEL你会注意到,它清除了大量的内存。

看起来好像,Excel可能caching某些函数调用或某事,并保存清除此caching。