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.hideUnload Me的情况。


相关的问题并没有真正解决我所描述的问题,而且可能相当混乱。 特别是当试图“重置”UserForms。

即使你不这样做,variables超出范围的事实将收集任何未引用的对象垃圾回收。

如果您正在处理大量的对象variables(如“Range”),或者在处理旧对象之前重新创build它们,那么Excel将会遇到问题。 垃圾收集发生在Excel认为应该的时候; variables超出范围之后的一些不确定的时间。

如果你正在做很多重复的对象variables创build,而没有离开创build对象variables的范围,那么当你完成它们时,处理它们( ..=Nothing )是一个非常好的主意。