Villkorslogik
Svep för att visa menyn
Allt hittills har handlat om att lagra och testa värden. Villkorslogik är där din kod faktiskt börjar fatta beslut — kör en instruktion istället för en annan, beroende på vad dessa tester ger för resultat.
If...Then
Den enklaste formen: kör en åtgärd, endast om ett villkor uppfylls.
If currentStock < reorderLevel Then
MsgBox "Reorder needed!"
End If
Om If-villkoret är False, hoppar VBA helt enkelt vidare till det som kommer efter End If — ingenting händer och inget fel uppstår.
If...ElseIf...Else
Hantera fler än två möjliga utfall genom att kedja villkor:
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 kontrollerar dessa uppifrån och ner och stannar vid det första villkoret som är True — den kontrollerar aldrig resten, även om ett senare villkor också tekniskt sett skulle vara True. Det är därför ordningen är viktig: om currentStock är 0, fångar det första villkoret (= 0) det och status blir "Out of Stock" direkt. Observera att 0 också tekniskt sett är mindre än reorderLevel, så om raden ElseIf currentStock < reorderLevel kontrollerades först, skulle det felaktigt rapportera "Reorder Now" för en vara som är helt slut. Att sätta det mest specifika, mest akuta villkoret först — och bara falla tillbaka på bredare villkor därefter — är det som gör att en sådan kedja fungerar korrekt.
Select Case
När du kontrollerar en enda variabel mot flera möjliga fasta värden, uttrycker Select Case samma sak som en lång ElseIf-kedja men är tydligare att läsa:
Select Case category
Case "Electronics"
discountRate = 0.05
Case "Office"
discountRate = 0.1
Case Else
discountRate = 0
End Select
Select Case hanterar också intervall av tal på ett elegant sätt, vilket är svårare att läsa som en kedja av ElseIf-jämförelser:
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 matchar alla värden från 1 till och med 19; Case Is >= 50 använder Is för att jämföra mot variabeln som testas istället för ett fast intervall.
Uppgift
- Skriv en
Submed ettSelect Case-block (som exemplet ovan) som tilldelar en status-sträng baserat på ett hårdkodat lagersaldo. - Testa den tre gånger i samma
Subgenom att ändra lagervärdet: prova 0, 15 och 134, och skriv ut resultatet medDebug.Printvarje gång. - Lägg till ett fjärde villkor för exakt 20 (Keyboard's reorder level) och bekräfta vilket Case som fångar det.
1. Skriva Sub med Select Case
- Deklarera en variabel för att lagra lagernumret och en för att lagra den resulterande texten (
status). - Tilldela lager-variabeln ett hårdkodat värde först (t.ex.
stockLevel = 0), kör sedan den genomSelect Case stockLevel— kopiera sammaCase-struktur från exempel i avsnitt 2.4 (Case 0,Case 1 To 19,Case 20 To 49,Case Is > 50). - Varje
Caseska tilldela ett annat textvärde tillstatus.
2. Testa tre värden i en Sub
- Du behöver inte tre separata procedurer — ändra bara variabelns värde, kör
Select Case-blocket, skriv ut resultatet, ändra värdet igen och kör det en andra gång, allt i sammaSub, efter varandra. - Efter varje tilldelning visar
Debug.Print statusresultatet i Direktfönstret utan att några popup-fönster avbryter de andra två testerna.
3. Lägga till ett case för exakt 20
- Gå tillbaka till det ursprungliga exemplet i avsnitt 2.4 och titta noga på var
Case 1 To 19slutar ochCase 20 To 49börjar — en av dessa inkluderar redan 20. - Eftersom
Select Casestannar vid den första matchen, ändrar en separatCase 20-rad bara något om du placerar den före det case som annars skulle fånga det. - Kör med
stockLevel = 20specifikt och kontrollera vilket meddelande som skrivs ut — det visar vilketCasesom faktiskt fångade det, utan att du behöver lägga till något nytt alls.
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
Tack för dina kommentarer!
Fråga AI
Fråga AI
Fråga vad du vill eller prova någon av de föreslagna frågorna för att starta vårt samtal