Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Lære Betinget Logik | VBA-Grundlæggende
Excel VBA til Forretningsautomatisering

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

  1. Skriv en Sub med en Select Case-blok (som ovenfor), der tildeler en status-streng baseret på et hardkodet lagerantal.
  2. Test den tre gange i samme Sub ved at ændre lager-værdien: prøv 0, 15 og 134, og udskriv resultatet med Debug.Print hver gang.
  3. Tilføj en fjerde betingelse for præcis 20 (Keyboard'ets genbestillingsniveau) og bekræft, hvilken Case der fanger den.
Tip
expand arrow

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 igennem Select Case stockLevel — kopiér samme Case-struktur fra eksempel i afsnit 2.4 (Case 0, Case 1 To 19, Case 20 To 49, Case Is > 50).
  • Hver Case skal tildele en forskellig tekstværdi til status.

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 samme Sub, én efter én.
  • Efter hver tildeling vil Debug.Print status vise 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 19 slutter og Case 20 To 49 begynder — en af de to inkluderer allerede 20.
  • Da Select Case stopper ved det første match, ændrer det kun noget at tilføje en separat Case 20-linje, hvis du placerer den før den case, der ellers ville fange den.
  • Kør det med stockLevel = 20 specifikt og tjek hvilken besked der udskrives — det fortæller dig, hvilken Case der faktisk fangede den, uden at du behøver tilføje noget nyt overhovedet.
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
Var alt klart?

Hvordan kan vi forbedre det?

Tak for dine kommentarer!

Sektion 2. Kapitel 4

Spørg AI

expand

Spørg AI

ChatGPT

Spørg om hvad som helst eller prøv et af de foreslåede spørgsmål for at starte vores chat

Sektion 2. Kapitel 4
some-alt