Betinget Logik
Stryg for at vise menuen
Alt indtil nu har handlet om at gemme og teste værdier. Betinget logik er der, hvor din kode faktisk begynder at træffe beslutninger — kører én blok af instruktioner i stedet for en anden, afhængigt af hvad disse tests returnerer.
If...Then
Den simpleste form: udfør én handling, kun hvis én betingelse er opfyldt.
If currentStock < reorderLevel Then
MsgBox "Reorder needed!"
End If
If betingelsen er Falsk, springer VBA blot direkte til det, der kommer efter End If — intet sker, og der opstår ingen fejl.
If...ElseIf...Else
Håndterer mere end to mulige udfald ved at kæde betingelser sammen:
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 gennemgår disse fra toppen og stopper ved den allerførste betingelse, der er True — den tjekker aldrig resten, selvom en senere betingelse også teknisk set ville være True. Derfor er rækkefølgen vigtig: hvis currentStock er 0, fanger den første betingelse (= 0) det, og status bliver straks "Out of Stock". Bemærk, at 0 også teknisk set er mindre end reorderLevel, så hvis linjen ElseIf currentStock < reorderLevel blev tjekket først, ville den fejlagtigt rapportere "Reorder Now" for en vare, der er helt udsolgt. At placere den mest specifikke, mest presserende betingelse først — og kun falde tilbage på bredere betingelser bagefter — er det, der får en kæde som denne til at fungere korrekt.
Select Case
Når du tjekker én enkelt variabel mod flere mulige faste værdier, udtrykker Select Case det samme som en lang ElseIf-kæde, men det er mere overskueligt:
Select Case category
Case "Electronics"
discountRate = 0.05
Case "Office"
discountRate = 0.1
Case Else
discountRate = 0
End Select
Select Case håndterer også talintervaller elegant, hvilket er sværere at læse som en kæde af ElseIf-sammenligninger:
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 matcher enhver værdi fra 1 til og med 19; Case Is >= 50 bruger Is til at sammenligne med variablen, der testes, i stedet for et fast interval.
Opgave
- Skriv en
Submed enSelect Case-blok (som ovenfor), der tildeler en status-streng baseret på et hardkodet lagerantal. - Test den tre gange i samme
Subved at ændre lager-værdien: prøv 0, 15 og 134, og udskriv resultatet medDebug.Printhver gang. - Tilføj en fjerde betingelse for præcis 20 (Keyboard'ets genbestillingsniveau) og bekræft, hvilken Case der fanger den.
1. Skrivning af Sub med Select Case
- Deklarér én variabel til at holde varenummeret, og én til at holde den resulterende tekst (
status). - Tildel stock-variablen en hårdkodet værdi først (f.eks.
stockLevel = 0), og kør den derefter igennemSelect Case stockLevel— kopiér sammeCase-struktur fra eksempel i afsnit 2.4 (Case 0,Case 1 To 19,Case 20 To 49,Case Is > 50). - Hver
Caseskal tildele en forskellig tekstværdi tilstatus.
2. Test af tre værdier i én Sub
- Du behøver ikke tre separate procedurer — ændr blot variablens værdi, kør
Select Case-blokken, udskriv resultatet, og ændr derefter værdien igen og kør det en gang til, alt sammen i sammeSub, én efter én. - Efter hver tildeling vil
Debug.Print statusvise resultatet i Immediate-vinduet uden popups, der afbryder de andre to tests.
3. Tilføjelse af en case for præcis 20
- Gå tilbage til det oprindelige eksempel i afsnit 2.4 og se nøje på, hvor
Case 1 To 19slutter ogCase 20 To 49begynder — en af de to inkluderer allerede 20. - Da
Select Casestopper ved det første match, ændrer det kun noget at tilføje en separatCase 20-linje, hvis du placerer den før den case, der ellers ville fange den. - Kør det med
stockLevel = 20specifikt og tjek hvilken besked der udskrives — det fortæller dig, hvilkenCaseder faktisk fangede den, uden at du behøver tilføje noget nyt overhovedet.
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
Tak for dine kommentarer!
Spørg AI
Spørg AI
Spørg om hvad som helst eller prøv et af de foreslåede spørgsmål for at starte vores chat