Klammersetzung
Klammersetzung bei Berechnungen
Sie können bei mathematischen Berechnungen einzelne Rechenschritte mit runden Klammern gruppieren:
Debug.Print 2 * (3 + 4) ' Ergebnis: 14 Debug.Print 8 ^ (1 / 3) ' Ergebnis: Die dritte Wurzel von 8 ist 2
Klammersetzung bei If-Abfragen
Bei If-Abfragen können mit 'And' bzw. 'Or' zusammengefasste Auswertungen mithilfe von Klammern logisch zusammengefasst werden. In diesem Beispiel besteht die zweite Bedingung (in Klammern) aus zwei optionalen Werten (durch 'Or' verknüpft), insgesamt muss jedoch auch die erste Bedingung erfüllt sein. Ohne Klammern setzt die letzte Bedingung nicht voraus, dass auch die erste erfüllt ist.
If strInput01 = "Begrüßung" And (strInput02 = "Hallo" Or strInput02 = "Huhu") Then ' ... End If
Klammersetzung beim Aufruf von Prozeduren
Die Klammersetzung in VBA ist leider etwas verwirrend und nicht ganz konsequent (bei Prozeduraufrufen mit nur einem Übergabeparameter wird zum Beispiel die Klammersetzung geduldet, obwohl sie eigentlich nicht erlaubt ist).
Vielleicht hilft folgende Vorstellung:
Sie veranstalten einen Umzug und haben mehrere HelferInnen eingeladen. Dabei gibt es Helfer, die Ihre Möbel, Bücher, Kleidung etc.
- in die neue Wohnung tragen
- aufstellen, einräumen und dergleichen
- übernehmen, also Ihnen abnehmen, weil sie in der neuen Wohnung keinen Platz finden.
Bei den ersten beiden Aufgaben wird an Ihren Besitztümern etwas ausgeführt, das Ihnen unmittelbar zuteil wird: Sie werden getragen, aufgestellt, eingeräumt etc.. Für diese Aufgaben stellen Sie sich vor, dass sie ihre Arme bei der Übergabe an ihre Helfer um Ihre Dinge fassen, wie zwei runde Klammern, und dass Ihre HelferInnen Ihnen nach der durchgeführten Arbeit die Ergebnisse ihrer Arbeit präsentieren.
Bei der dritten Aufgabe übergeben Sie Dinge an jemand, der zwar etwas an ihren Dingen ausführt, deren Ergebnis aber nicht unmittelbar an Sie gerichtet ist. Sie wissen nur, dass diese Dinge nun nicht mehr bei Ihnen sind. Hier stellen Sie sich vor, dass Sie mit Ihrer offenen Hand andeuten, dass diese Dinge von der EmpfängerIn weiterverarbeitet werden.
Wir können zur Klammersetzung (außerhalb von Berechnungen und If-Abfragen) folgende Eselsbrücke ableiten:
- Wenn links vor dem Befehl eine Zuweisung oder eine weitere Anweisung steht, müssen Übergabeparameter in Klammern gesetzt werden:
lngContinue = MsgBox("Möchten Sie weiter machen?", vbYesNo, "Abfrage") ' Zuweisung mit '=' Debug.Print MsgBox("Möchten Sie weiter machen?", vbYesNo, "Abfrage") ' Ergebnis wird an 'Debug.Print' übergeben If MsgBox("Möchten Sie weiter machen?", vbYesNo, "Abfrage") = True Then Exit Sub ' Ergebnis wird in If-Abfrage weiter verwertet
- Wenn dem Befehl eine Zuweisung folgt, werden ebenfalls Klammern verwendet:
Cells(1, 5) = "Hallo"
- Ansonsten dürfen KEINE Klammern verwendet werden, auch wenn es sich bei dem Befehl um eine Funktion handelt:
MsgBox "Hallo!", , "Begrüßung" ' Der Befehl steht alleine in dieser Befehlszeile
Im Einzelnen erklärt sich diese Eselsbrücke wie folgt:
- Klammern werden beim Aufruf von Funktionen mit Übergabeparametern verwendet, wenn der Rückgabewert der Funktion verwendet wird.
' Die MsgBox-Funktion gibt den vom Anwender gewählten Knopf zurück. Bei der Anzeige der MsgBox ohne zusätzliche Knöpfe wird der Rückgabewert jedoch ignoriert. ' Hier dürfen also keine Klammern gesetzt werden! MsgBox "Hallo!", , "Begrüßung"
' Die MsgBox-Funktion soll einen Dialog mit den Knöpfen 'Ja' und 'Nein' anzeigen. Die Wahl des Benutzers wird in einer Variablen gespeichert. lngContinue = MsgBox("Möchten Sie weiter machen?", vbYesNo, "Abfrage")
- Beim Aufruf von Sub-Prozeduren werden grundsätzlich KEINE Klammern verwendet!
DoSomething "With this"
- Zur näheren Bestimmung von Objekten werden ebenfalls immer die Klammern verwendet.
Cells(1,5).Select
- Klammern werden ebenfalls im Kopf einer Prozedur verwendet, um die Übergabeparameter anzugeben.
- Wenn keine Übergabeparameter erwartet werden, wird ein leeres Klammernpaar verwendet.
Private Sub MyProcedure() ' ... End Sub
Private Sub DoSomething(ByVal strWithThis As String) ' ... End Sub