如何清除内存以防止excel vba中出现"内存不足错误"?

Mar*_*c L 24 memory excel vba

我在大型电子表格上运行VBA代码.如何清除程序/调用之间的内存以防止出现"内存不足"问题?

谢谢

ass*_*ias 13

帮助释放内存的最好方法是使大对象无效:

Sub Whatever()
    Dim someLargeObject as SomeObject

    'expensive computation

    Set someLargeObject = Nothing
End Sub
Run Code Online (Sandbox Code Playgroud)

另请注意,全局变量仍然从一个调用分配到另一个调用,因此如果您不需要持久性,则应该不使用全局变量,或者在不再需要它们时将它们置空.

但是,如果:

  • 程序后你需要对象(显然)
  • 你的对象不适合记忆

另一种可能性是切换到64位版本的Excel,它应该能够在崩溃之前使用更多的RAM(32位版本通常限制在大约1.3GB).

  • @assylias - 恕我直言,在程序结束时添加`Set obj = Nothing`(其中`obj`变暗)将无法释放额外的资源,因为无论如何该对象都被VBA垃圾收集器终止.但是,如果在sub中不再需要`obj`,则将其设置为空将更早地释放内存. (16认同)
  • 除了在VBA中保留最少的引用量外,我认为减少Excel中的数据量也非常重要。删除所有未使用的工作表,未使用的单元格,条件格式,颜色,验证,过滤器等(我遇到的情况是excel本身正在使用〜1.1GB的内存而没有任何宏...)因此,声明VBA和Excel本身很重要在Excel 2007或更低版​​本中共享1.3GB的内存。 (2认同)

Arn*_*son 13

我找到了一个解决方法.起初它似乎需要花费更多的时间,但它实际上使得一切工作更顺畅,更快,因为交换更少,内存更多.这不是一种科学的方法,它需要一些测试才能运行.

在代码中,使Excel不时地保存工作簿.我不得不在一张36万行的纸张上循环而且它很糟糕.每隔10 000我就会使代码保存工作簿,现在即使在32位Excel上也能像魅力一样工作.

如果同时启动任务管理器,则可以看到每次保存后内存利用率大幅下降.

  • 在保存工作簿时,Excel似乎基本上清除了内存.就像提交数据时sql清除事务日志一样. (2认同)
  • 嘿@ArneLarsson,您救了我的一天!!!这项工作就像一种魅力!!!的确,Excel保存后释放内存。 (2认同)