Prozeduren wären kaum zu gebrauchen, wenn man ihnen nicht auch Argumente übergeben könnte, mit denen sie etwas tun sollen. Diese Werte gehören in die Klammern.
Function Bruttopreis(Netto As Currency) As Currency Bruttopreis = Netto * 1.19 End Function
Sub druckeAddition(z1 As Long, z2 As Long) Debug.Print z1 & " plus " & z2 & " ist " & z1 + z2 End Sub
Hier wird die Variable Netto
als Argument an die Funktion
Bruttopreis
übergeben, wobei auch für ein Argument ein Datentyp
angegeben werden kann. Die Sub druckeAddition
bekommt gleich zwei
Argumente übergeben. Um diese Prozeduren aufzurufen, muss man auch die Argumente
angeben. Aus dem Direktfenster geht das wie folgt:
Debug.Print Bruttopreis(100) 119 druckeAddition 100, 2 100 plus 2 ist 102
Mehrere Argumente werden durch Kommata getrennt. Will man den Rückgabewert einer Funktion verwenden, müssen die Argumente in (Klammern) eingeschlossen werden. Bei Subs dürfen - mangels Rückgabewert - keine Klammern gesetzt werden.
Auch Arrays können als Argument übergeben werden.
Sub Liste(MeineListe() As Byte) Debug.Print MeineListe(0) End Sub
Sub Aufruf() Dim x(1) As Byte x(0) = 0 x(1) = 1 Liste x End Sub
Hier wird in Aufruf
ein Array definiert und an Liste
übergeben. Liste
weiß dabei nicht, wie viele Felder der Array hat
(Bei Bedarf kann man das mit den VBA-internen Funktionen
LBound und
UBound ermitteln).
Es ist auch möglich, Argumente optional zu gestalten.
Function Brutto(Netto As Currency, Optional MwSt As Currency = 1.19) As Currency Brutto = Netto * MwSt End Function
Für Brutto
ist es nicht nötig, das Argument MwSt
anzugeben. Für den Fall, dass MwSt
fehlt, kann man nach einem
Gleichheitszeichen einen Standardwert vorgeben.
Soll eine Prozedur sowohl optionale als auch nicht optionale Argumente haben, müssen erst alle nicht optionalen Argumente aufgeführt werden, die optionalen Argumente müssen am Ende stehen.
Nun kann es vorkommen, dass eine Prozedur mehrere Argumente bekommt, von denen auch mehrere optional sind:
Sub MeineSub(Optional a, Optional b, Optional c, Optional d) End Sub
Wollte man nun nur z. B. für das erste und vierte Argument einen Wert übergeben, müsste der Aufruf mit einigen „unnötigen“ Kommata erfolgen. Für solche Fälle gibt es die Möglichkeit, Argumente mit deren Namen zu übergeben. Die beiden folgenden Aufrufe sind gleichwertig:
MeineSub 1,,,4 MeineSub a:=1, d:=4
Für Arrays ist das Optional
-Schlüsselwort
nicht zulässig. Wenn (neben eventuellen festen Argumenten) nicht von vornherein
feststeht, wieviele Argumente an eine Funktion übergeben werden sollen, muss
stattdessen ParamArray
verwendet werden. Damit
wird ein Array definiert, in dem alle Argumente, die nicht schon zuvor verwendet
wurden, zusammengefasst werden. Dieses Array ist zwingend ein Variant.
Sub Ergebnisse(Teilnehmer As String, ParamArray Noten()) End Sub
Ergebnisse
erwartet lediglich Teilnehmer
als
Pflichtparameter. Zusätzlich sind allerdings beliebig viele weitere Parameter möglich,
die im Array Noten
gespeichert werden. Die Prozedur könnte wie folgt
aufgerufen werden:
Ergebnisse "Schulz" Ergebnisse "Mayer", 1, 2 ,2, 4 Ergebnisse "Müller", "gut", "ausreichend", "sehr gut"
Weiter oben wurde ein Beispiel gezeigt, in dem ein schon existierendes Array
an eine andere Prozedur übergeben wird. Mit ParamArray
ist es nicht
nötig, für die Übergabe erst ein Array zu erstellen. Stattdessen wird aus der
Argumentliste heraus der Array erzeugt.
In der Praxis erfolgt die weitere Bearbeitung derartiger Variantarrays häufig mit For Each-Schleifen, die wir erst noch viel später kennenlernen werden.
Häufig sind die Argumente einer Prozedur in der aufrufenden Prozedur schon als Variable definiert. Man kann bestimmen, ob die aufgerufene Prozedur unmittelbar auf diese Variablen zugreifen und sie auch verändern darf, oder der übergebene Wert gekapselt ist.
Public Sub Start() Dim Wert1 As Integer, Wert2 As Integer Wert1 = 1 Wert2 = 1 Aufruf Wert1, Wert2 Debug.Print "Wert1: " & Wert1 Debug.Print "Wert2: " & Wert2 End Sub
Private Sub Aufruf(ByVal Wert1 As Integer, ByRef Wert2 As Integer) Wert1 = 2 Wert2 = 2 End Sub
In der Prozedur Start
bekommen zwei Variablen einen Anfangswert.
Anschließend werden beide an die Prozedur Aufruf
übergeben. Allerdings
erfolgt die Übergabe von Wert1
mit ByVal
,
während Wert2
mit ByRef
übergeben
wird. Beide bekommen in Aufruf
neue Werte zugewiesen. Diese Zuweisungen
wirken sich in Start
nur bei Wert2
aus.
Start Wert1: 1 Wert2: 2
Wird ein Argument mit ByRef
(Standardwert)
aufgerufen, handelt es sich um eine Referenz auf den übergebenden Wert.
Dann kann die Prozedur die Werte unmittelbar in der aufrufenden Prozedur ändern.
Wird eine Variable dagegen mit ByVal
übergeben,
erhält die Prozedur nur den Wert der Variable, nicht die Variable selbst.