eigene VBA-Datentypen

In der Praxis arbeite ich sehr gerne mit Funktionen, um den Quellcode in kleinere, leicht verständliche Einheiten aufzuteilen, die idealerweise so allgemein sind, dass sie mehrmals verwendet werden können.

In der Regel geben diese Funktionen einen einzelnen Wert zurück. In manchen Fällen ist jedoch erforderlich, mehrere Werte gleichzeitig zurückgeben zu können, vor allem dann, wenn die Daten in einem engen fachlichen Zusammenhang stehen – beispielsweise ein bestimmtes Produkt, seine abgesetzte Menge und der damit generierte Umsatz.

Lösungsvariante 1 – Aufteilung der Funktion in mehrere Funktionen

Theoretisch wäre es möglich, in so einem Fall zwei Funktionen auf die Beine zu stellen. Eine für die Ermittlung der Menge und die andere für die Ermittlung des Umsatzes (oder des Preises). Bei zwei Attributen, die sich schnell ermitteln lassen, wäre dies eine gangbare Alternative. Bei mehr Attributen wäre es natürlich deutlich umständlicher. Auch die Performance würde darunter leiden, da für jedes Attribut ein erneuter Zugriff nötig wäre.

Lösungsvariante 2 – Rückgabe als Array

Eine andere Möglichkeit wäre es, ein Array als Rückgabewert zu definieren und damit alle Attribute gleichzeitig zurückzugeben. Der große Nachteil dieser Lösung wäre es, zum einen die Notwendigkeit, das Array als Variant anlegen zu müssen (damit darin alle Datentypen gespeichert werden können) und zum anderen muss man beim „Parsen“ dieses Rückgabewertes ganz genau auf die richtige Reihenfolge der Attribut achten. So muss man sich merken bzw. nachschlagen, welches fachliche Attribut denn im 2. und welches im 6. Arrayelement ist.

Lösungsvariante 3 – Rückgabe mit einem eigenen Datentyp

Meine favorisierte Lösung für diesen Anwendungsfall lautet – ich kreiere einen eigenen Datentyp, der auf die Bedürfnisse der jeweiligen Funktion ausgerichtet ist. Eigene Datentypen haben gewisse Ähnlichkeit mit Klassen, beschreiben jedoch ausschließlich die Datenhaltung.

Public Type typProdukt
    bezeichnung As String
    anzahl      As Long
    summe       As Double
End Type

Der so angelegte Datentyp wird dann als Rückgabewert der Funktion hinterlegt. Der große Vorteil dieser Lösung gegenüber dem Array ist, dass man die Attribute namentlich ansprechen kann. Darüber hinaus besteht auch keine Notwendigkeit, die Attribute als Variant zu deklarieren – man verwendet hier einfach die passenden Datentypen.

Public Function getProdukt() As typProdukt

    'hier erfolgt die Datenermittlung
    '...
   
    Dim produkt As typProdukt
    
    produkt.summe = 120
    produkt.bezeichnung = "TestProdukt"
    produkt.anzahl = 12
   
    
    getProdukt = produkt

End Function

Nach dem Aufruf der Funktion lassen sich die Daten bequem über deren Namen ansprechen.

Public Sub aufruf()
    With getProdukt()
        
        MsgBox .bezeichnung & " wurde " & .anzahl & "-fach verkauft und erlöste " & .summe & " €."
    
    End With
End Sub

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.