VBA는 사람들에게 실망하실 수 있습니다 자바와 C#과 같은 멋진 OOP 친화적 인 언어에 익숙하다. 우리는 VBA의 한계를 받아 들여야하며 가능한 한 최선을 다해야합니다.
다른 언어로 싱글 톤으로 선언하는 것과 같은 소리가 거의 들립니다.
내 솔루션은 "기본"모듈 (클래스 모듈 아님)을 만드는 것입니다. 거기에 개인 사전을 만들고 공용 접근 자 함수를 만듭니다. 이렇게하면 다른 방법 - 기능/잠수정을 맹목적으로 액세스 할 수 있습니다.
Private pMyList as Scripting.Dictionary
Public Property Get MyList() as Scripting.Dictionary
If pMyList = Nothing Then
Set pMyList = new Scripting.Dictionary
pMyList("One") = "Red"
pMyList("Two") = "Blue"
pMyList("Three") = "Green"
EndIf
Set MyList = pMyList
End Property
Public Sub Cleanup
Set pMyList = Nothing
' To deallocate arrays, use:
' Erase pArray
End Sub
'--------------------------------
Public Sub SomeRandomSubInAnotherModule()
Dim theList As Scripting.Dictionary
Set theList = MyList ' If not yet initialized, will initialize
' Do whatever you need to do with theList
Set theList = Nothing ' Release the memory
End Sub
그런데 "정리"서브 루틴은 좋은 연습입니다. 매크로가 끝나면 "정리"서브 루틴을 호출하여 Excel에서 사용자가 만든 모든 개체에 할당 된 메모리를 해제해야합니다. 클래스 모듈의 경우 클린업 코드를
Public Sub Class_Terminate()
에 넣으면 자동으로 호출됩니다.
주 - 이전 코드에서는 "Microsoft Scripting Runtime"을 참조해야합니다. 이렇게하면 코딩하는 동안 사전을 사용하여 작업 할 때 유용한 힌트가 제공됩니다. 어떤 이유에서든 이것을하고 싶지 않다면 다음 코드를 사용하십시오 :
Private pMyList as Object
Public Property Get MyList() as Object
If pMyList = Nothing Then
Set pMyList = CreateObject("Scripting.Dictionary")
pMyList("One") = "Red"
pMyList("Two") = "Blue"
pMyList("Three") = "Green"
EndIf
Set MyList = pMyList
End Property
Public Sub Cleanup
Set pMyList = Nothing
End Sub
'Dictionary' 객체 자체는 Dictionary 클래스의 인스턴스입니다. 따라서 인스턴스를 'public' 변수로 만들면 전체 VBA 프로젝트에서 액세스 할 수 있습니다. 'Dictionary' (* 또는 Collection *) 클래스를 오버라이드 (override)하는 클래스를 만드는 것은 중요하지 않습니다. 왜냐하면 표준 클래스에있는 메소드와 함수가 당신의 요구 사항을 충족시키기에 충분하기 때문입니다. 'Dim'을'Public'으로 바꾸고 선언문을 아무 절차 나 사용하지 말라. –