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它们各自对象中的引用计数器。 不需要手动操作。
只有两种情况需要进行明确的清理:
-
当你想要一个对象在它的variables超出范围之前被销毁(例如,你的过程需要很长时间来执行,并且对象拥有一个资源,所以你想尽快销毁对象释放资源)。
-
在两个或多个对象之间有循环引用时。
如果
objectA
存储对objectB
的引用,并且objectB
存储对objectA
的引用,则除非通过显式设置objectA.ReferenceToB = Nothing
或objectB.ReferenceToA = Nothing
制动链,否则这两个对象将永远不会被销毁。
你显示的代码片段是错误的。 不需要手动清理。 进行手动清理甚至是有害的,因为它会给你一个错误的更正确的代码感 。
如果在类级别有一个variables,当类实例被破坏时,它将被清除/销毁。 如果你愿意的话,你可以更早地销毁它(见第1.
项)。
如果在模块级别有一个variables,当程序退出时(或者在VBA的情况下,VBA项目被重置时),它将被清除/销毁。 如果你愿意的话,你可以更早地销毁它(见第1.
项)。
variables的访问级别(公有与私有)不会影响其使用寿命。
VBA使用通过引用计数实现的垃圾收集器。
可以有多个对给定对象的引用(例如, Dim aw = ActiveWorkbook
创build对Active Workbook的新引用),因此只有在清除了没有其他引用的情况下,垃圾回收器才会清理对象。 设置为Nothing是递减引用计数的明确方式。 退出范围时,计数会隐式递减。
严格来说,在现代Excel版本(2010+)中,将Nothing设置为Nothing是不必要的,但是旧版本的Excel存在问题(解决方法是显式设置)