0

我有一个只有 1MB 的 excel 文件,但它会无限期地增加内存使用量(超过 6GB),直到它崩溃。

该工作表由 100 个独立的行组成,每行大约 300 列,它从加载项中提取数据并进行 Excel 计算。Excel 具有连接到本地 Access DB 以提取 10,000 个 ID 的 VBA,然后一次以 100 个为一组通过它们,从加载项中提取数据(使用 UDF),然后进入下一个 100。

它执行以下步骤:1)从 Access DB 中提取 10,000 个唯一 8 字符 ID 的列表,将它们插入 Sheet2(未用于其他任何内容)-这部分不使用太多内存 2)在 VBA 中-从顶部,它一次循环遍历 100 个 ID 的块,将它们复制到 Sheet1 中的 A1:A100 位置,其中 300 列引用 UDF 并计算每行 A 列中的 ID 3) 计算要拉入的工作表来自 UDF 的每列的新数据

即使之前的 100 个 ID 块消失了,这似乎只会在每次运行时增加内存使用量(我这样做是因为如果我一次执行 10,000 个,它似乎会崩溃)。工作簿是关于手动计算的(因此是第 3 步);并且所有对象都被设置为 = 数据库信息复制一次没有完成。

如何阻止内存使用量累积?这似乎与 UDF 在运行后没有清除内存有关。有没有办法在每个 100 个 ID 块之后清除 Excel 中的任何缓存或使用 VBA 重置它?谢谢

4

2 回答 2

0

我同意蒂姆·威廉姆斯的观点,描述中没有提供足够的信息来实际回答这个问题。但是,我会冒险猜测它是VBA 内存泄漏。(如果你不熟悉内存泄漏,这里是维基百科的文章

我遇到了一些导致内存增加的事情,类似于您所描述的:

  1. 正如文章所指出的,VBA 垃圾收集器只计算引用的数量,因此相互引用的两个项目将无限期地留在内存中。要解决此问题,请确保将它们的引用明确设置为Nothing.

  2. 我见过的另一个是必须由.Closeor.Quit方法显式释放的 COM 对象。

话虽如此,如果您甚至可以提供代码主循环的粗略伪代码大纲,那将大大有助于帮助本网站上的人们帮助您:)

于 2013-11-04T22:24:03.713 回答
0

如果您在多次迭代后保存文件“ActiveWorkbook.Save”,它将为您清除内存缓存,并且它将继续执行,就像您已保存、关闭和重新打开文件一样,不会浪费很多时间。

于 2016-05-18T15:08:53.880 回答