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

时间:2013-01-18 10:32:33

标签: excel vba memory

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

由于

6 个答案:

答案 0 :(得分:13)

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

Sub Whatever()
    Dim someLargeObject as SomeObject

    'expensive computation

    Set someLargeObject = Nothing
End Sub

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

然而,如果:

,这将无济于事
  • 你需要在程序之后的对象(很明显)
  • 你的对象不适合记忆

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

答案 1 :(得分:12)

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

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

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

答案 2 :(得分:1)

如果您对大型数据集进行操作,则很可能会使用数组。 对我来说,从500 000行和30列工作表创建一些数组导致此错误。我只是通过使用下面的行来解决它,在创建另一个之前摆脱不再需要的数组:

Erase vArray

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

答案 3 :(得分:0)

找到了这个线程来寻找我的问题的解决方案。我需要一个我认为可能对其他人有用的不同解决方案。我的宏正在删除行,向上移动并将行复制到另一个工作表。处理仅4000条记录后,内存使用量激增至几千,导致“内存不足”。是什么为我解决了?

application.screenupdating =假

在我的代码的开头添加了此内容(请确保在结尾处再次使其正确) 我知道这样做会使它运行得更快,但确实如此。但是对内存问题一无所知。

进行较小的更改后,内存使用量未超过135 mb。为什么这样做?真的不知道但这值得一试,并且可能适用于您。

答案 4 :(得分:0)

我能够通过简单地初始化稍后在程序中使用的变量来解决此错误。当时,我没有在班级/模块中使用Option Explicit。

答案 5 :(得分:-1)

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

在我的应用程序中 - 工作簿出来并抓住另一个部门“每日报告”..我提取出我们团队需要的所有信息(以最大限度地减少错误和数据输入)。

我直接拉他们的床单...但我讨厌他们使用合并细胞的事实...我摆脱了(即取消合并,然后找到生成的空白细胞,并填写上面的值)< / p>

我通过

让我的问题消失了

a)仅取消“使用过的单元格” - 而不是仅仅尝试执行整列...即找到列中最后一个使用的行,并且只取消合并此范围(每个行上都有1000行)表格我抓住了)

b)知道撤消只关注最后的~16个事件......在每个“unmerge”之间 - 我放了15个事件,清除了“撤消”中存储的内容,以最大限度地减少占用的内存量(即转到其中有数据的某个单元格..并复制//粘贴特殊值...我认为30个表格的累计总和每个有3列数据可能会占用内存设置为撤消的一面

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

声音陈旧 - 但我的问题消失了