Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Lære Betinget logikk | VBA-grunnleggende
Excel VBA for Forretningsautomatisering

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

  1. Skriv en Sub med en Select Case-blokk (som eksempelet over) som tildeler en status-streng basert på et hardkodet lagerantall.
  2. Test den tre ganger i samme Sub ved å endre lagerverdien: prøv 0, 15 og 134, og skriv ut resultatet med Debug.Print hver gang.
  3. Legg til en fjerde betingelse for nøyaktig 20 (Keyboard sitt reorder-nivå) og bekreft hvilken Case som fanger den opp.
Tips
expand arrow

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 gjennom Select Case stockLevel — kopier samme Case-struktur fra eksempel i seksjon 2.4 (Case 0, Case 1 To 19, Case 20 To 49, Case Is > 50).
  • Hver Case skal tildele en forskjellig tekstverdi til status.

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 samme Sub, etter hverandre.
  • Etter hver tildeling vil Debug.Print status vise 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 19 slutter og Case 20 To 49 begynner — en av disse inkluderer allerede 20.
  • Siden Select Case stopper ved første treff, vil det å legge til en egen Case 20-linje bare endre noe hvis du plasserer den før casen som ellers ville fanget den.
  • Kjør den med stockLevel = 20 spesielt og sjekk hvilken melding som skrives ut — det forteller deg hvilken Case som faktisk fanget den, uten at du trenger å legge til noe nytt i det hele tatt.
Løsning
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
Alt var klart?

Hvordan kan vi forbedre det?

Takk for tilbakemeldingene dine!

Seksjon 2. Kapittel 4

Spør AI

expand

Spør AI

ChatGPT

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

  1. Skriv en Sub med en Select Case-blokk (som eksempelet over) som tildeler en status-streng basert på et hardkodet lagerantall.
  2. Test den tre ganger i samme Sub ved å endre lagerverdien: prøv 0, 15 og 134, og skriv ut resultatet med Debug.Print hver gang.
  3. Legg til en fjerde betingelse for nøyaktig 20 (Keyboard sitt reorder-nivå) og bekreft hvilken Case som fanger den opp.
Tips
expand arrow

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 gjennom Select Case stockLevel — kopier samme Case-struktur fra eksempel i seksjon 2.4 (Case 0, Case 1 To 19, Case 20 To 49, Case Is > 50).
  • Hver Case skal tildele en forskjellig tekstverdi til status.

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 samme Sub, etter hverandre.
  • Etter hver tildeling vil Debug.Print status vise 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 19 slutter og Case 20 To 49 begynner — en av disse inkluderer allerede 20.
  • Siden Select Case stopper ved første treff, vil det å legge til en egen Case 20-linje bare endre noe hvis du plasserer den før casen som ellers ville fanget den.
  • Kjør den med stockLevel = 20 spesielt og sjekk hvilken melding som skrives ut — det forteller deg hvilken Case som faktisk fanget den, uten at du trenger å legge til noe nytt i det hele tatt.
Løsning
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
Alt var klart?

Hvordan kan vi forbedre det?

Takk for tilbakemeldingene dine!

Seksjon 2. Kapittel 4
some-alt