2014-01-27 3 views
5

응용 프로그램의 모든 구성원이 액세스 할 수있는 Excel-VBA 데이터 개체 (사전, 목록 등)를 만드는 가장 좋은 방법은 무엇입니까? 별도의 모듈 또는 클래스 모듈로 선언해야합니까?Excel-VBA에서 공용 개체를 만드는 가장 좋은 방법은 무엇입니까?

예를 들어 다른 서브 루틴이 사용자 입력을 검사할지 (포함하고 있지 않은지) 검사 할 사전 객체를 만들고 싶습니다. 이 사전 객체가 자체 모듈, 클래스 모듈 또는 모듈을 사용하는 서브 루틴을 포함하는 모듈의 일부 여야합니까?

참고 :이 질문은 (모듈의 상단에 PublicmyList 객체를 선언) Checking if a value is a member of a list

+2

'Dictionary' 객체 자체는 Dictionary 클래스의 인스턴스입니다. 따라서 인스턴스를 'public' 변수로 만들면 전체 VBA 프로젝트에서 액세스 할 수 있습니다. 'Dictionary' (* 또는 Collection *) 클래스를 오버라이드 (override)하는 클래스를 만드는 것은 중요하지 않습니다. 왜냐하면 표준 클래스에있는 메소드와 함수가 당신의 요구 사항을 충족시키기에 충분하기 때문입니다. 'Dim'을'Public'으로 바꾸고 선언문을 아무 절차 나 사용하지 말라. –

답변

7
당신은 건설를 사용할 수 있습니다

의 확장 :

Public myList As Object 

Sub Main() 

    Call InitializeList 

    'Do something with your Dictionary object 

End Sub 

Sub InitializeList() 
    If Not myList Is Nothing Then Exit Sub 

    Set myList = CreateObject("Scripting.Dictionary") 

    myList.Add "item1", 1 
    myList.Add "item2", 2 
    myList.Add "item3", 3 
End Sub 
3

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 
관련 문제