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
- Schreiben Sie eine
Submit einemSelect Case-Block (wie oben), der anhand einer festgelegten Lagerzahl einen Status-String zuweist. - 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 mitDebug.Printaus. - Fügen Sie eine vierte Bedingung für genau 20 hinzu (das Nachbestellniveau der Tastatur) und prüfen Sie, welcher Case sie abfängt.
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 mitSelect Case stockLevelauswerten — die gleicheCase-Struktur wie im Beispiel aus Abschnitt 2.4 übernehmen (Case 0,Case 1 To 19,Case 20 To 49,Case Is > 50). - Jeder
Caseweiststatuseinen 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 desselbenSub, nacheinander. - Nach jeder Zuweisung zeigt
Debug.Print statusdas 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 19endet undCase 20 To 49beginnt — einer dieser beiden schließt die 20 bereits ein. - Da
Select Casebeim ersten Treffer stoppt, ändert das Hinzufügen einer separaten ZeileCase 20nur dann etwas, wenn sie vor dem Fall platziert wird, der sie sonst erfassen würde. - Mit
stockLevel = 20speziell ausführen und prüfen, welche Meldung ausgegeben wird — so erkennt man, welcherCasetatsächlich gegriffen hat, ohne überhaupt etwas Neues hinzufügen zu müssen.
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
Danke für Ihr Feedback!
Fragen Sie AI
Fragen Sie AI
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
- Schreiben Sie eine
Submit einemSelect Case-Block (wie oben), der anhand einer festgelegten Lagerzahl einen Status-String zuweist. - 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 mitDebug.Printaus. - Fügen Sie eine vierte Bedingung für genau 20 hinzu (das Nachbestellniveau der Tastatur) und prüfen Sie, welcher Case sie abfängt.
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 mitSelect Case stockLevelauswerten — die gleicheCase-Struktur wie im Beispiel aus Abschnitt 2.4 übernehmen (Case 0,Case 1 To 19,Case 20 To 49,Case Is > 50). - Jeder
Caseweiststatuseinen 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 desselbenSub, nacheinander. - Nach jeder Zuweisung zeigt
Debug.Print statusdas 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 19endet undCase 20 To 49beginnt — einer dieser beiden schließt die 20 bereits ein. - Da
Select Casebeim ersten Treffer stoppt, ändert das Hinzufügen einer separaten ZeileCase 20nur dann etwas, wenn sie vor dem Fall platziert wird, der sie sonst erfassen würde. - Mit
stockLevel = 20speziell ausführen und prüfen, welche Meldung ausgegeben wird — so erkennt man, welcherCasetatsächlich gegriffen hat, ohne überhaupt etwas Neues hinzufügen zu müssen.
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
Danke für Ihr Feedback!