2013-09-26 74 views
20

我在过去两年中一直在教自己的Excel VBA,并且我有这样的想法,即在代码段末尾处理变量有时是适当的。举例来说,我已经看到了它在该位改编自Ron de Bruin's code for transferring Excel to HTML完成:什么时候应该将Excel VBA变量杀死或设置为Nothing?

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 

我已经做了这方面的一些搜索和发现以后如何做到这一点非常少,而在一个论坛上发帖a statement that no local variables need to be cleared,因为它们不再存在于End Sub。我猜根据上面的代码,在End Function或其他我没遇到过的情况下可能不是这样。

所以我的问题归结为:

  • 有没有什么地方解释的时候,为什么变量清理在网络上,我只是还没有找到它?

如果不是有人可以在这里解释一下......

  • 当是为Excel VBA变量清理必要的,当它是不是?
  • 更具体地说......是否有特定变量的用途(公共变量? 功能定义的变量?)仍然存在加载到内存更长的时间比 潜艇做的,为此可能会引起麻烦,如果我不干净 起来在我自己后?

回答

31

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

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

  1. 当你需要它的变量超出范围之前被销毁的对象(例如,你的程序是要多久的时间:

    当你想要一个明确的清理有只有两种情况执行,并且该对象拥有一个资源,因此您想尽快销毁该对象以释放该资源)。

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

    如果objectA存储引用objectB,并objectB商店objectA参考,这两个对象将永远不会销毁,除非你刹车链条式设置objectA.ReferenceToB = NothingobjectB.ReferenceToA = Nothing

你显示的代码片段是错误的。不需要手动清理。做手动清理甚至是有害的,因为它给你一个false sense of more correct code

如果您在类级别有一个变量,那么当类实例被破坏时它将被清除/销毁。如果您愿意,可以提前销毁它(请参阅项目1.)。

如果在模块级别有一个变量,当程序退出时(或者在VBA的情况下,VBA项目被重置时)它将被清除/销毁。如果您愿意,可以提前销毁它(请参阅项目1.)。

变量(公有与私有)的访问级别不会影响其使用期限。

+1

谢谢GSerg,这个解释清晰简洁,给了我一个更好的变量管理意义。还有一个问题:你说“变量的访问级别不影响它的生命周期”。你知道当一个值首先由活动代码设置(start)并且代码到达'End'标签(完成)时,这个生命周期是否受到限制?或者当项目重置时它结束了吗?我试着通过设置在另一个模块中变暗的公共变量的值来测试这个理论,但变量从未出现在本地窗口中,所以我无法观察它何时下降。 –

+0

@KarlRookey公有vs私有不同于级别与程序级别。公共与私人不会影响生活时间。只要班级生活,班级就意味着变化的生活。只要项目未重置,模块级别就意味着可变寿命。请注意,“生命”和“包含某物”不是synonims。变量可以存在并包含“Nothing”。 – GSerg

3

VBA使用由reference counting实现的垃圾回收器。

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

严格地说,在现代版本的Excel(2010+)设置为Nothing是没有必要的,但也有与旧版本的Excel的问题(其解决方法是明确设置)

相关问题