Die Ausführung von Codeabschnitten kann von bestimmten Voraussetzungen abhängig sein. Je nachdem, welche Voraussetzungen gegeben sind, soll das Programm „verzweigen“.
Man kann die Ausführung von Anweisungen von Bedingungen abhängig machen:
Public Sub Antwort(erkannt As Long) Dim richtig As Boolean richtig = False If erkannt = 42 Then richtig = True Debug.Print richtig End Sub
Diese Sub wird stets Falsch
ausgeben, es sei denn, man weiß, dass
die Antwort
42 lautet. Denn der If
-Befehl
prüft eine Bedingung, und nur, wenn diese zutrifft (die Bedingung ist wahr), wird
der Rest der Zeile, der hinter Then
steht,
abgearbeitet.
Diese einzeilige Schreibweise einer Bedingung ist nur geeignet für einzelne Befehle. Von einer Bedingung können aber auch mehrere Befehle abhängen.
Public Function AbsMulti(x As Long, y As Long) As String 'multipliziert x mit y und gibt das Ergebnis Absolut zurück 'Parameter: die zu multiplizierenden Werte 'Rückgabe: Ergebnis, dahinter "(Positiv)" oder "(negativ)" Dim a As Long Dim Kommentar As String a = x * y Kommentar = " (Positiv)" If x < 0 Xor y < 0 Then a = -a Kommentar = " (Negativ)" End If AbsMulti = a & Kommentar End Function
Das Beispiel zeigt zunächst eine etwas kompliziertere Bedingung: Nur, wenn
x
oder y
negativ ist (aber nicht beide zugleich, deshalb
Xor
) ist die Bedingung insgesamt erfüllt.
Des Weiteren werden, wenn diese Bedingung erfüllt ist, gleich zwei Befehlszeilen
abgearbeitet, nämlich alle Befehle nach Then
,
bis irgendwann End If
erreicht wird.
Die obige Beispielfunktion hat allerdings einen kleinen Schönheitsfehler: Den
Variablen a
und Kommentar
werden erst Werte zugewiesen,
die aber, wenn die If
-Bedingung erfüllt ist, gleich wieder überschrieben
werden - ohne, dass sie inzwischen gebraucht wurden. In diesem einfachen Beispiel
mag das unerheblich sein, aber es gibt Momente, in denen Performance durchaus ein
Thema ist (z. B. im Zusammenhang mit Schleifen). Es ist
daher eleganter, die Variablen gleich mit den jeweils richtigen Werten zu belegen:
Public Function AbsMulti(x As Long, y As Long) As String 'multipliziert x mit y und gibt das Ergebnis Absolut zurück 'Parameter: die zu multiplizierenden Werte 'Rückgabe: Ergebnis, dahinter "(Positiv)" oder "(negativ)" Dim a As Long Dim Kommentar As String If x < 0 Xor y < 0 Then a = -(x * y) Kommentar = " (Negativ)" Else a = x * y Kommentar = " (Positiv)" End If AbsMulti = a & Kommentar End Function
Das Ergebnis dieser Funktion ist mit dem vorhergehenden Beispiel identisch.
Allerdings wird jetzt erst die Prüfung vorgenommen und aufgrund dessen die Variablen
nur noch einmal mit Werten belegt: Wenn die Bedingung erfüllt ist, wird der Code
zwischen Then
und
Else
ausgeführt, ansonsten der Code zwischen
Else
und End
If
.
Gelegentlich kommt es vor, dass man mehr als zwei Fallunterscheidungen braucht.
Mit If
wären derartige Strukturen ziemlich aufwendig umzusetzen.
Einfacher geht es mit Select Case
:
Public Function Sprache(Stadt As String) As String Select Case Stadt Case "Zürich" Sprache = "Deutsch" Case "Lausanne" Sprache = "Französisch" Case "Locarno" Sprache = "Italienisch" Case "Chur" Sprache = "Rätoromanisch" End Select End Function
Die Funktion Sprache
erwartet die Eingabe des Namens einer Stadt
in der Schweiz und gibt zurück, welche Sprache dort gesprochen wird. Dazu wird
zwischen Select
und
End Select
geprüft, welche Stadt eingegeben
wurde. Nur diejenige Verzweigung (der Case
-Abschnitt)
innerhalb von Select
wird abgearbeitet, die zutrifft.
Mit Select Case
sind auch Wertebereiche
als Fallunterscheidung möglich und man kann auch angeben, was passiert, wenn keiner
der übrigen Fälle greift:
Public Function Einschätzung(Zahl As Byte) As String Select Case Zahl Case 0 Einschätzung = "Wohl die Null gewählt?" Case 1 To 10 Einschätzung = "Bescheiden" Case 11 To 19 Einschätzung = "Zehn und etwas" If Zahl > 14 Then Einschätzung = Einschätzung & " mehr" End If Case 20, 30, 40, 50 Einschätzung = "die Zahl hört mit 'zig' auf" Case 42 Einschätzung = "Die Antwort auf alle Fragen" Case Is > 50 Einschätzung = "Größenwahn?" Case Else Einschätzung = "Na ja, irgendeine Zahl" End Select End Function
Der Funktion Einschätzung
soll irgendeine Zahl zwischen 0 und 255
übergeben werden, und sie gibt dann einen Text zurück. Bei Werten von 1 bis 10
bzw. 11 bis 19 ist der gesamte Wertebereich mit je einer einzigen Fallunterscheidung
abgedeckt, genau wie bei Werten größer 50. Auch eine Liste von Zahlen, wie 20, 30, 40, 50
ist möglich. Wenn keine der anderen Fallunterscheidungen greift, kommt Case Else
zum tragen.
Im obigen Beispiel findet sich auch eine Verschachtelung: Unter
Case 11 To
19
ist noch ein If
-Block eingebaut.
Wenn Zahl
größer 14, wird Zehn und etwas mehr
ausgegeben.
Aber weil diese Bedingung überhaupt nur erreicht wird, wenn Zahl
zwischen
11 und 19 liegt, kommt das nur für Zahlen bis 19 zum Tragen - ohne, dass das in
der If
-Bedingung angegeben ist.