2009-11-21 112 views
5

有沒有辦法在VBA/Excel 2000中強制垃圾回收?強制垃圾回收

此問題涉及Excel中的宏語言。 不使用VB .NET來操作Excel。所以GC.Collect的()將無法工作

回答

11

你不能直接使用VBA時.NET Framework提供垃圾收集的優勢。 Perhaps this article通過埃裏克利珀將有助於

+1

我不知道VBA使用了引用計數,並且不支持清理循環引用。這可能是下層問題。 最初的問題是,有時工作簿在關閉和在類的析構函數中被解除引用時沒有正確關閉。我認爲問題來自於對象尚未收集。最有可能的是我有一些循環引用了一些有時候會發揮作用的輪子。謝謝你的提示。 – Zen 2009-11-21 15:01:18

+0

我同意,你不能直接從VBA做到這一點。但是如果你引用一個COM庫,你實際上可以利用.NET的GC。請參閱[**我的答案**](http://stackoverflow.com/questions/20398477/how-to-set-application-name-in-adodb-connection-string/20406284#20406284),特別是有關'.Dispose()'從VBA調用的方法。 – 2014-02-03 12:50:58

3

VBA/Excel沒有垃圾收集,像老VB。它使用引用計數來代替GC。當您將指針設置爲空(或變量超出範圍時)時,內存將被釋放。就像在舊的VB中一樣,它意味着循環引用永遠不會被釋放。

+0

此處有一個已知問題的示例:https://support.microsoft.com/en-us/help/280454/password-prompt-for-vba-project-appears-after-excel-quits – 2017-04-22 19:31:50

3

你不能強迫GC在VBA,但它是很好的設置爲Nothing全局變量。

通過KD7提到的文章說了也沒用,他們走出去的範圍之前設置爲Nothing局部變量,但不會談論全局變量。

在VBA的模塊中定義的全局變量在整個的Excel會話仍然存活,即直到含有VBA模塊定義它們關閉該文檔。

所以不要把無用Set O = Nothing當O爲局部的,但做到這一點時,它的全球性的。