Excel VBAvariables何时应该被杀死或设置为Nothing?

在过去的两年中,我一直在教自己的Excel VBA,我有这样的想法,有时在代码段的末尾处理variables是合适的。 例如,我已经在Ron de Bruin的将Excel转换为HTML的代码中使用了这一点:

Function SaveContentToHTML (Rng as Range) Dim FileForHTMLStorage As Object Dim TextStreamOfHTML As Object Dim TemporaryFileLocation As String Dim TemporaryWorkbook As Workbook ... TemporaryWorkbook.Close savechanges:=False Kill TemporaryFileLocation Set TextStreamOfHTML = Nothing Set FileForHTMLStorage = Nothing Set TemporaryWorkbook = Nothing End Function 

我已经做了一些这方面的search,没有发现如何做到这一点,并在一个论坛发表声明,没有局部variables需要清除 ,因为他们在End Sub不存在。 我猜,根据上面的代码,这可能不是真正的End Function ,或在其他情况下,我没有遇到。

所以我的问题归结为:

  • 网上有什么地方解释了variables清理的时间和原因,我只是没有find它?

如果没有人可以在这里请解释…

  • 什么时候variables清理Excel VBA是必要的,什么时候不是?
  • 更具体地说…是否有特定的variables使用(公共variables?函数定义的variables?)在内存中保存的时间比subprocess长,如果我自己没有清理,会造成麻烦?

VB6 / VBA使用确定性方法去除物体。 每个对象都存储一些对自身的引用。 当数字达到零时,对象被销毁。

当它们超出范围时,对象variables保证被清除(设置为Nothing ),这将减less它们各自对象中的引用计数器。 不需要手动操作。

只有两种情况需要进行明确的清理:

  1. 当你想要一个对象在它的variables超出范围之前被销毁(例如,你的过程需要很长时间来执行,并且对象拥有一个资源,所以你想尽快销毁对象释放资源)。

  2. 在两个或多个对象之间有循环引用时。

    如果objectA存储对objectB的引用,并且objectB存储对objectA的引用,则除非通过显式设置objectA.ReferenceToB = NothingobjectB.ReferenceToA = Nothing制动链,否则这两个对象将永远不会被销毁。

你显示的代码片段是错误的。 不需要手动清理。 进行手动清理甚至是有害的,因为它会给你一个错误的更正确的代码感 。

如果在类级别有一个variables,当类实例被破坏时,它将被清除/销毁。 如果你愿意的话,你可以更早地销毁它(见第1.项)。

如果在模块级别有一个variables,当程序退出时(或者在VBA的情况下,VBA项目被重置时),它将被清除/销毁。 如果你愿意的话,你可以更早地销毁它(见第1.项)。

variables的访问级别(公有与私有)不会影响其使用寿命。

VBA使用通过引用计数实现的垃圾收集器。

可以有多个对给定对象的引用(例如, Dim aw = ActiveWorkbook创build对Active Workbook的新引用),因此只有在清除了没有其他引用的情况下,垃圾回收器才会清理对象。 设置为Nothing是递减引用计数的明确方式。 退出范围时,计数会隐式递减。

严格来说,在现代Excel版本(2010+)中,将Nothing设置为Nothing是不必要的,但是旧版本的Excel存在问题(解决方法是显式设置)