VBA Excel:本地变量存储在内存中?

时间:2013-08-22 13:47:09

标签: excel vba

在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是否自动处理此问题?

3 个答案:

答案 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)时,这是一个非常好主意你完成了它们。