1

在 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 会自动处理这个问题?

4

3 回答 3

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.hidevs就是这种情况Unload Me


相关问题并没有真正解决我所描述的问题,而且可能会令人困惑。特别是在尝试“重置”用户窗体时。

于 2013-08-22T13:57:41.203 回答
1

即使您不这样做,变量超出范围的事实也会收集任何未引用的对象垃圾。

于 2013-08-22T13:52:59.217 回答
1

如果您同时处理大量对象变量,例如“范围”,或者在处理旧对象之前重新创建它们的循环中,Excel 会遇到问题。垃圾收集发生在 Excel 认为应该发生的时候;变量超出范围后的某个不确定时间。

如果您正在重复创建对象变量,而不离开创建它们的范围,那么当您完成它们时将它们处理掉( )是一个非常好的主意。..=Nothing

于 2013-08-22T13:58:09.353 回答