Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Lernen Bedingte Logik | VBA Fundamentals
Excel VBA für Geschäftsautomatisierung

Bedingte Logik

Swipe um das Menü anzuzeigen

Bisher ging es darum, Werte zu speichern und zu prüfen. Mit bedingter Logik beginnt Ihr Code, Entscheidungen zu treffen – es wird je nach Testergebnis ein Anweisungsblock ausgeführt, während ein anderer übersprungen wird.

If...Then

Die einfachste Form: Eine Aktion wird nur ausgeführt, wenn eine Bedingung erfüllt ist.

If currentStock < reorderLevel Then
    MsgBox "Reorder needed!"
End If

If die Bedingung falsch ist, überspringt VBA einfach alles bis nach End If – es passiert nichts und es tritt kein Fehler auf.

If...ElseIf...Else

Verarbeitet mehr als zwei mögliche Ergebnisse, indem Bedingungen verkettet werden:

If currentStock = 0 Then
    status = "Out of Stock"
ElseIf currentStock < reorderLevel Then
    status = "Reorder Now"
ElseIf currentStock < reorderLevel * 2 Then
    status = "Watch Closely"
Else
    status = "Healthy"
End If

VBA prüft diese Bedingungen von oben nach unten und hält bei der ersten, die True ergibt – die restlichen werden nicht mehr geprüft, selbst wenn sie technisch gesehen ebenfalls True wären. Deshalb ist die Reihenfolge entscheidend: Ist currentStock gleich 0, greift die erste Bedingung (= 0) und status wird sofort zu "Out of Stock". Beachten Sie, dass 0 auch kleiner als reorderLevel ist, sodass, wenn die Zeile ElseIf currentStock < reorderLevel zuerst geprüft würde, fälschlicherweise "Reorder Now" für einen komplett leeren Bestand ausgegeben würde. Die spezifischste, dringendste Bedingung sollte immer zuerst stehen – allgemeinere Bedingungen folgen danach. So funktioniert eine solche Kette korrekt.

Select Case

Wenn eine einzelne Variable mit mehreren festen Werten verglichen wird, drückt Select Case dasselbe wie eine lange ElseIf-Kette aus, ist aber übersichtlicher:

Select Case category
    Case "Electronics"
        discountRate = 0.05
    Case "Office"
        discountRate = 0.1
    Case Else
        discountRate = 0
End Select

Select Case verarbeitet auch Zahlenbereiche elegant, was als ElseIf-Kette schwerer lesbar wäre:

Select Case currentStock
    Case 0
        status = "Out of Stock"
    Case 1 To 19
        status = "Low"
    Case 20 To 49
        status = "Adequate"
    Case Is >= 50
        status = "Well Stocked"
End Select

Case 1 To 19 trifft auf alle Werte von 1 bis einschließlich 19 zu; Case Is >= 50 verwendet Is, um gegen die geprüfte Variable statt einen festen Bereich zu vergleichen.

Aufgabe

  1. Schreiben Sie eine Sub mit einem Select Case-Block (wie oben), der anhand einer festgelegten Lagerzahl einen Status-String zuweist.
  2. Testen Sie diese dreimal innerhalb derselben Sub, indem Sie den Lagerwert ändern: Probieren Sie 0, 15 und 134 aus und geben Sie das Ergebnis jeweils mit Debug.Print aus.
  3. Fügen Sie eine vierte Bedingung für genau 20 hinzu (das Nachbestellniveau der Tastatur) und prüfen Sie, welcher Case sie abfängt.
Hinweis
expand arrow

1. Schreiben des Sub mit Select Case

  • Eine Variable deklarieren, um die Lagerbestandsnummer zu speichern, und eine weitere für den resultierenden Text (status).
  • Der Lagerbestandsvariable zunächst einen festen Wert zuweisen (z. B. stockLevel = 0), dann mit Select Case stockLevel auswerten — die gleiche Case-Struktur wie im Beispiel aus Abschnitt 2.4 übernehmen (Case 0, Case 1 To 19, Case 20 To 49, Case Is > 50).
  • Jeder Case weist status einen anderen Textwert zu.

2. Drei Werte in einem Sub testen

  • Es sind keine drei separaten Prozeduren nötig — einfach den Wert der Variable ändern, den Select Case-Block ausführen, das Ergebnis ausgeben, dann den Wert erneut ändern und ein zweites Mal ausführen, alles innerhalb desselben Sub, nacheinander.
  • Nach jeder Zuweisung zeigt Debug.Print status das Ergebnis im Direktfenster an, ohne dass Popups die anderen beiden Tests unterbrechen.

