VBA in Excel/ Wenn-Abfragen
Einfache Verzweigung (If … Then)
BearbeitenWenn es sich beim aktuellen Tag um einen Sonntag handelt, wird eine entsprechende Meldung ausgegeben, wenn nicht, erfolgt keine Aktion.
Sub WennSonntagMsg()
If Weekday(Date) = 1 Then MsgBox "Heute ist Sonntag"
End Sub
Wenn/Dann/Sonst-Verzweigung (If … Then … Else)
BearbeitenIn der Regel werden Wenn-/Dann-Abfragen erstellt, um Verzweigungen zu ermöglichen. In Beispiel 2.2 wird bei WAHR die Sonntagsmeldung, bei FALSCH der aktuelle Wochentag ausgegeben.
Sub WennSonntagOderMsg()
If Weekday(Date) = 1 Then
MsgBox "Heute ist Sonntag"
Else
MsgBox "Heute ist " & Format(Weekday(Date), "dddd")
End If
End Sub
Wenn-Dann-SonstWenn-Verzweigung (If..Then..ElseIf.. ..Else..)
BearbeitenÜber ElseIf können weitere Bedingungen mit entsprechenden Verzweigungen angefügt werden.
Sub WennSonntagSonstMsg()
If Weekday(Date) = 1 Then
MsgBox "Heute ist Sonntag"
ElseIf Weekday(Date) = 7 Then
MsgBox "Heute ist Samstag"
Else
MsgBox "Heute ist " & Format(Weekday(Date), "dddd")
End If
End Sub
Zweckmäßig ist diese Struktur auch bei der Fehlerprüfung, wenn völlig unterschiedliche Bedingungen geprüft werden sollen:
Public Function DiscoEinlass(GeburtsTag As Date) As Boolean
DiscoEinlass = False
If DateSerial(Year(GeburtsTag) + 18, Month(GeburtsTag), Day(GeburtsTag)) > Date Then
MsgBox "Sie sind leider noch nicht volljährig"
ElseIf Year(Date) - Year(GeburtsTag) > 65 Then
MsgBox "Rentner dürfen hier nicht rein!"
ElseIf Weekday(GeburtsTag, vbSunday) <> 1 Then
MsgBox "Sie sind kein Sonntagskind und können keine Elfen sehen"
Else
DiscoEinlass = True
End If
End Function
Select-Case-Verzweigung
BearbeitenBei mehr als zwei Bedingungen empfiehlt sich meist - wenn möglich - die Select-Case-Prüfung einzusetzen. Der vorliegende Fall wird eingelesen und danach schrittweise auf seinen Wahrheitsgehalt geprüft.
Sub PruefeFallMsg()
Select Case Weekday(Date)
Case 1, 7: MsgBox "Heute ist kein Arbeitstag"
Case 2: MsgBox "Heute ist Montag"
Case 3: MsgBox "Heute ist Dienstag"
Case 4: MsgBox "Heute ist Mittwoch"
Case 5: MsgBox "Heute ist Donnerstag"
Case 6: MsgBox "Heute ist Freitag"
End Select
End Sub
Sehr zweckmäßig ist die Select Anweisung auch, wenn man Optionsfelder in einem Formular (hier mit Objektbezeichner Me angesprochen) auswerten möchte. Dazu dreht man die Vergleichsbedingung um, so dass der konstante Teil des Vergleichs (hier True) hinter der Select Case Anweisung steht:
Sub ZeigeOption()
Select Case True
Case Me.Option1.Value: MsgBox "Option 1 gewählt"
Case Me.Option2.Value: MsgBox "Option 2 gewählt"
Case Me.Option3.Value: MsgBox "Option 3 gewählt"
Case Me.Option4.Value: MsgBox "Option 4 gewählt"
Case Else: MsgBox "Nichts gewählt"
End Select
End Sub
Sehr zweckmäßig ist die Select Anweisung auch, wenn man mehrere Bereiche zuordnen möchte, hierzu ist dies mit dem Operator "to" einfach möglich:
Sub Quartal()
Select Case Month(Date)
Case 1, 2, 3: Quartal = 1
Case 4 to 6: Quartal = 2
Case 7 to 9: Quartal = 3
Case 10 to 12: Quartal = 4
Case Else
MsgBox "Dieser Fall tritt nicht ein."
End Select
End Sub
Grundsätzlich sollte der häufigste Fall für eine Verzweigung mit der ersten CASE-Anweisung abgefangen werden, um die Laufzeit bei häufigen Aufrufen zu reduzieren.
Inline Verzweigungen mit IIf()
BearbeitenFür besonders einfache Fälle gibt es auch die Möglichkeit, Verzweigungen in einer Zeile zu erstellen. Die IIf() Funktion ist dabei das Pendant zur IF..Then..Else..End If Struktur. Die folgende Funktion baut einen Text mit einer IIf()-Funktion zusammen:
Public Function GeradeOderUngerade(Zahl As Long) As String
GeradeOderUngerade = "Die Zahl ist eine " & IIf(Zahl Mod 2 = 0, "gerade", "ungerade") & " Zahl"
End Function
Diese Form der Verzweigung hat zwei besondere Merkmale:
- Es muss für beide Antwortmöglichkeiten ein Ergebnis angegeben werden
- Die beiden Teile werden unabhängig vom Ergebnis des Vergleichs immer beide ausgeführt. Dies ist zu beachten, falls Funktionen aufgerufen werden.
Das folgende Beispiel illustriert das Problem:
Public Function Division(Dividend As Double, Divisor As Double) As Double
Division = IIf(Divisor = 0, 0, Dividend / Divisor)
End Function
Eigentlich sollte man im vorhergehenden Beispiel davon ausgehen, dass im Falle einer Division durch 0 (z.B. bei Aufruf von =Division(2,0) in einem Tabellenblatt) in dieser speziellen Funktion eine 0 zurückgegeben wird, statt dass ein Fehler die Ausführung unterbricht. Da aber stets alle Teile der IIf()-Verzweigung ausgeführt werden, probiert VBA auch die Division durch 0 und die ganze Funktion bricht mit einem Fehler ab.
Inline Verzweigungen mit Choose()
BearbeitenDas Inline Pendant zur Select Case Struktur ist die Choose() Funktion. Das folgende Beispiel zeigt, wie man in einer Zeile dem Datum einen Wochentag zuordnet:
Public Function Wochentag(Datum As Date) As String
Wochentag = Choose(Weekday(Datum, vbMonday), "Mo", "Di", "Mi", "Do", "Fr", "Sa", "So")
End Function
Hier gilt wie bei IIf(), dass alle Ausdrücke von VBA ausgeführt werden, egal wie das Ergebnis des Vergleichs ist.
Wann sollte welche Verzweigung gewählt werden?
BearbeitenDie vermutlich größte Schwierigkeit besteht, falls die Wahl zwischen IF..Then..ElseIf und Select Case besteht:
- Select Case setzt voraus, dass ein Ausdruck eines Vergleiches mit allen anderen verglichen wird, und der sollte in der Zeile mit Select Case auftauchen. Damit eignet es sich beispielsweise zur Abfrage von Optionsfeldern (siehe Beispiel oben), zur Abfrage von Bereichen oder wenn eine Funktion wie MsgBox mehr als zwei verschiedene Rückgabewerte hat.
- If..Then..ElseIf erlaubt es, völlig unterschiedliche Vergleiche auszuführen. If..Then..ElseIf eignet sich beispielsweise für Plausibilitätsabfragen am Anfang einer Funktion. Hier werden die Eingabedaten auf oft völlig unterschiedliche Kriterien geprüft, aber wenn nur eines erfüllt ist, gibt es eine spezielle Fehlermeldung.