programing

Excel VBA 변수를 중지하거나 아무것도 설정하지 않는 경우

oldcodes 2023. 4. 19. 23:27
반응형

Excel VBA 변수를 중지하거나 아무것도 설정하지 않는 경우

지난 2년간 Excel VBA를 독학해 왔습니다.코드 세그먼트의 마지막에 변수를 삭제하는 것이 적절할 수 있습니다.예를 들어, Excel을 HTML로 전송하기 위한 Ron de Bruin의 코드에서 이 비트로 수정한 것을 본 적이 있습니다.

Function SaveContentToHTML (Rng as Range)

        Dim FileForHTMLStorage As Object
        Dim TextStreamOfHTML As Object
        Dim TemporaryFileLocation As String
        Dim TemporaryWorkbook As Workbook

...

        TemporaryWorkbook.Close savechanges:=False
        Kill TemporaryFileLocation
        Set TextStreamOfHTML = Nothing
        Set FileForHTMLStorage = Nothing
        Set TemporaryWorkbook = Nothing

End Function

저는 이것에 대해 몇 가지 검색을 해봤지만, 그것을 하는 방법 외에는 거의 찾을 수 없었습니다.그리고 한 포럼에서는 로컬 변수가 존재하지 않기 때문에 삭제할 필요가 없다는 성명을 게시했습니다.End Sub 볼 때, 이 는, 「 」 「 」 「 」 「 」 「 」 「 」 에서는 이 아닐 가능성이 End Function또는 제가 경험하지 못한 다른 상황에서요.

그래서 제 질문은 이렇게 요약됩니다.

  • 변수 청소의 시기와 이유를 설명하는 웹 사이트가 있습니까? 하지만 아직 찾지 못했습니다.

여기 계신 분이 설명해주실 수 없으시다면...

  • Excel VBA 변수 청소가 필요한 시기와 필요하지 않은 시점은 언제입니까?
  • 그리고 좀 더 구체적으로...특정 변수 용도(공용 변수)가 있습니까?함수 정의 변수?) 서브보다 오랫동안 메모리에 로드되어 있기 때문에 스스로 정리하지 않으면 문제가 발생할 수 있습니다.

VB6/VBA는 결정론적 접근방식을 사용하여 객체를 파괴합니다.각 개체는 자신에 대한 참조 수를 저장합니다.숫자가 0이 되면 오브젝트는 파기됩니다.

됩니다( 「 」로 됩니다).Nothing의 범위를 각의 범위를 벗어나면 각 오브젝트의 참조 카운터가 감소합니다.수동 작업이 필요하지 않습니다.

명시적인 청소가 필요한 경우는 다음 두 가지뿐입니다.

  1. 변수가 범위를 벗어나기 전에 오브젝트를 파기할 경우(예를 들어 프로시저가 실행되는 데 시간이 오래 걸리고 오브젝트가 리소스를 보유하고 있기 때문에 가능한 한 빨리 오브젝트를 파기하고 리소스를 해방해야 합니다).

  2. 둘 이상의 객체 간에 순환 참조가 있는 경우.

    ifobjectA합니다.objectB , , , , 입니다.objectB합니다.objectA2」를 한, .objectA.ReferenceToB = Nothing ★★★★★★★★★★★★★★★★★」objectB.ReferenceToA = Nothing.

표시된 코드 조각이 잘못되었습니다.수동 청소는 필요하지 않습니다.정확한 코드를 잘못 인식하게 되므로 수동 청소도 해롭습니다.

클래스 수준에 변수가 있는 경우 클래스 인스턴스가 삭제될 때 변수가 정리/파괴됩니다.필요에 따라 조기에 파기할 수 있습니다(항목 참조).1.).

모듈 레벨에 변수가 있는 경우 프로그램이 종료될 때(또는 VBA의 경우 VBA 프로젝트가 리셋될 때) 변수가 청소/파괴됩니다.필요에 따라 조기에 파기할 수 있습니다(항목 참조).1.).

변수의 액세스 수준(공개 또는 비공개)은 변수의 수명에 영향을 주지 않습니다.

VBA는 참조 카운트에 의해 구현되는 가비지 컬렉터를 사용합니다.

특정 개체에 대한 참조가 여러 개 있을 수 있습니다(예:Dim aw = ActiveWorkbook액티브 워크북에 대한 새 참조를 만듭니다).따라서 가비지 컬렉터는 다른 참조가 없는 것이 분명한 경우에만 오브젝트를 청소합니다.[Nothing](아무것도 없음)으로 설정하는 것은 참조 카운트를 줄이는 명시적인 방법입니다.카운트는 스코프를 종료하면 암묵적으로 감소합니다.

엄밀히 말하면, 현대의 Excel 버전(2010+)에서는 아무것도 필요 없습니다만, 이전 버전의 Excel에서는 문제가 발생했습니다(회피책은 명시적으로 설정되어야 합니다).

적어도 1개의 경우 데이터가 자동으로 정리되지 않아 결과적으로 "메모리 부족" 오류가 발생합니다.User Form에서 얻은 내용:

Public mainPicture As StdPicture
...
mainPicture = LoadPicture(PAGE_FILE)

UserForm이 파기되었을 때(이후)Unload Me)에 로드된 데이터에 할당된 메모리mainPicture디커버리가 되지 않았습니다.나는 명시적인 설명을 덧붙여야만 했다.

mainPicture = Nothing

종료 이벤트에서.

언급URL : https://stackoverflow.com/questions/19038350/when-should-an-excel-vba-variable-be-killed-or-set-to-nothing

반응형