VBA Excel:局部variables存储在内存中?
在VBA Excel中,
我已经听说,将模块末尾的Nothing
声明为没有进一步使用的variables可以节省内存。
例:
Dim myRange As Range Sub Main set myRange = Sheets("Sheet1").range("A1:H20") ' Do Something ' ... set myRange = Nothing End Sub
这个陈述是否有任何事实或VBA Excel自动处理这个问题?
在你的程序范围内声明的variables在之后被正确销毁。
所以在你的例子中,因为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
,你的全局仍然有一个值。 除非您手动执行此操作,closuresExcel或在代码的某处使用End
,否则不会清除此全局。
所以,如果你大量使用全局variables,并没有以某种方式清理它们,你将无限期地保存它们。 顺便说一下,这是UserForm.hide
和使用UserForm.hide
与Unload Me
的情况。
相关的问题并没有真正解决我所描述的问题,而且可能相当混乱。 特别是当试图“重置”UserForms。
即使你不这样做,variables超出范围的事实将收集任何未引用的对象垃圾回收。
如果您正在处理大量的对象variables(如“Range”),或者在处理旧对象之前重新创build它们,那么Excel将会遇到问题。 垃圾收集发生在Excel认为应该的时候; variables超出范围之后的一些不确定的时间。
如果你正在做很多重复的对象variables创build,而没有离开创build对象variables的范围,那么当你完成它们时,处理它们( ..=Nothing
)是一个非常好的主意。