2014-01-27 8 views
5

Was ist die beste Vorgehensweise zum Erstellen eines Datenobjekts Excel-VBA (Wörterbuch, Liste usw.), auf das alle Mitglieder der Anwendung zugreifen können? Soll es als separates Modul oder als Klassenmodul deklariert werden?Best Practice zum Erstellen eines öffentlichen Objekts in Excel-VBA?

Zum Beispiel möchte ich ein Wörterbuch-Objekt erstellen, die verschiedene Unterprogramme eine Benutzereingabe gegen überprüfen möchten (wenn es enthält oder nicht). Sollte dieses Wörterbuchobjekt sein eigenes Modul, Klassenmodul oder Teil des Moduls sein, das die Subroutinen enthält, die es benutzen?

Hinweis: Diese Frage ist eine Erweiterung von Checking if a value is a member of a list

+2

Das 'Dictionary'-Objekt selbst ist eine Instanz der Dictionary-Klasse. Daher machen Sie diese Instanz zu einer öffentlichen Variable, auf die Sie in Ihrem gesamten VBA-Projekt zugreifen können. Es macht keinen Sinn, eine Klasse zu erstellen, die die Klasse "Dictionary" (* oder Collection *) außer Kraft setzt, weil die Methoden und Funktionen der Standardklasse für Ihre Anforderung ausreichen. Ersetzen Sie "Dim" durch "Public" und halten Sie die Deklaration außerhalb von Prozeduren fest –

Antwort

7

Sie Konstruktion folgende verwenden können (deklarieren Ihre myList Objekt als Public in der Spitze des Moduls):

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 können Menschen frustrierend sein die an nette OOP-freundliche Sprachen wie Java und C# gewöhnt sind. Wir müssen die Einschränkungen von VBA akzeptieren und einfach das Beste daraus machen, was es bietet.

Was Sie beschreiben, klingt fast wie etwas, das Sie in anderen Sprachen als Singleton deklarieren würden.

Meine Lösung wäre, ein "Main" -Modul (nicht Class-Modul) zu erstellen. Erstellen Sie dort ein privates Wörterbuch und erstellen Sie eine Public Accessor-Funktion. Dadurch können Ihre anderen Methoden - er - Funktionen/Subs blind darauf zugreifen.

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 

BTW, das "Cleanup" -Unterprogramm ist nur gute Praxis. Am Ende Ihres Makros sollten Sie die Subroutine "Cleanup" aufrufen, um Speicher freizugeben, den Excel für alle von Ihnen erstellten Objekte zugewiesen hat. Für Klassenmodule können Sie Ihren Bereinigungscode in

Public Sub Class_Terminate() 

setzen und es wird automatisch aufgerufen.

Hinweis - der vorherige Code würde erfordern, dass Sie die "Microsoft Scripting Runtime" als Referenz hinzufügen. Dadurch erhalten Sie hilfreiche Tipptipps, wenn Sie während des Codierens mit dem Wörterbuch arbeiten. Wenn Sie das aus irgendeinem Grund nicht möchten, verwenden Sie diesen Code:

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 
Verwandte Themen