Warum noch ein Access-Buch?
Für wen ist das Buch?
Jetzt bestellen
+ direkter Download des eBooks!
Nur EUR 59,95!
Fehler gefunden?
Bitte melden!
Wünsche an das Buch?
Her damit!
Was denken die Leser über dieses Buch?
Lesen Sie aktuelle Rezensionen!
Kapitel des noch nicht veröffentlichten Buchs zum Downloaden, Probelesen und Kommentieren
Beispieldatenbanken
Zusätzliches Material

Das Buch im HTML-Format

Für unbestimmte Zeit bieten Addison-Wesley und André Minhorst den kompletten Inhalt des Buchs als Download an. Schauen Sie rein und informieren Sie sich über den Inhalt! Und wenn Ihnen das Buch nützlich erscheint und Sie glauben, dass Sie etwas gelernt haben oder durch das Gelesene sogar etwas Zeit und somit Geld bei Ihrer Arbeit einsparen konnten, können Sie sich ja beim Autor und beim Verlag revanchieren - beispielsweise durch den Kauf dieses Buchs.

Am schönsten wäre es natürlich, wenn Sie das Buch direkt hier bestellen - Sie erhalten das Buch dann direkt vom Verlag, und der Autor und Verlag haben dann noch mehr davon, als wenn Sie es anderswo kaufen.

Danke für Ihr Interesse!

7.8.4 Lose Kopplung zwischen Routinen

7.8.5 Parameter und Rückgabewerte einer Routine

Sie können für jede VBA-Routine Parameter festlegen. Diese dienen einerseits dazu, Informationen an die aufgerufene Routine zu übergeben. Andererseits können Sie diese auch verwenden, um die Ergebnisse der Routine zurückzuliefern.

Parameter werden in Pflicht- und optionale Parameter unterteilt. Optionale Parameter befinden sich immer am Ende der Parameterliste und werden mit dem Schlüsselwort Optional gekennzeichnet.

Sie können Parameter einfach in der Reihenfolge angeben, in der sie in der Parameterliste aufgeführt werden, oder benannte Parameter verwenden. Dazu übergeben Sie der Routine beim Aufruf eine durch Kommata getrennte Liste von Wertepaaren nach dem Schema :=.

In der Routine können Sie das Vorhandensein von Werten bei optionalen Parametern mit der IsMissing-Funktion überprüfen. Optionale Parameter müssen den Datentyp Variant besitzen, damit die IsMissing-Funktion funktioniert.

Ein andere Alternative, bei der der optionale Parameter auch einen anderen Datentyp haben kann, ist das Zuweisen eines Vorgabewertes mit dem Gleichheitszeichen:

Sub BeispielParameter2(str1 As String, Optional lngWert As Long = -1)

In der Prozedur ist dann zu prüfen, ob der Parameter lngWert einen anderen Wert als -1 hat. Letzteres würde ihn als nicht übergeben kennzeichnen.

Jede Routine kann maximal 60 Parameter besitzen.

Namen von Parametern

Für Parameter von Routinen gelten im Allgemeinen die gleichen Regeln wie für sonstige Variablen.

Parameterwerte nur mit Vorsatz ändern

In manchen Fällen bieten die Parameter einer Routine die einzige Möglichkeit, Informationen an die aufrufende Routine zurückzugeben. Gut, man könnte ein Array als Funktionswert oder einen benutzerdefinierten Typen verwenden. Parameter lassen sich aber wesentlich leichter handhaben.

Beispiel: Die Routine BeispielRueckgabewert deklariert die beiden Variablen strVorname und strNachname und übergibt diese einschließlich der Personalnummer der gesuchten Person an die Funktion NameErmitteln. Diese liest den entsprechenden Datensatz ein und füllt die Parameter strVorname und strNachname mit den Daten aus der Tabelle. Diese lassen sich in der aufrufenden Routine anschließend ganz normal weiterverwenden.

