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

Klassen [2] - Eigenschaften in Klassen

Autor: Peter Haserodt - Erstellt: --      - Letzte Revision: --Gruppenthema: 8 Folgen 1 2 3 4 5 6 7 8 Sie sind in Folge:3
Eigenschaften in Klassen.
Bringen wir ein bisserl Leben hinein

Als ich mich Anfangs mit Klassen beschäftigte, war es für mich am Schwierigsten, die Terminologie zu verstehen.
Ich hoffe, ich kann Ihnen dies erleichtern.

Es ist recht einfach zu verstehen, dass man einem CommandButton die Caption "Hallo" per Code geben kann oder die Caption auslesen kann.
Entweder : CommandButton1.Caption = "Hallo"
Oder : MsgBox CommandButton1.Caption

VBA stellt mir für das Steuerelement CommandButton dies zur Verfügung (und andere Eigenschaften)
Hinter diesem steck nichts anderes als eine Klasse, die dies für CommandButtons regelt.

Ich kann es aber einfach verstehen, weil der CommandButton visualisiert ist. Ich kann es sehen!

Bei unseren eigenen Klassen ist das etwas anders, weil ich die Eigenschaften selbst definiere und dies nicht optisch verfolgen kann.

Und wieder lernen wir am Besten an einem Beispiel.
Erstellen Sie ein Klassenmodul mit dem Namen clsPerson und eine Userform mit 4 Commandbuttons.
Erstellen Sie dann nachfolgenden Code.

Ich empfehle Ihnen, erst das Klassenmodul mit dem Code zu erstellen und dann die Userform.
Fügen Sie dort zuerst den Code ohne die Initialize ein und schreiben Sie den Code dann für die Initialize selber.
Damit können Sie die Intellisense in Arbeit sehen.



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

Option Explicit
Dim oPerson1 As clsPerson
Dim oPerson2 As clsPerson
	
Private Sub CommandButton1_Click()
	MsgBox "Der Name = " & oPerson1.Person & " Jahre: " & oPerson1.Jahre
End Sub
	
Private Sub CommandButton2_Click()
	MsgBox "Der Name = " & oPerson2.Person & " Jahre: " & oPerson2.Jahre
End Sub
	
Private Sub CommandButton3_Click()
	oPerson1.Jahre = 45
End Sub
	
Private Sub CommandButton4_Click()
	oPerson2.Person = "Wilhelm"
End Sub
	
Private Sub UserForm_Initialize()
	Set oPerson1 = New clsPerson
	Set oPerson2 = New clsPerson
	oPerson1.Person = "Max"
	oPerson1.Jahre = 30
	oPerson2.Person = "Moritz"
	oPerson2.Jahre = 33
End Sub
	
Private Sub UserForm_Terminate()
	Set oPerson1 = Nothing
	Set oPerson2 = Nothing
End Sub


' **************************************************************
'  Modul:  clsPerson  Typ = Klassenmodul
' **************************************************************

Option Explicit
Dim mPerson As String
Dim mJahre As Integer
' ******* Let Get Paar
	
Public Property Let Person(ByVal DiePerson As String)
	mPerson = DiePerson
End Property
	
Public Property Get Person() As String
	Person = mPerson
End Property
'******* Ende Let Get Paar
' ******* Let Get Paar
	
Public Property Let Jahre(ByVal DasJahr As Integer)
	mJahre = DasJahr
End Property
	
Public Property Get Jahre() As Integer
	Jahre = mJahre
End Property
'******* Ende Let Get Paar

Starten Sie nun die UF und klicken Sie erst CommandButton1 und 2 an dann 3 und 4 und danach wieder 1 und 2
Nur um mal ein wenig zu sehen.

Kommen wir zur Erklärung - nehmen Sie sich etwas Zeit

Oben hatten wir das Beispiel mit der CommandButton.Caption.
Diese wird uns von VBA respektive dem Steuerelement CommandButton zur Verfügung gestellt.

In Klassen sind wir selbst dafür verantwortlich.
Und unsere Eigenschaften in Klassen sind nichts anderes als Variablen die in der Klasse definiert sind!


Dies ist das absolut Wichtigste zu verstehen.


Variablen sind bekannt, aber unsere Variablen in Klassen, die wir Klassenweit definieren sind etwas anders.
Sie werden zu Eigenschaften der Klasse und wie wir diese benennen ist uns überlassen.
(Das kleine m vor den Variablen ist einfach eine Vereinbarung für Klassenvariablen, muss nicht sein)


