之后在您的过程范围内声明的变量被正确销毁。
因此,在您的示例中,因为myRange
在Main
的范围内定义,所以它会被适当销毁/清理。
但是,如果您有这个代码的模块:
Public testForStackOverflow As Range
Sub main()
Call mySubSub
MsgBox testForStackOverflow.Address
Call mySubDestroyer
If (testForStackOverflow Is Nothing) Then
MsgBox "destroyed"
End If
Call mySubSub
End Sub
Sub mySubSub()
Set testForStackOverflow = Range("A1")
End Sub
Sub mySubDestroyer()
Set testForStackOverflow = Nothing
End Sub
Sub callAfterRunningMain()
MsgBox testForStackOverflow.Address
End Sub
全球不会自动mySubSub
后清理(如应预期)。
你可能不期望是什么,如果你运行main
方法之后运行callAfterRunningMain
,全局仍具有价值。除非您手动执行此操作,关闭Excel或在代码的某处使用End
,否则不会清除此全局。
所以,如果你大量使用全局变量,并没有以某种方式清理它们,你将无限期地保存它们。顺便说一下,这是用户表单的情况,并且也使用UserForm.hide
和Unload Me
。
相关的问题并没有真正解决我所描述的问题,它可能相当混乱。特别是当试图“重置”UserForms。
[是否需要在VBA函数中将对象设置为Nothing](http://stackoverflow.com/questions/517006/is-there-a-need-to-set-objects-to-nothing -inside-vba-functions) –
另请参见此处:http://stackoverflow.com/questions/4106153/vba-garbage-collector-details –
另请参阅http://stackoverflow.com/a/11396211/78522 –