Public Sub BeispielRueckgabeparameter()
    Dim strVorname As String
    Dim strNachname As String
    NameErmitteln 1, strVorname, strNachname
    Debug.Print strVorname
    Debug.Print strNachname
End Sub

Public Function NameErmitteln(lngPersonalID As Long, _
    strVorname As String, strNachname As String)
    Dim db As DAO.Database
    Dim rst As DAO.Recordset
    Set db = CurrentDb
    Set rst = db.OpenRecordset("SELECT Vorname, Nachname FROM Personal " _
        & "WHERE [Personal-Nr] = " & lngPersonalID)
    strVorname = rst!Vorname
    strNachname = rst!Nachname
    rst.Close
    Set rst = Nothing
    Set db = Nothing
End Function

Listing 7.17: Parameter als Rückgabewert

Dies funktioniert, weil unter VBA alle Parameter standardmäßig als Referenztyp übergeben werden. Das bedeutet, dass nicht der eigentliche Wert, sondern eine Referenz auf die Adresse, an der der Wert gespeichert ist, übergeben wird.

Ändert die aufgerufene Routine diesen Wert, findet die aufrufende Prozedur in der verwendeten Variablen den geänderten Wert vor. Wenn Sie den Wert selbst statt der Referenz übergeben möchten, verwenden Sie das Schlüsselwort ByVal.

Wenn Sie die genannte Technik für die Rückgabe von Ergebnissen verwenden, ordnen Sie die Parameter so an, dass die Rückgabeparameter am Ende der Parameterliste stehen.

Parameterwerte nicht ohne Vorsatz ändern

Umgekehrt gilt: Wenn Sie nicht jede Variable explizit als Werttyp deklarieren möchten, dürfen Sie Parameter nicht als Variablen verwenden und diese in der aufgerufenen Routine ändern. Daher weisen Sie Parameter zunächst prozedurinternen Variablen zu und verwenden diese für die weiteren Aktionen.

Rückgabewerte erst am Ende zuweisen

Viele VBA-Entwickler neigen dazu, den Rückgabewert einer Routine, also die Variable mit dem Namen der Routine, innerhalb der Routine als Variable zu verwenden und ihren Wert dort nach Belieben zu ändern. Das kann zu Problemen führen, wenn die Routine etwa einmal vorzeitig beendet wird - der Rückgabewert liefert dann unter Umständen ein falsches Ergebnis.

Besser ist es, wenn Sie den Rückgabewert einer Routine erst kurz vor dem Ende der Routine zuweisen. Tritt dann vorher ein Fehler auf, lässt sich dieser durch den leeren Rückgabewert leicht identifizieren.

Beliebige Anzahl Parameter übergeben

Mit dem Schlüsselwort Optional wird die Übergabe von Parametern an eine Prozedur zwar variabler, weil nicht alle Parameter mit einem Wert gefüllt sein müssen. Die Anzahl Parameter ist dennoch festgelegt. Mit dem Schlüsselwort ParamArray ist es jedoch möglich, einer Prozedur eine beliebige, nicht festgelegte Zahl Parameter zu übergeben. Dabei werden die einzelnen übergebenen Parameter in einem Variant-Array gespeichert, das in der Prozedur ausgelesen werden kann:

Public Sub BeispielParameterArray(str1 As String, _
    ParamArray arrParamMulti())
    Dim i As Long
    Debug.Print "Pflichtparameter: " & str1
    For i = 0 To UBound(arrParamMulti)
        Debug.Print "Optionaler Parameter " & i & ": " & arrParamMulti(i)
    Next i
End Sub

Ein Beispielaufruf dieser Prozedur sieht so aus:

BeispielParameterArray "Minhorst", "Alter", 34, "Gewicht", 86.5

Nächster Abschnitt:

7.8.6 Gleichzeitige Rückgabe von Statuswert und Ergebnis

© 2006-2008 André Minhorst Alle Rechte vorbehalten.