如何清除内存,以防止“内存不足错误”在Excel VBA中?

我在一个大的电子表格上运行VBA代码。 如何清除程序/调用之间的内存以防止发生“内存不足”问题?

谢谢

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

Sub Whatever() Dim someLargeObject as SomeObject 'expensive computation Set someLargeObject = Nothing End Sub 

还要注意,全局variables仍然是从一个调用分配到另一个调用,所以如果你不需要持久化,你不应该使用全局variables,或者当你不再需要它们时将它们取消。

但是,如果:

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

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

我find了一个解决方法。 起初它似乎需要更多的时间,但实际上使得所有的工作更顺畅和更快,因为交换和更less的内存可用。 这不是一个科学的方法,它需要一些testing之前,它的工作。

在代码中,让Excel每隔一段时间保存工作簿。 我不得不通过一张360 000行的表格,而且窒息严重。 每过万次之后,我就把代码保存在工作簿中,现在它甚至可以在32位Excel上工作。

如果您同时启动任务pipe理器,每次保存后可以看到内存使用率急剧下降。

答案是你不能明确,但你应该释放你的例程中的记忆。

一些技巧虽然帮助记忆

  • 确保在退出例程之前将对象设置为空。
  • 如果需要,请确保您在对象上调用Close。
  • 除非绝对必要,否则不要使用全局variables

我会build议检查内存使用情况,一次又一次地执行例程,你可能会有内存泄漏。

如果你在一个大的数据集上操作,数组很有可能会被使用。 对于我从500 000行和30列工作表中创build几个数组导致了这个错误。 我简单地通过使用下面的行来解决它,以摆脱不再需要我的数组,然后创build另一个:

 Erase vArray 

另外,如果只使用30列中的2列,则最好创build两个1列数组而不是30列。 它不会影响速度,但内存使用情况会有所不同。

我有一个类似的问题,我自己解决….我认为这是部分我的代码占用太多的内存,而太多的“大事”

在我的应用程序 – 工作簿出去抓住另一个部门的“日常报告”..我提取出我们的团队需要的所有信息(以最小化错误和数据input)。

我直接拉他们的工作表…但我讨厌他们使用合并细胞…我摆脱(即unmerge,然后find结果的空白单元格,并填写上面的值)

我让我的问题消失了

a)仅取消“已使用的单元格” – 而不仅仅是试图执行整列…即查找列中最后一个使用的行,并且只取消这个范围(在每张表单上我确实有1000个行)

b)知道撤消只会在最后的16个事件之后进行……在每个“unmerge”之间 – 我把15个事件清除了存储在“撤消”中的内容,以最大限度地减less内存的数量(即去一些数据在其中的单元格..和复制/ /粘贴特殊值…我猜测,累计总数30sheets每个有3列的数据可能是税收内存设置作为撤消侧

是的,它不允许任何撤销的机会…但是整个目的是清除旧的信息,并提取新的时间敏感数据进行分析,所以这不是问题

声音老旧 – 但我的问题消失了