2013-08-22 48 views
1

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

+1

[是否需要在VBA函数中将对象设置为Nothing](http://stackoverflow.com/questions/517006/is-there-a-need-to-set-objects-to-nothing -inside-vba-functions) –

+0

另请参见此处:http://stackoverflow.com/questions/4106153/vba-garbage-collector-details –

+0

另请参阅http://stackoverflow.com/a/11396211/78522 –

回答

4

之后在您的过程范围内声明的变量被正确销毁。

因此,在您的示例中,因为myRangeMain的范围内定义,所以它会被适当销毁/清理。

但是,如果您有这个代码的模块:

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,全局仍具有价值。除非您手动执行此操作,关闭Excel或在代码的某处使用End,否则不会清除此全局。

所以,如果你大量使用全局变量,并没有以某种方式清理它们,你将无限期地保存它们。顺便说一下,这是用户表单的情况,并且也使用UserForm.hideUnload Me


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

1

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

1

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

如果你正在做大量的对象变量创建的重复,没有留下它们所创建的范围,它是当你与他们进行处置他们(..=Nothing)的非常好主意。

相关问题