Klammersetzung

Aus VBA-wiki
Zur Navigation springen Zur Suche springen

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 Helfer 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 Ihr Helfer Ihnen nach der durchgeführten Arbeit ein Ergebnis präsentiert.

Bei der dritten Aufgabe übergeben Sie Dinge an jemand, der zwar etwas an ihren Dingen ausführt, deren Ergebnis aber nicht unmittelbar an Sie zurückkommt. 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 vom Empfänger weiterverarbeitet werden.

Wir könne 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.
 ' Beispiel eins: 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"
 ' Beispiel zwei: 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 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