Klassenobjekte: Unterschied zwischen den Versionen
Pwania (Diskussion | Beiträge) |
Pwania (Diskussion | Beiträge) Keine Bearbeitungszusammenfassung |
||
(3 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt) | |||
Zeile 1: | Zeile 1: | ||
[[Category:vba-wiki]] | |||
Eine Klasse ist in VBA eine besondere Art des Moduls. Während die Inhalte eines Moduls mit dem Öffnen des Projektes zur Verfügung stehen, muss von Klassen erst eine Instanz erstellt werden. | Eine Klasse ist in VBA eine besondere Art des Moduls. Während die Inhalte eines Moduls mit dem Öffnen des Projektes zur Verfügung stehen, muss von Klassen erst eine Instanz erstellt werden. | ||
Zeile 68: | Zeile 69: | ||
Datenklassen dienen, ähnlich dem benutzerdefinierten Datentyp '[[Type]]', dem Transport von Daten. | Datenklassen dienen, ähnlich dem benutzerdefinierten Datentyp '[[Type]]', dem Transport von Daten. | ||
'''Gemeinsame Vorteile mit dem Datentyp 'Type'''' | '''Gemeinsame Vorteile mit dem Datentyp 'Type'''' <br> | ||
Sowohl Datenklassen als auch benutzerdefinierte Datentypen können | Sowohl Datenklassen als auch benutzerdefinierte Datentypen können | ||
* Daten aus verschiedenen Datentypen aufnehmen | * Daten aus verschiedenen Datentypen aufnehmen | ||
Zeile 98: | Zeile 99: | ||
===== Öffentliche Eigenschaften ===== | ===== Öffentliche Eigenschaften ===== | ||
Private strEmailAddress As String Public Property Let EMailAddress(strEmail As String) If strEmail Like "*??@??*.??*" Then strEmailAddress = strEmail Else MsgBox "Bitte prüfen Sie die E-Mail-Adresse!" End If End Property Public Property Get EMailAddress() As String EMailAddress = strEmailAddress End Property Beim Schreiben der E-Mail-Adresse wird diese auf das korrekte Format überprüft. Der tatsächliche Wert wird in einer privaten Variable festgehalten. | <span style="Color:blue">Private </span>strEmailAddress<span style="Color:blue"> As String | ||
Public Property Let </span>EMailAddress<span style="Color:gray">(</span>strEmail<span style="Color:blue"> As String</span><span style="Color:gray">)</span> | |||
<span style="Color:blue"> If </span>strEmail<span style="Color:blue"> Like </span><span style="Color:gray">"*??@??*.??*"</span><span style="Color:blue"> Then</span> | |||
strEmailAddress <span style="Color:gray">=</span> strEmail | |||
<span style="Color:blue"> Else</span> | |||
MsgBox <span style="Color:gray">"Bitte prüfen Sie die E-Mail-Adresse!"</span> | |||
<span style="Color:blue"> End If | |||
End Property | |||
Public Property Get </span>EMailAddress<span style="Color:gray">()</span><span style="Color:blue"> As String</span> | |||
EMailAddress <span style="Color:gray">=</span> strEmailAddress<span style="Color:blue"> | |||
End Property</span> | |||
Beim Schreiben der E-Mail-Adresse wird diese auf das korrekte Format überprüft. Der tatsächliche Wert wird in einer privaten Variable festgehalten. | |||
===== Initialwerte ===== | ===== Initialwerte ===== | ||
Ein weiterer Vorteil gegenüber dem Datentyp 'Type' besteht darin, dass gezielt Initialwerte zugewiesen werden können, indem man diese beim Ereignis <code>Class_Initialize</code> vorgibt. Im Beispiel wird das Einstelldatum auf das aktuelle Datum festgelegt. Beim Bearbeiten der Daten könnte der Anwender dies entweder übernehmen oder entsprechend anpassen. Private Sub Class_Initialize() HireDate = Now() End Sub | Ein weiterer Vorteil gegenüber dem Datentyp 'Type' besteht darin, dass gezielt Initialwerte zugewiesen werden können, indem man diese beim Ereignis <code>Class_Initialize</code> vorgibt. | ||
Im Beispiel wird das Einstelldatum auf das aktuelle Datum festgelegt. Beim Bearbeiten der Daten könnte der Anwender dies entweder übernehmen oder entsprechend anpassen. | |||
Private Sub Class_Initialize() | |||
HireDate = Now() | |||
End Sub | |||
=== Ereignisklassen === | === Ereignisklassen === | ||
Siehe [[Ereignisse#Anwendungsereignisse|Ereignisse]] | Siehe [[Ereignisse#Anwendungsereignisse|Ereignisse]] |
Aktuelle Version vom 28. Januar 2023, 00:39 Uhr
Eine Klasse ist in VBA eine besondere Art des Moduls. Während die Inhalte eines Moduls mit dem Öffnen des Projektes zur Verfügung stehen, muss von Klassen erst eine Instanz erstellt werden.
Deklaration und Instanziierung
Ein Klassenobjekt wird analog zu den anderen Variablen deklariert:
Dim myInstance As clsClass
Die Instanziierung kann wie folgt durchgeführt werden:
- Wenn Sie eine neue Instanz erstellen:
Set myInstance = New clsClass
- Wenn Sie eine schon bestehende Instanz übernehmen möchten (zum Beispiel als Rückgabewert einer Funktion):
Set myInstance = LoadData(strUser)
Klassentypen
Die Einteilung in verschiedene Klassentypen soll lediglich den Einsatzbereich von Klassen erläutern und folgt keiner offiziell gültigen Klassifizierung.
Hilfsklassen
Hilfsklassen dienen dazu, immer wieder benötigte Hilfsprozeduren zur Verfügung zu stellen.
Dies könnten wir ebenfalls lösen, indem wir die Hilfsprozeduren öffentlich in Modulen zur Verfügung stellen -- dies würde jedoch dazu führen, dass alle Hilfsprozeduren immer und überall sichtbar wären und wir nur umständlich gezielt eine bestimmte Prozedur aufrufen könnten.
In Hilfsklassen können Hilfsprozeduren, welche sich mit einem bestimmten Thema befassen, gesammelt werden.
Sie werden erst dann sichtbar, wenn sie explizit angesprochen werden:
Hilfsklasse aufbauen
Sammeln Sie die gewünschten Prozeduren in der Hilfsklasse. Überlegen Sie, welche Hilfsprozeduren Sie öffentlich und welche Sie privat deklarieren möchten.
Gezielte Bereitstellung
Wenn Sie davon ausgehen, dass Ihre Hilfsprozeduren nur in sehr speziellen Fällen hilfreich sind und deshalb nicht permanent zur Verfügung stehen sollen, benötigen Sie keine Klassenfunktion, sondern verlassen sich darauf, dass die Klasse nur wenn benötigt mit
Set myInstance = New clsClass
bereitgestellt wird.
Permanente Bereitstellung
Für Hilfsprozeduren, die häufig verwendet werden, wie zum Beispiel solche, die sich mit Zeichenketten, Zahlenwerten, anwendungsspezifischen Aufgaben etc. befassen, können Sie eine Klassenfunktion bereitstellen:
In einem Modul (hier 'ExcelTools'), in dem Sie Ihre Hilfsklassen anbieten möchten, erstellen Sie wie folgt eine öffentliche Funktion:
Public Function ColumnTools() As clsToolsExcelColumns Set ColumnTools = New clsToolsExcelColumns End Function
Oder, wenn Sie nicht bei jedem Aufruf eine neue Instanz erzeugen möchten:
Public Function ColumnTools() As clsToolsExcelColumns Static myTools As clsToolsExcelColumns If myTools Is Nothing Then Set myTools = New clsToolsExcelColumns End If Set ColumnTools = myTools End Function
Datenklassen
Vergleich mit Datentyp 'Type'
Datenklassen dienen, ähnlich dem benutzerdefinierten Datentyp 'Type', dem Transport von Daten.
Gemeinsame Vorteile mit dem Datentyp 'Type'
Sowohl Datenklassen als auch benutzerdefinierte Datentypen können
- Daten aus verschiedenen Datentypen aufnehmen
- Ineinander verschachtelt werden
Vorteile des benutzerdefinierten Datentyps 'Type'
- Die Definition ist etwas schlanker
- Es werden keine zusätzlichen Klassenmodule benötigt
Vorteile der Datenklasse
- Kann als Element einer Collection-Auflistung verwendet werden
- Kann mithilfe von 'Property'-Prozeduren Daten vor der Entgegennahme prüfen
Aufbau
Die Datenfelder einer Datenklasse können als öffentliche Modulvariablen oder als öffentliche Eigenschaften angelegt werden. Die Unterschiede sollen im Beispiel verdeutlicht werden:
Öffentliche Variablen
Option Explicit Public FirstName As String, LastName As String, Department As String Public HireDate As Date, BirthDate As Date
Die öffentlichen Variablen nehmen Werte entgegen und geben diese bei Bedarf zurück.
Allerdings geschieht dies völlig ungeprüft und ohne die Möglichkeit, auf das Lesen / Schreiben der Werte zu reagieren.
Öffentliche Eigenschaften
Private strEmailAddress As String Public Property Let EMailAddress(strEmail As String) If strEmail Like "*??@??*.??*" Then strEmailAddress = strEmail Else MsgBox "Bitte prüfen Sie die E-Mail-Adresse!" End If End Property Public Property Get EMailAddress() As String EMailAddress = strEmailAddress End Property
Beim Schreiben der E-Mail-Adresse wird diese auf das korrekte Format überprüft. Der tatsächliche Wert wird in einer privaten Variable festgehalten.
Initialwerte
Ein weiterer Vorteil gegenüber dem Datentyp 'Type' besteht darin, dass gezielt Initialwerte zugewiesen werden können, indem man diese beim Ereignis Class_Initialize
vorgibt.
Im Beispiel wird das Einstelldatum auf das aktuelle Datum festgelegt. Beim Bearbeiten der Daten könnte der Anwender dies entweder übernehmen oder entsprechend anpassen.
Private Sub Class_Initialize() HireDate = Now() End Sub
Ereignisklassen
Siehe Ereignisse