我有一个用于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对已关闭文件中的某些单元格进行求和。
答案 0 :(得分: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
我希望你明白这一点。
以下是一些链接,其中包含有关如何加速宏的提示:
答案 1 :(得分:2)
我知道这是一个老问题,但似乎有效的方法是保存工作簿。每隔一段时间运行ThisWorkbook.Save
,如果您在任务管理器中监控EXCEL,您会发现它会清除大量内存。
似乎Excel可能正在缓存某些函数调用或某些东西,并且保存会清除此缓存。