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

iqxoj9l9  于 2022-12-20  发布在  其他
关注(0)|答案(7)|浏览(1475)

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

0x6upsns

0x6upsns1#

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

Sub Whatever()
    Dim someLargeObject as SomeObject

    'expensive computation

    Set someLargeObject = Nothing
End Sub

还要注意,全局变量仍然是从一个调用分配到另一个调用的,所以如果您不需要持久性,那么您应该不使用全局变量,或者在您不再需要它们时使它们无效。
但是,如果出现以下情况,则不会有任何帮助:

  • 在过程之后需要对象(很明显)
  • 你的对象不适合内存

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

vom3gejh

vom3gejh2#

我已经找到了一个变通方案。一开始它看起来会占用更多的时间,但实际上它使一切工作更顺利,更快,因为更少的交换和更多的内存可用。这不是一个科学的方法,它需要一些测试之前,它的工作。
在代码中,让Excel不时地保存工作簿。我不得不循环通过一个有36万行的工作表,它卡住了。每10 000行后,我让代码保存工作簿,现在它的工作就像一个魅力,即使在32位Excel。
如果您同时启动任务管理器,您可以看到内存利用率在每次保存后急剧下降。

r6l8ljro

r6l8ljro3#

答案是你不能显式地释放内存,但是你应该在例程中释放内存。
一些帮助记忆的小窍门

  • 确保在退出例程之前将object设置为null。
  • 确保在对象需要时调用Close。
  • 除非绝对必要,否则不要使用全局变量

我建议在反复执行例程后检查内存使用情况,您可能会出现内存泄漏。

bwitn5fc

bwitn5fc4#

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

Erase vArray

另外,如果只使用了30列中的2列,最好创建两个1列数组,而不是一个30列数组,这不会影响速度,但内存使用量会有所不同。

juud5qan

juud5qan5#

发现此线程正在寻找我的问题的解决方案。我的问题需要一个不同的解决方案,我发现该解决方案可能对其他人有用。我的宏正在删除行、上移并将行复制到另一个工作表。内存使用量激增到几GB,并在处理了大约4000条记录后导致“内存不足”。是什么为我解决了这个问题?
应用程序.屏幕更新=假
补充说,在我的代码开始(一定要使它再次成立,在结束),我知道这将使它运行得更快,它做到了..但不知道内存的事情。
在做了这个小改动之后,内存使用量没有超过135mb。为什么会这样呢?真的不知道。但是值得一试,可能对你也适用。

jv4diomz

jv4diomz6#

我有一个类似的问题,我自己解决了...我认为这部分是我的代码占用了太多的内存,而太多的“大事情”
在我的应用程序中-工作簿出去抓取另一个部门的“每日报告”。。我提取出我们团队需要的所有信息(以尽量减少错误和数据输入)。
我拉在他们的工作表直接...但我讨厌的事实是,他们使用合并的单元格...我摆脱(即取消合并,然后找到由此产生的空白单元格,并填写上述值)
我的问题解决了
a)只取消合并“使用的单元格”-而不是仅仅尝试做整个列...即找到列中最后使用的行,并只取消合并此范围(有字面上的每一个工作表上的1000行我抓)
B)知道撤销只会处理最后16个事件...在每个“unmerge”之间-我放了15个事件,这些事件清除了存储在“撤销”中的内容,以最大限度地减少占用的内存量(即转到某个有数据的单元格...并复制//粘贴特殊值...)我猜想,30张表的累积总和,每张表有3列数据,可能会对设置为撤消侧的内存造成负担
是的,它不允许任何撤销的机会...但整个目的是清除旧信息并拉入新的时间敏感数据进行分析,因此这不是问题
听起来很老套-但我的问题消失了

pieyvz9o

pieyvz9o7#

我可以通过简单地初始化一个变量来修复这个错误,这个变量是在我的程序中稍后使用的,当时我没有在我的类/模块中使用Option Explicit。

相关问题