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
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 –