Excel VBA变量何时应被杀死或设置为Nothing?

在过去的两年中,我一直在自学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

我已经对此进行了一些搜索,发现除如何执行之外几乎没有发现,并且在一个论坛中发表了一个声明,无需清除任何局部变量,因为它们不再存在于End Sub。根据以上代码,我猜测在End Function或在其他情况下我可能没有遇到过这种情况。


所以我的问题可以归结为:


网络上是否有什么地方解释了何时以及为何进行变量清除,而我只是没有找到它?

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


什么时候需要清除Excel VBA的变量,何时不需要?

更具体地说,...是否有特定的变量用法(公共变量或函数定义的变量?)在内存中的保存时间比subs更长,因此如果我不自己清理,可能会造成麻烦?


不负相思意
浏览 1658回答 3
3回答

潇潇雨雨

VB6 / VBA使用确定性方法存储对象。每个对象存储对其自身的引用数量。当数字达到零时,对象将被销毁。当对象变量Nothing超出范围时,保证将其清除(设置为),这将减少其各自对象中的引用计数器。无需手动操作。当您需要显式清理时,只有两种情况:当您要在对象的变量超出范围之前对其进行销毁时(例如,您的过程将花费很长时间执行,并且该对象拥有资源,因此您希望尽快销毁该对象以释放对象)资源)。在两个或多个对象之间具有循环引用时。如果objectA存储objectB并objectB引用了objectA这两个对象,则除非通过显式设置objectA.ReferenceToB = Nothing或制动链,否则这两个对象将永远不会被破坏objectB.ReferenceToA = Nothing。您显示的代码段是错误的。无需手动清理。进行手动清理甚至有害,因为这会使您对更正确的代码有错误的认识。如果在类级别具有变量,则在销毁类实例时将清除/销毁该变量。您可以根据需要提前销毁它(请参阅第项1.)。如果在模块级别具有变量,则在程序退出时(或在VBA情况下,当VBA项目重置时)将清除/销毁该变量。您可以根据需要提前销毁它(请参阅第项1.)。变量的访问级别(公共或私有)不会影响其生存时间。

繁星点点滴滴

VBA使用通过引用计数实现的垃圾收集器。一个给定对象可以有多个引用(例如,Dim aw = ActiveWorkbook创建对Active Workbook的新引用),因此,垃圾收集器仅在明确没有其他引用时才清除该对象。设置为Nothing是减少引用计数的一种明确方法。退出范围时,计数将隐式递减。严格来说,在现代Excel版本(2010+)中,没有必要将“无”设置为“空”,但是较早版本的Excel存在一些问题(为此必须明确设置解决方法)

慕雪6442864

我至少有一种情况不会自动清除数据,最终将导致“内存不足”错误。在用户窗体中,我有:Public mainPicture As StdPicture...mainPicture = LoadPicture(PAGE_FILE)销毁UserForm后(Unload Me),mainPicture未取消分配为中加载的数据分配的内存。我必须添加一个明确的mainPicture = Nothing在终止事件中。
打开App,查看更多内容
随时随地看视频慕课网APP