我有一个Excel宏,没有太花哨的东西,没有对象,只是简单的有公式的旧循环。基本上是这样:
我在一列中循环行,将相当大的SUMPRODUCT函数分配给单元格,而不执行它们。一旦我遍历行,我就执行两次Range.Value = Range.Value,以执行公式并将结果保存为值。然后我去看下一篇专栏。
随着Excel使用的每一列内存的显着增加,在宏完成并保存文件之后,内存仍然被使用(如果我可以信任任务管理器)。在我关闭并重新打开文件之后--当然,所有内存都被释放了,我可以继续工作。由于内存限制,我已经到了无法处理32位Excel上所需的所有列的地步。
我在想,也许我可以在列之间实现一些技巧,让Excel忘记它一直记得的东西?我并不关心它是否会影响性能(如果它缓存了任何对进一步计算有用的东西),我只需要防止内存使用量增长到无法处理的程度。我谷歌了一些,但所有的建议都是关于设置大的对象为零-我并没有真正设置任何东西,只是循环,所以这可能不适用于我的情况。
代码是这样的(现在我没有它,但它是其中所包含内容的一般简化版本):
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从关闭的文件中求和一些单元格.
发布于 2013-10-22 10:11:46
这些代码并不足以帮助您提高效率。不过,我现在可以为你指出一些建议。
要记住的第一件事是在宏开始时将应用程序屏幕更新切换为false。
Application.ScreenUpdating = False
然后在宏代码结束前将其切换回来。
Application.ScreenUpdating = True
现在没有必要更改字体颜色了。在执行宏时,您的屏幕将被锁定以进行刷新,因此在宏完成工作之前,您将不会看到这些更改。
考虑一下,也禁用事件。
Application.EnableEvents = False和Application.EnableEvents = true与屏幕更新相同。
第二件事是使用thing ()函数。请在谷歌上搜索并阅读该功能的效率。
与其将函数放入单元格,然后执行.Value = .Value,您只需Evaluate()一个表达式,并将结果直接返回到单元格,这要快得多!
所以你可以做这样的事
for i = 1 to 12
ThisWorkbook.ActiveWorksheet.Range(Cells(1,i),Cells(x,i)).Value = Evaluate("=SUM(blah)")
next i我希望你明白这个想法。
以下是一些关于如何加快宏速度的技巧链接:
发布于 2016-04-27 12:19:46
我知道这是一个老问题,但似乎可行的方法是保存工作簿。每隔一段时间运行一次ThisWorkbook.Save,如果您在任务管理器中监视EXCEL,您会注意到它清除了大量内存。
看起来Excel可能在缓存某些函数调用或其他什么,并且保存清除了这个缓存。
https://stackoverflow.com/questions/19513271
复制相似问题