2013-08-22 2 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을 사용하지 않으면 정리되지 않습니다.

전역 변수를 많이 사용하고 어떻게 든 지우지 않은 경우 무기한으로 메모리에 유지합니다. 이것은 userforms의 경우이고 UserForm.hideUnload Me 대 너무 사용합니다.


관련 질문은 실제로 내가 설명하는 것을 다루지 않으며 매우 혼란 스러울 수 있습니다. 특히 사용자 정의 폼을 "재설정"하려고 할 때.

1

그렇게하지 않더라도 변수가 범위를 벗어나면 참조되지 않은 객체 가비지가 수집됩니다.

1

이전 개체를 삭제하기 전에 '범위', 한 번에 또는 루프를 다시 만드는 루프와 같이 많은 수의 개체 변수를 처리하는 경우 Excel에 문제가 있습니다. Excel에서 필요하다고 생각할 때 가비지 수집이 발생합니다. 변수가 범위를 벗어난 후 일정하지 않은 시간.

당신은 그들이 생성되는 범위를 벗어나지 않고, 객체 변수 생성의 반복을 많이 수행하는 경우, 당신이 그들과 함께 할 때 그 (..=Nothing) 처분 할 수있는 매우 좋은 생각입니다.

관련 문제