Klassenobjekte

Aus VBA-wiki
Zur Navigation springen Zur Suche springen

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.

ListOfProceduresLong.png

In Hilfsklassen können Hilfsprozeduren, welche sich mit einem bestimmten Thema befassen, gesammelt werden.

Sie werden erst dann sichtbar, wenn sie explizit angesprochen werden:

ListOfProceduresShort.png

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