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。
然后在宏代码结束之前将其切换回
现在无需更改字体颜色。在执行宏时,屏幕将被锁定以刷新,因此在宏完成工作之前您将看不到更改。
考虑一下,也禁用事件。
第二件事是利用Evaluate()函数。请搜索它,并阅读该功能的效率。
除了将函数放入单元格然后执行
所以你可以做类似的事情
1 2 3 | for i = 1 to 12 ThisWorkbook.ActiveWorksheet.Range(Cells(1,i),Cells(x,i)).Value = Evaluate("=SUM(blah)") next i |
希望您能明白。
以下是一些有关如何加速宏的提示的链接:
-
http://msdn.microsoft.com/zh-CN/library/office/ff193019.aspx
-
Evaluate Functions and Formulas fun: How to make Excel’s Evaluate method twice as fast
-
http://www.soa.org/news-and-publications/newsletters/compact/2012/january/com-2012-iss42-roper.aspx
-
http://xlvba.fr.yuku.com/topic/278/The-Evaluate-Method#.UmZP6Pmkp8s
我知道这是一个古老的问题,但是一种可行的方法是保存工作簿。偶尔运行
似乎Excel可能正在缓存某些函数调用或某些内容,并且保存会清除此缓存。