Autor: Peter Haserodt  --- Aus Excel VBA - Gruppe: Klassen

Klassen [1] - Einstieg

Autor: Peter Haserodt - Erstellt: --      - Letzte Revision: --Gruppenthema: 8 Folgen 1 2 3 4 5 6 7 8 Sie sind in Folge:2
Erstes Hineinschnuppern in Klassen - Langweilig aber notwendig

Erstellen Sie eine Userform und ein Klassenmodul (Letzteres erstellen Sie wie eine Userform nur wählen Sie anstatt Userform Klassenmodl)

Im Projektexplorer haben Sie nun zusätzlich zwei Rubriken: Formulare und Klassenmodule.
Bei Klassenmodule finden Sie nun Klasse1.
Benennen Sie dies um in clsTest.
(Es hat sich eingebürgert, Klassen mit einem cls davor zu benennen)

Auf der Userform erstellen Sie 2 CommandButtons.

Wenn Sie nun in den Code der UserForm gehen, ist Ihnen bekannt, dass Sie links im Dropdown die Steuerelemente auswählen können und wenn Sie in einer Ereignisprozedur eines Steuerelementes sind, dort weitere Ereignisse zur Verfügung stehen.
Alternativ können Sie auch links Allgemein auswählen und dann stehen Ihnen rechts die übrigen Routinen zur Verfügung.
Dies setze ich aber als bekannt voraus.

Gehen Sie nun in das clsTest.
Dort steht im Code noch nichts anderes als Option Explicit (Dies steht doch hoffentlich dort !!!)

Wenn Sie nun in das linke obere Dropdown klicken, sehen Sie dort Class. Wählen Sie dies aus und es wird folgende Routine erzeugt:
	
Private Sub Class_Initialize()
End Sub
Nun können Sie rechts noch eine andere Ereignisprozedur erstellen: Class_Terminate()

Klassen sind erstmal nichts anderes als "unsichtbare" Steuerelemente.

Wie soll man dies verstehen? Ganz einfach.
Es ist für Sie selbstverständlich, das Steuerelemente Eigenschaften, Methoden und Ereignisse zur Verfügung stellen.
Zum Beispiel ein CommandButton hat Click, MouseDown und und und...

Eine Klasse unterscheidet sich davon erstmal wenig.
Sie stellt uns Eigenschaften zur Verfügung (nicht gerade viele) z.B. Name
und 2 Ereignisse: Initialize und Terminate.

Kleiner Hinweis:

Diese beiden werden auch Constructor und Destructor genannt.
Letztendlich bedeutet dies: Die Initialize (Constructor) wird gefeuert, wenn die Klasse entsteht und die Termiate, wenn sie zerstört wird.
Man kennt dies auch in anderen Programmiersprachen, z.B. PHP Klassen haben unter PHP 5 nur einen Construktor und darüber auch einen Destructor.

Wir wollen dies nun näher beleuchten:
Dazu fügen Sie nachfolgenden Code in das Klassenmodul ein:
	
Private Sub Class_Initialize()
	MsgBox "Initialisiere Klasse"
End Sub
	
Private Sub Class_Terminate()
	MsgBox "Zerstöre Klasse"
End Sub

Leben und Sterben einer Klasse

Gehen Sie nun in die Userform und erzeugen Sie folgenden Code:
Option Explicit
Dim oMeineKlasse As clsTest
	
Private Sub UserForm_Terminate()
	Set oMeineKlasse = Nothing
End Sub
Starten Sie nun die UF und schließen Sie diese wieder.
Wider Erwarten ist nichts passiert.


Hauchen wir also dem ersten Commandbutton mal Leben ein:
	
Private Sub CommandButton1_Click()
	Set oMeineKlasse = New clsTest
End Sub
Starten Sie wieder die UF, klicken Sie den Button an und schließen Sie die UF.

Diesmal werden beide MsgBoxen gezeigt!

Betrachten wir dies genauer:
In der Deklaration haben wir erstmal nichts anderes als eine Objektvariable vom Typ unserer Klasse erzeugt.
Dies kann ich damit vergleichen, wenn ich schreibe : Dim oBlatt as Worksheet
Mit letzterem kann ich aber auch noch nichts anfangen, wenn ich dem oBlatt nicht ein Worksheet zuordne.
Im WorkSheet Fall bräuchten wir noch z.B. Set oBlatt = Sheets(1) um einen Verweis auf das Blatt zu erhalten.

Da greifen wir aber auf ein vorhandenes Tabellenblatt zu, welches letztendlich nichts anderes als eine schon existente Instanz der Klasse Worksheet ist.

