Bedingungen sind beim Programmieren sehr nützlich, da sie es uns ermöglichen, Aktionen abhängig von festgelegten Kriterien auszuführen (es wird das gleiche Prinzip wie in der Funktion IF Excel verwendet).
Die VBA If...Then...Else-Anweisung führt eine Reihe von Anweisungen aus, abhängig davon, ob die angegebene Bedingung wahr ist oder nicht. Wenn die Bedingung (logischer Test) erfüllt ist, wird eine Reihe von Aktionen ausgeführt. Wenn die Bedingung jedoch falsch ist, wird eine alternative Reihe von Aktionen ausgeführt.
Aus Gründen der Lesbarkeit können Sie jedoch die Select Case-Anweisung anstelle mehrerer Ebenen verschachtelter If...Then...Else-Anweisungen verwenden.
Die wichtigste Funktion, die die Bedingung festlegt, ist also IF und jetzt sehen wir uns an, wie sie funktioniert:
If [Begriff HIER] Then '=> WENN die Bedingung wahr ist, DANN 'Anweisungen, wenn „wahr“ Else '=> SONST 'Anweisungen, wenn „lügen“ End If
Lassen Sie uns praktischer werden und zu dem Beispiel zurückkehren, das wir in der Variablenlektion verwendet haben. Der Zweck dieser Prozedur bestand darin, ein Dialogfeld anzuzeigen, das den Wert aus der in Zelle F5 angegebenen Zeichenfolge anzeigt:
Wenn Sie einen Buchstaben in die F5-Zelle eingeben, wird ein Fehler verursacht. Das wollen wir verhindern.
Sub variables() 'Deklaration von Variablen Dim last_name As String, first_name As String, age As Integer, row_number As Integer 'Variablen Werte zuweisen row_number = Range("F5") + 1 last_name = Cells(row_number, 1) first_name = Cells(row_number, 2) age = Cells(row_number, 3) 'Dialogbox MsgBox last_name & " " & first_name & ", " & age & "Jahre" End Sub
Fügen wir eine Bedingung hinzu, die prüft, ob der in Zelle F5 eingegebene Wert eine Zahl ist, bevor der Code ausgeführt wird.
Wir werden die Funktion IsNumeric verwenden, um die Bedingung zu testen:
Sub variables() 'Wenn der Wert in Klammern (Zelle F5) numerisch ist (daher ist die IF-BEDINGUNG TRUE), dann 'Führen Sie die Anweisungen aus, die DANN folgen If IsNumeric(Range("F5")) Then 'Deklaration von Variablen Dim last_name As String, first_name As String, age As Integer, row_number As Integer 'Variablen Werte zuweisen row_number = Range("F5") + 1 last_name = Cells(row_number, 1) first_name = Cells(row_number, 2) age = Cells(row_number, 3) 'Dialogbox MsgBox last_name & " " & first_name & ", " & age & "Jahre" End If End Sub
Wir müssen auch Anweisungen schreiben, wenn die von uns festgelegte Bedingung nicht erfüllt ist:
Sub variables() If IsNumeric(Range("F5")) Then 'Wenn die Bedingung erfüllt ist 'Deklaration von Variablen Dim last_name As String, first_name As String, age As Integer, row_number As Integer 'Variablen Werte zuweisen row_number = Range("F5") + 1 last_name = Cells(row_number, 1) first_name = Cells(row_number, 2) age = Cells(row_number, 3) 'Dialogbox MsgBox last_name & " " & first_name & ", " & age & "Jahre" Else 'Wenn die Bedingung nicht erfüllt ist 'Dialogfeld: Warnung MsgBox "Eingegebener Wert" & Range("F5") & "ist nicht wahr!" 'Löschen Sie den Inhalt der Zelle F5 Range("F5").ClearContents End If End Sub
Jetzt verursacht ein nicht numerischer Wert keine Probleme mehr.
Wenn wir mit unserem Array arbeiten, das 16 Datenzeilen enthält, prüfen wir als Nächstes, ob die Variable row_number „größer oder gleich 2“ und „kleiner oder gleich 17“ ist.
Schauen wir uns aber zunächst die Vergleichsoperatoren an:
= | Exakt |
<> | nicht genau |
< | weniger als |
<= | Gleich oder kleiner als |
> | mehr als |
>= | größer als oder gleich wie |
und diese nützlichen Operatoren:
AND | [Bedingung1] AND [Bedingung2] Es müssen zwei Bedingungen erfüllt sein |
OR | [Bedingung1] OR [Bedingung2] Dass mindestens eine der beiden Bedingungen erfüllt sein muss |
NOT | NOT [condition1] Die Bedingung darf nicht erfüllt sein |
Fügen wir nun eine der oben genannten AND-Bedingungen zwischen den Vergleichsoperatoren hinzu:
Sub variables() If IsNumeric(Range("F5")) Then 'Wenn es sich um einen numerischen Wert handelt Dim last_name As String, first_name As String, age As Integer, row_number As Integer row_number = Range("F5") + 1 If row_number >= 2 And row_number <= 17 Then 'Wenn die richtige Nummer last_name = Cells(row_number, 1) first_name = Cells(row_number, 2) age = Cells(row_number, 3) MsgBox last_name & " " & first_name & ", " & age & "Jahre" Else 'Wenn die Nummer nicht korrekt ist MsgBox "Eingegebene Nummer" & Range("F5") & "das ist nicht richtig!" Range("F5").ClearContents End If Else 'Wenn es sich nicht um einen numerischen Wert handelt MsgBox "Eingegebener Wert" & Range("F5") & "ist nicht wahr!" Range("F5").ClearContents End If End Sub
Wenn wir unser Makro praktischer gestalten möchten, können wir 17 durch eine Variable ersetzen, die die Anzahl der Zeilen enthält. Dies würde es uns ermöglichen, Zeilen zum Array hinzuzufügen und daraus zu entfernen, ohne dieses Limit jedes Mal ändern zu müssen.
Dazu müssen wir eine Variable nb_rows erstellen und diese Funktion hinzufügen.
In diesem Fall verwenden wir die Funktion WorksheetFunction.CountA, die analog zur COUNTA-Funktion in Excel selbst ist.
Wir möchten, dass diese Funktion die Anzahl der nicht leeren Zellen in der ersten Spalte zählt und den resultierenden Wert in die Variable nb_rows schreibt:
Sub variables() If IsNumeric(Range("F5")) Then 'WENN NUMMER Dim last_name As String, first_name As String, age As Integer, row_number As Integer Dim nb_rows As Integer row_number = Range("F5") + 1 nb_rows = WorksheetFunction.CountA(Range("A:A")) 'Die Funktion zum Zählen der Anzahl der Zeilen If row_number >= 2 And row_number <= nb_rows Then 'WENN GÜLTIGE NUMMER last_name = Cells(row_number, 1) first_name = Cells(row_number, 2) age = Cells(row_number, 3) MsgBox last_name & " " & first_name & ", " & age & "Jahre" Else 'WENN DIE NUMMER FALSCH IST MsgBox "Eingegebene Nummer" & Range("F5") & "das ist nicht richtig!" Range("F5").ClearContents End If Else 'WENN NICHT NUMMER MsgBox "Eingegebener Wert" & Range("F5") & "ist nicht wahr!" Range("F5").ClearContents End If End Sub
ElseIf ermöglicht das Hinzufügen zusätzlicher Bedingungen nach dem Befehl IF:
If [BEDINGUNG 1] Then '=> WENN Bedingung 1 wahr ist, DANN 'Anleitung 1 ElseIf [BEDINGUNG 2] Then '=> WENN Bedingung 1 falsch ist, Bedingung 2 jedoch wahr ist, DANN 'Anleitung 2 Else '=> SONST 'Anleitung 3 End If
Wenn BEDINGUNG 1 wahr ist, führt Anweisung 1 die IF-Anweisung aus und beendet sie (die mit IF beginnt und mit End If endet). Wenn BEDINGUNG 2 „falsch“ zurückgibt, wird Anweisung 2 ausgeführt, und wenn sie „falsch“ zurückgibt, wird Anweisung 3 (unter „Else“) ausgeführt.
Hier ist ein Beispiel mit den Noten 1 bis 6 in Zelle A1 und einem Kommentar zu diesen Noten in Zelle B1:
Sub scores_comment() 'Variablen Dim note As Integer, score_comment As String note = Range("A1") 'Kommentare basierend auf der erhaltenen Punktzahl If note = 6 Then score_comment = "Tolle Punktzahl!" ElseIf note = 5 Then score_comment = "Guter Punkt" ElseIf note = 4 Then score_comment = "Zufriedenstellende Punktzahl" ElseIf note = 3 Then score_comment = "Unbefriedigende Bewertung" ElseIf note = 2 Then score_comment = "Schlechtes Ergebnis" ElseIf note = 1 Then score_comment = "Schreckliches Ergebnis" Else score_comment = "Null Punktestand" End If 'Kommentar in Zelle B1 Range("B1") = score_comment End Sub
Es gibt eine Alternative zur Verwendung von If mit vielen ElseIf-Anweisungen, nämlich den Befehl Select Case, der für diese Art von Situation besser geeignet ist.
Betrachten Sie ein Beispiel für ein Makro mit dem Operator Select Case:
Sub scores_comment() 'Variablen Dim note As Integer, score_comment As String note = Range("A1") 'Kommentare basierend auf der erhaltenen Punktzahl Select Case note '=> Testergebnis (Punkte) Case Is = 6 '=> wenn Wert = 6 score_comment = "Tolle Punktzahl!" Case Is = 5 '=> wenn Wert = 5 score_comment = "Guter Punkt" Case Is = 4 '=> wenn Wert = 4 score_comment = "Zufriedenstellende Punktzahl" Case Is = 3 '=> wenn Wert = 3 score_comment = "Unbefriedigende Bewertung" Case Is = 2 '=> wenn Wert = 2 score_comment = "Schlechtes Ergebnis" Case Is = 1 '=> wenn Wert = 1 score_comment = "Schreckliches Ergebnis" Case Else '=> wenn der Wert keinem der oben genannten entspricht score_comment = "Null Punktestand" End Select 'Kommentar in Zelle B1 Range("B1") = score_comment End Sub
Es ist erwähnenswert, dass wir auch andere Vergleichsoperatoren verwenden könnten:
Case Is >= 6 'wenn Wert >= 6
Beispiele mit unterschiedlicher Bedeutung:
Case Is = 6, 7 'wenn Wert = 6 oder 7 Case Is <> 6, 7 'wenn der Wert ungleich 6 oder 7 ist
Case 6 To 10 'wenn Wert = eine beliebige Zahl von 6 bis 10