VBA-Programmierung mit Klassen

Eine erste Klasse erstellen: Klassen initialisieren und terminieren

∅ 4 / 1 Bewertungen

Klassen initialisieren und terminieren

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.

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.

Um den kompletten Aufruf aller Möglichkeiten dieser Klasse zu sehen, schreiben Sie in einem normalen Modul den folgenden Code:

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

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".

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.

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

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.

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

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.