Bei unseren eigenen Klassen müssen wir eine Instanz erstmal erzeugen und dafür benötige ich in der Set Anweiseung das Schlüsselwort new.

Der grundlegene Ablauf ist wie folgt skizziert:

1. Erstellen einer Objektvariablen vom Typ der Klasse.

(Hier sei bemerkt, dass man auch diese z.B. einfach als Objekt deklarieren kann aber dann steht mir die Intellisense nicht zur Verfügung)


2. Über die Set Anweisung und dem Schlüsselwort new eine Instanz erzeugen.


Es ist hier sehr hilfreich, wenn Sie sich dies als unsichtbares Steuerelment vorstellen.
Es ist ein Objekt, welches nun existiert auch wenn wir es nicht sehen.
Wenn Sie z.B. einen neuen CommandButton auf einer Userform erstellen, wird dabei eine Instanz der Klasse Commandbuttons erzeugt und im Hintergrund laufen dort auch diese Konstrukte ab.

3. Über die Set = Nothing den Verweis wieder freigeben und die Klasse zerstören.


Vergleichbar ist dies in etwa wiederum, als würde ich den CommandButton von der Userform entfernen.
Das Wort zerstören kann hier etwas irritierend sein. Man könnte glauben, man zerstört seine Klasse.
Aber unser Klassenmodul ist natürlich noch da.
(Ich kann ja auch immer wieder einen neuen CommandButton erzeugen)

"Ent-"setten oder nicht?

Wenn man Objektvariablen mit Set belegt, existieren diese solange, bis ich diese wieder mit Set Nothing freigebe ?
Dies muss man mit Jein beantworten.
Sie existieren ohne "entsetten" solange, wie die Umgebung, in welcher Sie deklariert wurden, existiert.

In unserem Beispiel könnten Sie die Anweisung in der UserformTerminate auch weglassen. Testen Sie dies mal.

Über die Jahre habe ich dazu immer wieder verschiedene Meinungen gelesen ob man entsetten soll/muss oder nicht.
Gerade wenn man Variable nur Prozedurweit deklariert.
Ich persönlich versuche immer aufzuräumen, um kontrolliert Objekte wieder freizugeben.
(Dies hat den Vorteil, dass man es in entscheidenden Momenten nicht vergisst)

 Peter Haserodt
  • Formelhilfe
  • Makroentwicklung
  • VBA-Programmierung
  • + + + + + + + + +
Mehrere Instanzen einer Klasse:

Ändern Sie nun den Code in den beiden Modulen wie unten angezeigt ab:


' **************************************************************
'  Modul:  clsTest  Typ = Klassenmodul
' **************************************************************

Option Explicit
Dim mInstanz As String
	
Private Sub Class_Initialize()
	MsgBox "Initialisiere Klasse"
End Sub
	
Public Property Let MeineInstanz(DieInstanz As String)
	mInstanz = DieInstanz
End Property
	
Private Sub Class_Terminate()
	MsgBox "Zerstöre Klasse: " & mInstanz
End Sub


' **************************************************************
'  Modul:  UserForm1  Typ = Userform
' **************************************************************

Option Explicit
Dim oMeineKlasse As clsTest
	
Private Sub CommandButton1_Click()
	Set oMeineKlasse = New clsTest
	oMeineKlasse.MeineInstanz = "Aus command1"
End Sub
	
Private Sub CommandButton2_Click()
	Dim oZweiteInstanz As clsTest
	Set oZweiteInstanz = New clsTest
	oZweiteInstanz.MeineInstanz = "Aus command2"
	MsgBox "Jetzt existiert Sie noch"
	Set oZweiteInstanz = Nothing
End Sub
	
Private Sub UserForm_Terminate()
	Set oMeineKlasse = Nothing
End Sub

Zu Property kommen wir im nächsten Teil (dort wird dann die Erklärung dazu folgen)

Starten Sie nun die UF und betätigen Sie erst CommandButton1, dann CommandButton2 und schließen Sie dann die UF.

Diese Demonstration sollte schon etwas von der Möglichkeit von Klassen zeigen.
Wir erstellen 2 Instanzen basierend auf unserer Klasse (2 unsichtbare Objekte) und sehen sehr schön die Lebensdauer.

Dies soll es für diesen Teil gewesen sein, im nächsten Teil gehen wir dann intensiver auf die Eigenschaften und Methoden von Klassen ein.

Eigenschaften in Klassen (Klassen [2])

Weitere Artikel der Gruppe: Klassen Aus Excel VBA
Nach oben