wat*_*lea 2 memory excel vba excel-vba
我有一个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
Run Code Online (Sandbox Code Playgroud)
基本上,我把它们涂成白色,所以我看不到杂乱的功能文本,添加功能,执行它,保存为值,颜色文本为黑色. 重要补充:我使用SUMPRODUCT来对已关闭文件中的一些单元格求和.
小智 5
这不足以帮助您提高效率.我现在可以为你指出一些提示.
要记住的第一件事是在宏的开头将应用程序屏幕更新切换为false.
Application.ScreenUpdating = False
然后在宏代码结束之前将其切换回来
Application.ScreenUpdating = True
现在不需要更改字体颜色.在宏执行时,您的屏幕将被锁定以进行刷新,因此在宏完成工作之前您将看不到更改.
考虑一下,也禁用事件.
Application.EnableEvents = False和Application.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
Run Code Online (Sandbox Code Playgroud)
我希望你明白这个主意.
以下是一些链接,其中包含有关如何加速宏的提示:
http://msdn.microsoft.com/en-us/library/office/ff193019.aspx
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