在 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 会自动处理这个问题?
在您的过程范围内声明的变量随后会被正确销毁。
所以在你的例子中,因为在它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
。
相关问题并没有真正解决我所描述的问题,而且可能会令人困惑。特别是在尝试“重置”用户窗体时。
即使您不这样做,变量超出范围的事实也会收集任何未引用的对象垃圾。
如果您同时处理大量对象变量,例如“范围”,或者在处理旧对象之前重新创建它们的循环中,Excel 会遇到问题。垃圾收集发生在 Excel 认为应该发生的时候;变量超出范围后的某个不确定时间。
如果您正在重复创建对象变量,而不离开创建它们的范围,那么当您完成它们时将它们处理掉( )是一个非常好的主意。..=Nothing