Verzweigungen

Die Ausführung von Codeabschnitten kann von bestimmten Voraussetzungen abhängig sein. Je nachdem, welche Voraussetzungen gegeben sind, soll das Programm „verzweigen“.

true false ? true false

If .. Then .. Else

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.

Select Case

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.