【问题标题】:Forcing Garbage Collection强制垃圾回收
【发布时间】:2013-11-27 21:07:27
【问题描述】:

有没有办法在 VBA/Excel 2000 中强制进行垃圾回收?

本题涉及 Excel 中的宏语言。 不使用 VB .NET 来操作 Excel。所以 GC.collect() 不起作用

【问题讨论】:

    标签: vba excel excel-2000


    【解决方案1】:

    在使用直接 VBA 时,您无法利用 .NET Framework 提供的垃圾收集。 Perhaps this article Eric Lippert 会有所帮助

    【讨论】:

    • 我不知道 VBA 使用了引用计数并且不支持清理循环引用。这可能是潜在的问题。最初的问题是,有时工作簿在类析构函数中关闭和取消引用时无法正确关闭。我认为问题出在该对象尚未被收集。很可能我有一个循环引用一些有时会起作用的乳清。感谢您的提示。
    • 我同意,您不能直接从 VBA 执行此操作。但是,如果您引用 COM 库,您实际上可以利用 .NET 的 GC。请参阅my answer,特别是有关从 VBA 调用的.Dispose() 方法的部分。
    【解决方案2】:

    您不能在 VBA 中强制 GC,但最好将全局变量设置为 Nothing。

    kd7提到的那篇文章说,局部变量在超出范围之前设置为Nothing是没有用的,但没有谈到全局变量。

    在 VBA 中,模块中定义的全局变量在整个 Excel 会话中保持活动状态,即直到包含定义它们的 VBA 模块的文档关闭。

    所以不要在 O 是本地的时候放无用的Set O = Nothing,而是在它是全局的时候放。

    【讨论】:

      【解决方案3】:

      VBA/Excel 没有垃圾收集,就像旧的 VB。它使用引用计数代替 GC。当您将指针设置为空(或变量超出范围)时,内存将被释放。就像在旧的 VB 中一样,这意味着循环引用永远不会被释放。

      【讨论】:

      猜你喜欢
      • 2011-01-26
      • 2015-02-12
      • 2010-11-09
      • 2010-09-16
      • 2010-11-01
      • 2010-09-19
      • 2015-11-16
      相关资源
      最近更新 更多