我有一个只有1MB的excel文件但无限期地增加内存使用量(超过6GB),因为它一直运行直到它崩溃。
工作表由100个独立的行组成,每行大约有300列,它从插件中提取数据,并且可以实现卓越的计算。 excel有连接到本地Access DB的VBA以提取10,000个ID,然后一次以100个为一组通过它们,从加载项中提取数据(使用UDF)然后转到下一个100。 / p>
执行以下步骤: 1)从Access DB中提取10,000个唯一8个字符的ID列表,将它们插入Sheet2(其他任何东西都不用) - 这个部分不会占用太多内存 2)在VBA中 - 从顶部开始,它一次以100个ID的块循环,将它们复制到Sheet1中的A1:A100位置,其中300列引用UDF,并计算每行的columb中的ID 3)计算工作表以从每列的UDF中提取新数据
这似乎只会增加每次运行时的内存使用量,即使前一个100 ID的块已经消失了(我这样做了,因为如果我一次做10000次就好像崩溃了)。工作簿是手动计算(因此步骤3);并且所有对象都被设置为=一旦完成数据库信息复制就没有了。
如何停止累积内存使用?这似乎与UDF一旦运行后没有清除内存有关。有没有办法清除Excel中的任何缓存或在每个100个ID块之后用VBA重置它? 感谢
答案 0 :(得分:0)
我同意蒂姆·威廉姆斯,说明中没有提供足够的信息实际回答问题。但是,我会猜测它是VBA memory leak。 (如果您不熟悉内存泄漏,here is Wikipedia's article)
我遇到了一些导致内存增加的事情,类似于你所描述的:
正如文章所述,VBA垃圾收集器只计算引用数,因此两个相互引用的项将无限期地保留在内存中。要解决此问题,请确保明确将其引用设置为Nothing
。
我见过的另一个是必须由.Close
或.Quit
方法明确发布的COM对象。
话虽如此,如果您能提供代码主循环的粗略伪代码轮廓,那么这将有助于帮助您在此网站上的人们:)
答案 1 :(得分:0)
如果在多次迭代后保存文件“ActiveWorkbook.Save”,它将为您清除内存缓存,它将继续,就好像您已保存,关闭并重新打开文件而不浪费大量时间