什么时候应该杀死Excel VBA变量或将其设置为Nothing?

Ins*_*ast 29 variables excel vba excel-vba

在过去的两年里,我一直在教自己Excel VBA,我认为有时候在代码段的末尾处理变量是合适的.例如,我已经看到它改编自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
Run Code Online (Sandbox Code Playgroud)

我已经对此进行了一些搜索,发现除了如何做之外几乎没有什么,并且在一个论坛中发布了一个声明,即不需要清除局部变量,因为它们不再存在于End Sub.我猜测,基于上面的代码,可能不是真的End Function,或者在我没有遇到过的其他情况下.

所以我的问题归结为:

  • 网上有什么地方可以解释变量清理的时间和原因,而我还没有找到它?

如果没有,请有人在这里解释......

  • 何时需要对Excel VBA进行变量清理,何时不进行?
  • 更具体地说......是否存在特定的变量用法(公共变量?函数定义的变量?),它们在内存中加载的时间比sub要长,如果我不自行清理,可能会造成麻烦?

GSe*_*erg 47

VB6/VBA使用确定性方法来处理令人讨厌的对象.每个对象存储自身的引用数.当数字达到零时,对象将被销毁.

保证在Nothing超出范围时清理(​​设置)对象变量,这会减少各自对象中的引用计数器.无需手动操作.

只有两种情况需要显式清理:

  1. 如果希望在变量超出范围之前销毁对象(例如,您的过程将花费很长时间来执行,并且对象拥有资源,那么您希望尽快销毁对象以释放资源).

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

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

您显示的代码段是错误的.无需手动清理.进行手动清理甚至是有害的,因为它会让您错误地了解更正确的代码.

如果在类级别有变量,则在类实例被销毁时将清除/销毁它.如果需要,可以提前销毁它(参见项目1.).

如果模块级别有变量,则在程序退出时将清除/销毁该变量(或者,如果是VBA,则重置VBA项目时).如果需要,可以提前销毁它(参见项目1.).

变量的访问级别(公共与私有)不会影响其生命周期.


She*_*tJS 6

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

对给定对象可以有多个引用(例如,Dim aw = ActiveWorkbook创建对 Active Workbook 的新引用),因此垃圾收集器仅在明确没有其他引用时才清理对象。设置为 Nothing 是减少引用计数的显式方法。当您退出作用域时,计数会隐式递减。

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