Aufrufanweisungen in VBA
»Call«
Wenn die Anzeige des Ergebnisses nicht gewünscht wird, kann Call statt Debug.Print verwendet werden.
Call ist ein Schlüsselwort: Es ist kein Teil der Standardbibliothek, sondern gehört zur Syntax der Programmiersprache.
Bei Schlüsselwörtern wie Call ist die Groß- und Kleinschreibung nicht signifikant (egal).
Call und Shell müssen durch Leerraum getrennt sein, damit sie als zwei verschiedene lexikalische Einheiten (Wörter) erkannt werden.
- Direktbereich
Call Shell( PathName := "Calc" )
- Code-Bereich
Option Explicit
Sub Main
Call Shell( PathName := "Calc" )
End Sub
Aufruf-Anweisung ohne Call
Die Aufruf-Anweisung ohne »Call« beginnt direkt mit dem Namen einer Funktion. Die Argumente dieser Hauptfunktion der Anweisung sollten bei dieser Form des Aufrufs nicht eingeklammert werden.
Ein Aufruf erfolgt in der Regel entweder:
● mit Call (oder in einem Ausdruck) und mit Klammern oder
● ohne Call und ohne Klammern.
- Code-Bereich
Option Explicit
Sub Main
Shell "Calc"
End Sub
- Code-Bereich
Option Explicit
Sub Main
Shell PathName := "Calc"
End Sub
Modul1
Option Explicit
Sub Main
Debug.Print Shell( PathName := "Calc" )
End Sub
- Protokoll
4532
Wir verwenden Debug.Print, wenn wir den Wert eines Aufrufs sehen wollen, und eine Aufruf-Anweisung (mit oder ohne CALL), wenn wir den Wert des Aufrufs nicht sehen wollen.
Eine eventuelle Wirkung des Aufrufs tritt in jedem Fall ein.
Da »Shell« hinter »Debug.Print« nicht am Anfang einer Anweisung steht, müssen Klammern verwendet werden.
Aufruf-Anweisung mit mehreren Argumenten
FileCopy "from", "to"
- Kopiert die Datei »from« auf die Datei »to«
FileCopy ( "from" ),"to"
- Das Einklammern eines Arguments ist zwar möglich, hat aber eine spezielle Bedeutung, die später erklärt werden wird. Falls nicht gerade diese spezielle Bedeutung beabsichtigt ist, sollte es daher vermieden werden.
FileCopy( "from", "to" )
- Das Einklammern mehrerer Argumente ist ohne Verwendung von »CALL« nicht zulässig und führt zu einer Fehlermeldung.
Fehler beim Kompilieren:
Erwartet: =Call FileCopy( "from" ,"to" )
- Wenn beide Argumente eingeklammert werden sollen, dann ist es richtig, »CALL« zu verwenden. Aber es hätte dieselbe Bedeutung und wäre kürzer, sowohl auf »CALL« als auch auf die Klammern zu verzichten (wie beim allerersten Beispiel).
Call FileCopy(( "from" ),"to" )
- Wenn beide Argumente eingeklammert sind, dann kann auch noch ein Argument einzeln eingeklammert werden. Dies hat wieder eine spezielle Bedeutung, welche später erklärt werden wird. Bis dahin sollte es vermieden werden.
Bei Aufrufen mit mehreren Argumenten erhöhen benannte Argumente die Lesbarkeit und helfen, Mißverständnisse zu vermeiden.
FileCopy Source := "C:\example.txt", Destination := "C:\example1.txt"
Call FileCopy( Source := "C:\example.txt", Destination := "C:\example2.txt" )
Obligatorischer Leerraum in Syntaxdiagrammen
Bei der Einführung in Syntaxdiagramme hatten wir erwähnt, daß Leerraum an der Stelle eines Pfeils in einem Syntaxdiagramm manchmal eingefügt werden muß. Damals konnte jedoch noch kein Beispiel dafür gegeben werden. Nun sind wir soweit, daß wir ein Beispiel dafür geben können.
Der Leerraum muß eingefügt werden, falls der Teil links vom Pfeil mit dem Teil rechts vom Pfeil ohne Leeraum zu einer an dieser Stelle nicht gemeinten lexikalischen Einheit verbunden werden würde.
Falls ein Wort wie »SHELL« direkt hinter ein anderes Wort wie »CALL« geschrieben wird, kann es dann vorkommen, daß beide Wörter zu einer lexikalischen Einheit »CALLSHELL« verbunden werden, welche eine andere Bedeutung hat als zwei aufeinanderfolgende Wörter »CALL« und »SHELL«. Deswegen muß dann ein Leerzeichen zwischen beide Wörter eingefügt werden, um sie voneinander zu trennen.
Falls nicht die lexikalische Einheit »CALLSHELL« verwendet werden soll, so ist bei der Anwendung des folgenden Syntaxdiagramms in der Regel Leerraum für den mittleren Pfeil einzusetzen. Im Zweifelsfall kann immer Leerraum eingesetzt werden, weil dies an der Stelle eines Pfeiles stets erlaubt ist.
- Syntaxdiagramm
Vorzeichenfolge
.----. .-----.
--->( CALL )--->( SHELL )--->
'----' '-----'
Eine ähnlich Situation findet man auch bei dem schon behandelten »REM« für Kommentare: Wenn diesem ein Buchstabe oder eine Ziffer folgen soll, dann muß direkt nach »REM« erst einmal Leerraum stehen.
Die allgemeine Regel besagt, daß Leerraum zwischen zwei Teilen eines Programms stehen muß, wenn der Anfang des zweiten Teils sonst noch die lexikalische Einheit am Ende des ersten Teils verlängern könnte und dies nicht gewünscht ist. Im Zweifel kann man einfach vor und nach allem, das eine einzelne lexikalische Einheit sein soll, Leerraum einfügen.
Allgemein gilt die Regel, daß ein Leerzeichen hinter einer lexikalischen Einheit nicht entfallen darf, wenn sonst zwei Zeichen aus der Gruppe der Buchstaben, Ziffern oder Grundstriche, die zuvor durch das Leerzeichen getrennt waren, direkt hintereinanderstehen würden.
Optionaler Leerraum in Syntaxdiagrammen
- Syntaxdiagramm
Vorzeichenausdruck
.-. .----------.
--->( - )--->| Numerale |--->
'-' '----------'
Ein Vorzeichen vor einem Numerale muß in der Regel nicht mit einem Leerzeichen abgetrennt werden, da es nicht mit dem Numerale zu einer lexikalischen Einheit verbunden werden kann. Es ist jedoch erlaubt an dieser Stelle Leerraum zu verwenden, genauso wie auch direkt vor dem Vorzeichen oder direkt hinter dem Numerale Leeraum eingefügt werden darf.
Das obenstehende Syntaxdiagramm gibt den Aufbau eines Quelltexts wie »-␣␣65« wieder: Dieser besteht aus zwei lexikalischen Einheiten: Dem Operator »-« und dem Numerale »65«. Beide sind lexikalische Einheiten. Das heißt, daß vor ihnen, hinter ihnen und zwischen ihnen Leerraum eingefügt werden darf, obwohl dieser nicht ausdrücklich in Form von Kästchen im Syntaxdiagramm erscheint.
Aus Sicht der Syntax besteht der Quelltext »-␣␣65« also nur aus einer Folge zweier lexikalischer Einheiten: dem Operator »-« und dem Numerale »65«, und nicht aus einer Folge von fünf Schriftzeichen (Minuszeichen, Leerzeichen. Leerzeichen, Sechs, und Fünf), denn im Syntaxdiagramm erscheinen als Kästchen nur noch lexikalische Einheiten, Leerraum wird nicht mehr ausdrücklich durch Kästchen dargestellt.
Ob Leerraum obligatorisch oder optional ist, kann nicht an den Syntaxdiagrammen alleine abgelesen werden. Vielmehr muß man dazu auch die Regeln kennen, nach denen lexikalische Einheiten erkannt werden. Diese Regeln sind an dieser Stelle des Kurses aber noch gar nicht vollständig erläutert worden. Doch zum Glück kann man im Zweifel vor und nach einer lexikalischen Einheit immer Leerraum einsetzen, so daß es deswegen nicht nötig ist, jetzt schon alle Regeln vollständig zu kennen.