VBA-Programmierung mit Klassen
Eine erste Klasse erstellen: Klassen initialisieren und terminieren
Klassen initialisieren und terminieren
Auf dieser Seite
Mit Bild
Da sich diese Beispielklasse ausnahmsweise beim Erzeugen in Class_Initialize und Zerstören in Class_Terminate per MsgBox meldet, sehen Sie, dass mehr passiert, als Ihr selbstgeschriebener Code vermuten lässt. Mit dem Schlüsselwort New wird die Klasse erzeugt und also Class_Initialize ausgeführt. Wenn es aber darin nichts zu tun gibt, können Sie diese Prozedur ebenso gut weglassen wie Class_Terminate.
Mit Bild
Da Sie oben ja eine lokale Variable Test angelegt haben, muss diese vor End Sub zerstört werden. Dabei wird zwangsläufig Class_Terminate ausgeführt, wie Sie an der Meldung sehen. All diese in der Mini-Version eher beliebigen Aktionen können Sie selbstverständlich auch gezielter einsetzen.
Mit Bild
Um den kompletten Aufruf aller Möglichkeiten dieser Klasse zu sehen, schreiben Sie in einem normalen Modul den folgenden Code:
Mit Bild
Sub AufrufEinerKlasseKomplett() Dim Test As Klasse1 Set Test = New Klasse1 MsgBox "Ich habe '" & Test.MeinName() & "' aufgerufen.", _ vbInformation, "Aufruf der Klasse" Test.SagHallo Set Test = Nothing End Sub
Mit Bild
New schon bei der Deklaration?
Wie Sie sehen, kann New nicht nur bei der Deklaration, sondern auch noch später aufgerufen werden. Ohne New können Sie nicht auf die Inhalte der Klasse zugreifen, denn dann existiert ja noch nicht der "Stempelabdruck".
Mit Bild
Sie sollten unbedingt immer diese zweite Variante wählen, also New explizit später nach der Deklaration aufrufen. Beim Testen der folgenden Prozedur NewFalsch sehen Sie, welches Problem auftritt, wenn die Klasse wie im ersten Beispiel sofort mit New deklariert wurde.
Mit Bild
Sub NewFalsch() Dim Test As New Klasse1 If Test Is Nothing Then MsgBox "Test existiert noch nicht." Else MsgBox "Test existiert schon!" End If End Sub
Mit Bild
Obwohl die Klasse Test in NewFalsch noch nie zugewiesen wurde, holt VBA das intern automatisch nach, wenn der erste Zugriff darauf erfolgt. Der findet aber leider schon bei der Prüfung auf deren Existenz mit Is Nothing statt, die also zum falschen Ergebnis kommt, dass die Klasse bereits geöffnet sei.
Mit Bild
Sub NewRichtig() Dim Test As Klasse1 If Test Is Nothing Then MsgBox "Test existiert noch nicht." Else MsgBox "Test existiert schon!" End If Set Test = New Klasse1 If Test Is Nothing Then MsgBox "Test existiert noch nicht." Else MsgBox "Test existiert schon!" End If End Sub
Mit Bild
Bei NewRichtig kommt die Prüfung zum richtigen Ergebnis, denn die Existenz-Meldung kommt erst nach der geplanten Zuweisung mit Set.
Auch das Zerstören der Klasse und damit die Prozedur Class_Terminate können Sie bewusst aufrufen, indem Sie der Variablen den Wert Nothing zuweisen. Das hat aber nicht so gravierende Folgen wie ein New. Sie können es im Grunde auch weglassen, weil mit dem End Sub die lokale Variable Test ja sowieso zerstört wird. Dabei wird dann spätestens das Class_Terminate ausgelöst.