3. Einen Fall für genau 20 hinzufügen

  • Zum ursprünglichen Beispiel aus Abschnitt 2.4 zurückkehren und genau darauf achten, wo Case 1 To 19 endet und Case 20 To 49 beginnt — einer dieser beiden schließt die 20 bereits ein.
  • Da Select Case beim ersten Treffer stoppt, ändert das Hinzufügen einer separaten Zeile Case 20 nur dann etwas, wenn sie vor dem Fall platziert wird, der sie sonst erfassen würde.
  • Mit stockLevel = 20 speziell ausführen und prüfen, welche Meldung ausgegeben wird — so erkennt man, welcher Case tatsächlich gegriffen hat, ohne überhaupt etwas Neues hinzufügen zu müssen.
Lösung
expand arrow
Sub ClassifyStockLevels()
    Dim stockLevel As Integer
    Dim status As String

    ' --- Test 1 ---
    stockLevel = 0
    Select Case stockLevel
        Case 0
            status = "Out of Stock"
        Case 20
            status = "Exactly at Reorder Level"
        Case 1 To 19
            status = "Low"
        Case 20 To 49
            status = "Adequate"
        Case Is > 50
            status = "Well Stocked"
    End Select
    Debug.Print stockLevel & " -> " & status

    ' --- Test 2 ---
    stockLevel = 15
    Select Case stockLevel
        Case 0
            status = "Out of Stock"
        Case 20
            status = "Exactly at Reorder Level"
        Case 1 To 19
            status = "Low"
        Case 20 To 49
            status = "Adequate"
        Case Is > 50
            status = "Well Stocked"
    End Select
    Debug.Print stockLevel & " -> " & status

    ' --- Test 3 ---
    stockLevel = 134
    Select Case stockLevel
        Case 0
            status = "Out of Stock"
        Case 20
            status = "Exactly at Reorder Level"
        Case 1 To 19
            status = "Low"
        Case 20 To 49
            status = "Adequate"
        Case Is > 50
            status = "Well Stocked"
    End Select
    Debug.Print stockLevel & " -> " & status

    ' --- Test 4: exactly 20 ---
    stockLevel = 20
    Select Case stockLevel
        Case 0
            status = "Out of Stock"
        Case 20
            status = "Exactly at Reorder Level"
        Case 1 To 19
            status = "Low"
        Case 20 To 49
            status = "Adequate"
        Case Is > 50
            status = "Well Stocked"
    End Select
    Debug.Print stockLevel & " -> " & status
End Sub
War alles klar?

Wie können wir es verbessern?

Danke für Ihr Feedback!

Abschnitt 2. Kapitel 4

Fragen Sie AI

expand

Fragen Sie AI

ChatGPT

Fragen Sie alles oder probieren Sie eine der vorgeschlagenen Fragen, um unser Gespräch zu beginnen

Bedingte Logik

Bisher ging es darum, Werte zu speichern und zu prüfen. Mit bedingter Logik beginnt Ihr Code, Entscheidungen zu treffen – es wird je nach Testergebnis ein Anweisungsblock ausgeführt, während ein anderer übersprungen wird.

If...Then

Die einfachste Form: Eine Aktion wird nur ausgeführt, wenn eine Bedingung erfüllt ist.

If currentStock < reorderLevel Then
    MsgBox "Reorder needed!"
End If

If die Bedingung falsch ist, überspringt VBA einfach alles bis nach End If – es passiert nichts und es tritt kein Fehler auf.

If...ElseIf...Else

Verarbeitet mehr als zwei mögliche Ergebnisse, indem Bedingungen verkettet werden:

If currentStock = 0 Then
    status = "Out of Stock"
ElseIf currentStock < reorderLevel Then
    status = "Reorder Now"
ElseIf currentStock < reorderLevel * 2 Then
    status = "Watch Closely"
Else
    status = "Healthy"
End If

VBA prüft diese Bedingungen von oben nach unten und hält bei der ersten, die True ergibt – die restlichen werden nicht mehr geprüft, selbst wenn sie technisch gesehen ebenfalls True wären. Deshalb ist die Reihenfolge entscheidend: Ist currentStock gleich 0, greift die erste Bedingung (= 0) und status wird sofort zu "Out of Stock". Beachten Sie, dass 0 auch kleiner als reorderLevel ist, sodass, wenn die Zeile ElseIf currentStock < reorderLevel zuerst geprüft würde, fälschlicherweise "Reorder Now" für einen komplett leeren Bestand ausgegeben würde. Die spezifischste, dringendste Bedingung sollte immer zuerst stehen – allgemeinere Bedingungen folgen danach. So funktioniert eine solche Kette korrekt.

Select Case

Wenn eine einzelne Variable mit mehreren festen Werten verglichen wird, drückt Select Case dasselbe wie eine lange ElseIf-Kette aus, ist aber übersichtlicher:

Select Case category
    Case "Electronics"
        discountRate = 0.05
    Case "Office"
        discountRate = 0.1
    Case Else
        discountRate = 0
End Select

