TOP

VBA-Lektion 7.1. Bedingungen (Conditions)

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.


Wenn...Dann...Sonst

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
NOTNOT [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

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

Select Case

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