2009-11-21 6 views
5

가비지 수집을 VBA/Excel 2000에서 강제로 수행 할 수 있습니까?강제로 가비지 수집

이 질문은 Excel의 매크로 언어를 나타냅니다. Excel을 조작하는 데 VB .NET을 사용하지 않습니다. 따라서 GC.collect()가 작동하지 않습니다.

답변

11

스트레이트 VBA를 사용할 때 .NET Framework에서 제공하는 가비지 수집을 이용할 수 없습니다. Perhaps this article by Eric Lippert

+1

VBA가 참조 횟수를 사용하고 순환 참조 정리를 지원하지 않는다는 것을 알지 못했습니다. 그것은 밑받침 문제 일 수 있습니다. 원래 클래스 문제를 해결하고 클래스 소멸자에서 참조를 해제 할 때 통합 문서가 제대로 닫히지 않는 경우가있었습니다. 나는 그 물체가 아직 수집되지 않았기 때문에 문제가 발생했다고 생각했다. 거의 틀림없이 나는 순환 참조를 몇 번 놀게되는 wheyer가있다. 팁 고마워. – Zen

+0

동의합니다. VBA에서 직접 할 수는 없습니다. 그러나 COM 라이브러리를 참조 할 경우 실제로 .NET의 GC를 활용할 수 있습니다. [** 내 대답 **] (http://stackoverflow.com/questions/20398477/how-to-set-application-name-in-adodb-connection-string/20406284#20406284)을 참조하십시오. 특히 VBA에서 호출 된'.Dispose()'메소드. –

3

VBA/Excel에는 이전 VB와 같은 가비지 수집이 없습니다. GC 대신에 참조 카운팅을 사용합니다. 포인터를 아무 것도 설정하지 않으면 (또는 변수가 범위를 벗어날 때) 메모리가 해제됩니다. 오래된 VB 에서처럼 순환 참조가 결코 해제되지 않는다는 것을 의미합니다.

+0

알려진 문제의 예 : https://support.microsoft.com/en-us/help/280454/password-prompt-for-vba-project-appears-after-excel-quits –

3

VBA에서 GC를 강제로 실행할 수는 없지만 전역 변수 없음으로 설정하는 것이 좋습니다.

kd7에서 언급 한 기사에서는 범위를 벗어나기 전에 로컬 변수를 Nothing으로 설정하는 것은 쓸모가 없지만 전역 변수에 대해서는 언급하지 않았습니다.

VBA에서 모듈에 정의 된 전역 변수는 전체 Excel 세션을 통해, 즉 변수를 정의하는 VBA 모듈을 포함하는 문서가 닫힐 때까지 유지됩니다.

O가 로컬 인 경우 Set O = Nothing을 사용하지 마십시오.하지만 글로벌 인 경우 사용하지 마십시오.