为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

不负相思意 2019-12-04 09:58:53
在过去的两年中,我一直在自学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 = NothingEnd Function我已经对此进行了一些搜索,发现除如何执行之外几乎没有发现,并且在一个论坛中发表了一个声明,无需清除任何局部变量,因为它们不再存在于End Sub。根据以上代码,我猜测在End Function或在其他情况下我可能没有遇到过这种情况。所以我的问题可以归结为:网络上是否有什么地方解释了何时以及为何进行变量清除,而我只是没有找到它?如果没有人在这里,请解释一下...什么时候需要清除Excel VBA的变量,何时不需要?更具体地说,...是否有特定的变量用法(公共变量或函数定义的变量?)在内存中的保存时间比subs更长,因此如果我不自己清理,可能会造成麻烦?
查看完整描述

3 回答

?
潇潇雨雨

TA贡献1833条经验 获得超4个赞

VB6 / VBA使用确定性方法存储对象。每个对象存储对其自身的引用数量。当数字达到零时,对象将被销毁。

当对象变量Nothing超出范围时,保证将其清除(设置为),这将减少其各自对象中的引用计数器。无需手动操作。

当您需要显式清理时,只有两种情况:

  1. 当您要在对象的变量超出范围之前对其进行销毁时(例如,您的过程将花费很长时间执行,并且该对象拥有资源,因此您希望尽快销毁该对象以释放对象)资源)。

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

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

您显示的代码段是错误的。无需手动清理。进行手动清理甚至有害,因为这会使您对更正确的代码有错误的认识。

如果在类级别具有变量,则在销毁类实例时将清除/销毁该变量。您可以根据需要提前销毁它(请参阅第项1.)。

如果在模块级别具有变量,则在程序退出时(或在VBA情况下,当VBA项目重置时)将清除/销毁该变量。您可以根据需要提前销毁它(请参阅第项1.)。

变量的访问级别(公共或私有)不会影响其生存时间。


查看完整回答
反对 回复 2019-12-04
?
繁星点点滴滴

TA贡献1803条经验 获得超3个赞

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


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


严格来说,在现代Excel版本(2010+)中,没有必要将“无”设置为“空”,但是较早版本的Excel存在一些问题(为此必须明确设置解决方法)


查看完整回答
反对 回复 2019-12-04
?
慕雪6442864

TA贡献1812条经验 获得超5个赞

我至少有一种情况不会自动清除数据,最终将导致“内存不足”错误。在用户窗体中,我有:


Public mainPicture As StdPicture

...

mainPicture = LoadPicture(PAGE_FILE)

销毁UserForm后(Unload Me),mainPicture未取消分配为中加载的数据分配的内存。我必须添加一个明确的


mainPicture = Nothing

在终止事件中。


查看完整回答
反对 回复 2019-12-04
  • 3 回答
  • 0 关注
  • 1657 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信