Argumente

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.

Fixe Argumente

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).

Einzelne Optionale Argumente

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

Viele Optionale Argumente

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.

Übergabeart

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.