Kommen wir zu den Properties:
Das sind nichts anderes als Sub oder Function mit einem anderen Namen!


Eine Property Let ist eine Prozedur (Sub) die eine Eigenschaft (eine Variable der Klasse) mit einem Wert belegt.
Eine Property Get ist eine Methode (Function) die eine Eigenschaft (eine Variable der Klasse) ausliest.

In der Regel tauchen diese Paarweise auf, aber nicht notwendig.

Kommen wir zurück auf unser Caption Beispiel:
Ich kann dort die Caption setzen : Dies entspricht der Property Let
Ich kann die Caption auslesen: Dies entspricht der Property Get
Hinweis:

Man kann auch mit Sub und Function hier arbeiten, intern wird dies aber von VBA wieder in Properties aufgelöst.
(Übrigens Property heißt nichts anderes als Eigenschaft)


Um Eigenschaften (Klassenvariablen) zu setzen oder rückzulesen werden ganz einfach die Property - Routinen benutzt.
Basta - Schluß
(Es gibt auch noch Property Set - aber das ist eine andere Geschichte)



Und wie lange bleiben diese erhalten ?

Nun, solange unsere Instanz dieser Klasse existiert.
Wenn Sie eine Textbox haben bleibt z.B. die Text Eigenschaft solange abrufbar, belegbar, solange die UserForm existiert.
Nach einem Unload der Userform "isses wech" sm3 (1K)
Genauso ist es bei Instanzen von Klassen, wenn wir die Objektvariable z.B. entsetten.

Interner Tipp:
Eine Excel Schulung von einem Profi ist Gold wert!
Peter Haserodt bietet Ihnen das und noch viel mehr...
Mehr dazu unter: Schulung

Laufzeit versus Entwicklungszeit

Die Eigenschaften von Steuerelementen auf einer UserForm können wir weitgehend sowohl zur Entwurfszeit als auch zur Entwicklungszeit beeinflussen.

Dies bedeutet, dass wir die Caption eines CommandButtons in der Entwicklungsumgebung setzen können (also der Default) aber auch zur Laufzeit diesen ändern können (mit einem Befehl)

Dies kann ich auch in Klassen erreichen.

Nehmen wir an, wir wollen prinzipiell in unserer Klasse clsPerson für die Person "Unbekannt" und als Jahre 999 haben.
(Wenn diese Eigenschaften nicht besetzt werden)

Hier wird unser Constructor aktiv.

Ändern Sie die Codes der beiden Module auf folgendes ab:



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

Option Explicit
Dim oPerson1 As clsPerson
Dim oPerson2 As clsPerson
	
Private Sub CommandButton1_Click()
	MsgBox "Der Name = " & oPerson1.Person & " Jahre: " & oPerson1.Jahre
End Sub
	
Private Sub CommandButton2_Click()
	MsgBox "Der Name = " & oPerson2.Person & " Jahre: " & oPerson2.Jahre
End Sub
	
Private Sub CommandButton3_Click()
	oPerson1.Jahre = 45
End Sub
	
Private Sub CommandButton4_Click()
	oPerson2.Person = "Wilhelm"
End Sub
	
Private Sub UserForm_Initialize()
	Set oPerson1 = New clsPerson
	Set oPerson2 = New clsPerson
	' Jetzt mal ohne Besetzung der Eigenschaften
End Sub
	
Private Sub UserForm_Terminate()
	Set oPerson1 = Nothing
	Set oPerson2 = Nothing
End Sub


' **************************************************************
'  Modul:  clsPerson  Typ = Klassenmodul
' **************************************************************

Option Explicit
Dim mPerson As String
Dim mJahre As Integer
	
Private Sub Class_Initialize()
	' Constructor für Default
	mPerson = "Unbekannt"
	mJahre = 999
End Sub
' ******* Let Get Paar
	
Public Property Let Person(ByVal DiePerson As String)
	mPerson = DiePerson
End Property
	
Public Property Get Person() As String
	Person = mPerson
End Property
'******* Ende Let Get Paar
' ******* Let Get Paar
	
Public Property Let Jahre(ByVal DasJahr As Integer)
	mJahre = DasJahr
End Property
	
Public Property Get Jahre() As Integer
	Jahre = mJahre
End Property
'******* Ende Let Get Paar

Mal sehen, ob Sie die Unterschiede sofort erkennen.

Klicken Sie sich einfach wieder durch die CommandButtons.

Und damit soll dann Schluß für diesen Teil sein.

Subs, Functions ... (Klassen [3])

Weitere Artikel der Gruppe: Klassen Aus Excel VBA
Nach oben