在VBA Excel中,
我听说在模块末尾用Nothing
声明变量,这些变量没有用处,以节省内存。
示例:
Dim myRange As Range
Sub Main
set myRange = Sheets("Sheet1").range("A1:H20")
' Do Something
' ...
set myRange = Nothing
End Sub
此声明是否有任何道理,或者VBA Excel是否自动处理此问题?
答案 0 :(得分:4)
在您的程序范围内声明的变量随后会被正确销毁。
因此,在您的示例中,因为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
之后不会自动清除全局(正如应该预料的那样)。
您可能 期望的是,如果您在运行callAfterRunningMain
方法后运行main
,则您的全局仍然有值。除非您手动执行此操作,关闭Excel或在代码中的某处使用End
,否则不会清除此全局。
因此,如果你大量使用全局变量并且没有以某种方式清理它们,那么你将无限期地将它们保存在内存中。对于用户表单,情况就是如此,顺便使用UserForm.hide
vs Unload Me
。
相关问题并没有真正解决我所描述的问题,而且可能会让人感到困惑。特别是在尝试“重置”UserForms时。
答案 1 :(得分:1)
即使你不这样做,变量超出范围的事实也会收集任何未引用的对象垃圾。
答案 2 :(得分:1)
如果您正在处理大量的对象变量,例如“Range”,或者在处理旧对象之前重新创建它们的循环中,Excel将会遇到问题。 Excel认为应该发生垃圾收集;变量超出范围后的某些不确定时间。
如果您正在进行大量重复的对象变量创建,而没有离开创建对象变量的范围,那么在处理它们(..=Nothing
)时,这是一个非常好主意你完成了它们。