Betinget logikk
Sveip for å vise menyen
Alt til nå har handlet om å lagre og teste verdier. Betinget logikk er der koden din faktisk begynner å ta avgjørelser — kjører én instruksjonsblokk i stedet for en annen, avhengig av resultatet fra testene.
If...Then
Den enkleste formen: kjør én handling, kun hvis én betingelse er oppfylt.
If currentStock < reorderLevel Then
MsgBox "Reorder needed!"
End If
If betingelsen er False, hopper VBA rett til det som kommer etter End If — ingenting skjer, og ingen feil oppstår.
If...ElseIf...Else
Håndterer flere enn to mulige utfall ved å kjede sammen betingelser:
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 sjekker disse fra topp til bunn og stopper ved den aller første betingelsen som er True — den sjekker aldri resten, selv om en senere betingelse også teknisk sett ville vært True. Dette er nettopp grunnen til at rekkefølgen er viktig: hvis currentStock er 0, fanges det opp av den første betingelsen (= 0) og status blir "Out of Stock" umiddelbart. Legg merke til at 0 også teknisk sett er mindre enn reorderLevel, så hvis linjen ElseIf currentStock < reorderLevel ble sjekket først, ville den feilaktig rapportert "Reorder Now" for en vare som er helt tom. Å sette den mest spesifikke, mest presserende betingelsen først — og kun falle tilbake på bredere betingelser etterpå — er det som får en slik kjede til å fungere riktig.
Select Case
Når du sjekker én enkelt variabel mot flere mulige faste verdier, sier Select Case det samme som en lang ElseIf-kjede, men er lettere å lese:
Select Case category
Case "Electronics"
discountRate = 0.05
Case "Office"
discountRate = 0.1
Case Else
discountRate = 0
End Select
Select Case håndterer også tallområder elegant, noe som er vanskeligere å lese som en kjede av 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 alle verdier fra 1 til og med 19; Case Is >= 50 bruker Is for å sammenligne mot variabelen som testes i stedet for et fast område.
Oppgave
- Skriv en
Submed enSelect Case-blokk (som eksempelet over) som tildeler en status-streng basert på et hardkodet lagerantall. - Test den tre ganger i samme
Subved å endre lagerverdien: prøv 0, 15 og 134, og skriv ut resultatet medDebug.Printhver gang. - Legg til en fjerde betingelse for nøyaktig 20 (Keyboard sitt reorder-nivå) og bekreft hvilken Case som fanger den opp.
1. Skrive Sub med Select Case
- Deklarer én variabel for å holde lagernummeret, og én for å holde den resulterende teksten (
status). - Tildel lager-variabelen en hardkodet verdi først (f.eks.
stockLevel = 0), og kjør den deretter gjennomSelect Case stockLevel— kopier sammeCase-struktur fra eksempel i seksjon 2.4 (Case 0,Case 1 To 19,Case 20 To 49,Case Is > 50). - Hver
Caseskal tildele en forskjellig tekstverdi tilstatus.
2. Teste tre verdier i én Sub
- Du trenger ikke tre separate prosedyrer — bare endre variabelens verdi, kjør
Select Case-blokken, skriv ut resultatet, endre verdien igjen og kjør den en gang til, alt inne i sammeSub, etter hverandre. - Etter hver tildeling vil
Debug.Print statusvise deg resultatet i Direkte-vinduet uten at noen popup-vinduer avbryter de andre to testene.
3. Legge til en case for akkurat 20
- Gå tilbake til det opprinnelige eksempelet i seksjon 2.4 og se nøye på hvor
Case 1 To 19slutter ogCase 20 To 49begynner — en av disse inkluderer allerede 20. - Siden
Select Casestopper ved første treff, vil det å legge til en egenCase 20-linje bare endre noe hvis du plasserer den før casen som ellers ville fanget den. - Kjør den med
stockLevel = 20spesielt og sjekk hvilken melding som skrives ut — det forteller deg hvilkenCasesom faktisk fanget den, uten at du trenger å legge til noe nytt i det hele tatt.
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
Takk for tilbakemeldingene dine!
Spør AI
Spør AI
Spør om hva du vil, eller prøv ett av de foreslåtte spørsmålene for å starte chatten vår
Betinget logikk
Alt til nå har handlet om å lagre og teste verdier. Betinget logikk er der koden din faktisk begynner å ta avgjørelser — kjører én instruksjonsblokk i stedet for en annen, avhengig av resultatet fra testene.
If...Then
Den enkleste formen: kjør én handling, kun hvis én betingelse er oppfylt.
If currentStock < reorderLevel Then
MsgBox "Reorder needed!"
End If
If betingelsen er False, hopper VBA rett til det som kommer etter End If — ingenting skjer, og ingen feil oppstår.
If...ElseIf...Else
Håndterer flere enn to mulige utfall ved å kjede sammen betingelser:
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 sjekker disse fra topp til bunn og stopper ved den aller første betingelsen som er True — den sjekker aldri resten, selv om en senere betingelse også teknisk sett ville vært True. Dette er nettopp grunnen til at rekkefølgen er viktig: hvis currentStock er 0, fanges det opp av den første betingelsen (= 0) og status blir "Out of Stock" umiddelbart. Legg merke til at 0 også teknisk sett er mindre enn reorderLevel, så hvis linjen ElseIf currentStock < reorderLevel ble sjekket først, ville den feilaktig rapportert "Reorder Now" for en vare som er helt tom. Å sette den mest spesifikke, mest presserende betingelsen først — og kun falle tilbake på bredere betingelser etterpå — er det som får en slik kjede til å fungere riktig.
Select Case
Når du sjekker én enkelt variabel mot flere mulige faste verdier, sier Select Case det samme som en lang ElseIf-kjede, men er lettere å lese:
Select Case category
Case "Electronics"
discountRate = 0.05
Case "Office"
discountRate = 0.1
Case Else
discountRate = 0
End Select
Select Case håndterer også tallområder elegant, noe som er vanskeligere å lese som en kjede av 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 alle verdier fra 1 til og med 19; Case Is >= 50 bruker Is for å sammenligne mot variabelen som testes i stedet for et fast område.
Oppgave
- Skriv en
Submed enSelect Case-blokk (som eksempelet over) som tildeler en status-streng basert på et hardkodet lagerantall. - Test den tre ganger i samme
Subved å endre lagerverdien: prøv 0, 15 og 134, og skriv ut resultatet medDebug.Printhver gang. - Legg til en fjerde betingelse for nøyaktig 20 (Keyboard sitt reorder-nivå) og bekreft hvilken Case som fanger den opp.
1. Skrive Sub med Select Case
- Deklarer én variabel for å holde lagernummeret, og én for å holde den resulterende teksten (
status). - Tildel lager-variabelen en hardkodet verdi først (f.eks.
stockLevel = 0), og kjør den deretter gjennomSelect Case stockLevel— kopier sammeCase-struktur fra eksempel i seksjon 2.4 (Case 0,Case 1 To 19,Case 20 To 49,Case Is > 50). - Hver
Caseskal tildele en forskjellig tekstverdi tilstatus.
2. Teste tre verdier i én Sub
- Du trenger ikke tre separate prosedyrer — bare endre variabelens verdi, kjør
Select Case-blokken, skriv ut resultatet, endre verdien igjen og kjør den en gang til, alt inne i sammeSub, etter hverandre. - Etter hver tildeling vil
Debug.Print statusvise deg resultatet i Direkte-vinduet uten at noen popup-vinduer avbryter de andre to testene.
3. Legge til en case for akkurat 20
- Gå tilbake til det opprinnelige eksempelet i seksjon 2.4 og se nøye på hvor
Case 1 To 19slutter ogCase 20 To 49begynner — en av disse inkluderer allerede 20. - Siden
Select Casestopper ved første treff, vil det å legge til en egenCase 20-linje bare endre noe hvis du plasserer den før casen som ellers ville fanget den. - Kjør den med
stockLevel = 20spesielt og sjekk hvilken melding som skrives ut — det forteller deg hvilkenCasesom faktisk fanget den, uten at du trenger å legge til noe nytt i det hele tatt.
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
Takk for tilbakemeldingene dine!