Select Case verarbeitet auch Zahlenbereiche elegant, was als ElseIf-Kette schwerer lesbar wäre:

Select Case currentStock
    Case 0
        status = "Out of Stock"
    Case 1 To 19
        status = "Low"
    Case 20 To 49
        status = "Adequate"
    Case Is >= 50
        status = "Well Stocked"
End Select

Case 1 To 19 trifft auf alle Werte von 1 bis einschließlich 19 zu; Case Is >= 50 verwendet Is, um gegen die geprüfte Variable statt einen festen Bereich zu vergleichen.

Aufgabe

  1. Schreiben Sie eine Sub mit einem Select Case-Block (wie oben), der anhand einer festgelegten Lagerzahl einen Status-String zuweist.
  2. Testen Sie diese dreimal innerhalb derselben Sub, indem Sie den Lagerwert ändern: Probieren Sie 0, 15 und 134 aus und geben Sie das Ergebnis jeweils mit Debug.Print aus.
  3. Fügen Sie eine vierte Bedingung für genau 20 hinzu (das Nachbestellniveau der Tastatur) und prüfen Sie, welcher Case sie abfängt.
Hinweis
expand arrow

1. Schreiben des Sub mit Select Case

  • Eine Variable deklarieren, um die Lagerbestandsnummer zu speichern, und eine weitere für den resultierenden Text (status).
  • Der Lagerbestandsvariable zunächst einen festen Wert zuweisen (z. B. stockLevel = 0), dann mit Select Case stockLevel auswerten — die gleiche Case-Struktur wie im Beispiel aus Abschnitt 2.4 übernehmen (Case 0, Case 1 To 19, Case 20 To 49, Case Is > 50).
  • Jeder Case weist status einen anderen Textwert zu.

2. Drei Werte in einem Sub testen

  • Es sind keine drei separaten Prozeduren nötig — einfach den Wert der Variable ändern, den Select Case-Block ausführen, das Ergebnis ausgeben, dann den Wert erneut ändern und ein zweites Mal ausführen, alles innerhalb desselben Sub, nacheinander.
  • Nach jeder Zuweisung zeigt Debug.Print status das Ergebnis im Direktfenster an, ohne dass Popups die anderen beiden Tests unterbrechen.

3. Einen Fall für genau 20 hinzufügen

  • Zum ursprünglichen Beispiel aus Abschnitt 2.4 zurückkehren und genau darauf achten, wo Case 1 To 19 endet und Case 20 To 49 beginnt — einer dieser beiden schließt die 20 bereits ein.
  • Da Select Case beim ersten Treffer stoppt, ändert das Hinzufügen einer separaten Zeile Case 20 nur dann etwas, wenn sie vor dem Fall platziert wird, der sie sonst erfassen würde.
  • Mit stockLevel = 20 speziell ausführen und prüfen, welche Meldung ausgegeben wird — so erkennt man, welcher Case tatsächlich gegriffen hat, ohne überhaupt etwas Neues hinzufügen zu müssen.
Lösung
expand arrow
Sub ClassifyStockLevels()
    Dim stockLevel As Integer
    Dim status As String

    ' --- Test 1 ---
    stockLevel = 0
    Select Case stockLevel
        Case 0
            status = "Out of Stock"
        Case 20
            status = "Exactly at Reorder Level"
        Case 1 To 19
            status = "Low"
        Case 20 To 49
            status = "Adequate"
        Case Is > 50
            status = "Well Stocked"
    End Select
    Debug.Print stockLevel & " -> " & status

    ' --- Test 2 ---
    stockLevel = 15
    Select Case stockLevel
        Case 0
            status = "Out of Stock"
        Case 20
            status = "Exactly at Reorder Level"
        Case 1 To 19
            status = "Low"
        Case 20 To 49
            status = "Adequate"
        Case Is > 50
            status = "Well Stocked"
    End Select
    Debug.Print stockLevel & " -> " & status

    ' --- Test 3 ---
    stockLevel = 134
    Select Case stockLevel
        Case 0
            status = "Out of Stock"
        Case 20
            status = "Exactly at Reorder Level"
        Case 1 To 19
            status = "Low"
        Case 20 To 49
            status = "Adequate"
        Case Is > 50
            status = "Well Stocked"
    End Select
    Debug.Print stockLevel & " -> " & status

    ' --- Test 4: exactly 20 ---
    stockLevel = 20
    Select Case stockLevel
        Case 0
            status = "Out of Stock"
        Case 20
            status = "Exactly at Reorder Level"
        Case 1 To 19
            status = "Low"
        Case 20 To 49
            status = "Adequate"
        Case Is > 50
            status = "Well Stocked"
    End Select
    Debug.Print stockLevel & " -> " & status
End Sub
War alles klar?

Wie können wir es verbessern?

Danke für Ihr Feedback!

Abschnitt 2. Kapitel 4
some-alt