Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Oppiskele Ehtolauseet | VBA Fundamentals
Excel VBA Liiketoiminnan Automaatioon

Ehtolauseet

Pyyhkäise näyttääksesi valikon

Kaikki tähän asti on koskenut arvojen tallentamista ja testaamista. Ehdollinen logiikka on kohta, jossa koodisi alkaa tehdä päätöksiä — suorittaa yhden ohjeiston toisen sijaan riippuen siitä, mitä testit palauttavat.

If...Then

Yksinkertaisin muoto: suorita yksi toiminto vain, jos yksi ehto täyttyy.

If currentStock < reorderLevel Then
    MsgBox "Reorder needed!"
End If

Jos If-ehto on epätosi, VBA ohittaa suoraan kaiken, mikä tulee End If-rivillä — mitään ei tapahdu eikä virhettä synny.

If...ElseIf...Else

Käsittelee useampia mahdollisia lopputuloksia ketjuttamalla ehtoja:

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 tarkistaa nämä ylhäältä alas ja pysähtyy ensimmäiseen ehtoon, joka on True — se ei tarkista muita, vaikka myöhempikin ehto olisi teknisesti True. Juuri siksi järjestyksellä on väliä: jos currentStock on 0, ensimmäinen ehto (= 0) nappaa sen ja status on heti "Out of Stock". Huomaa, että 0 on myös teknisesti pienempi kuin reorderLevel, joten jos ElseIf currentStock < reorderLevel olisi ensin, se ilmoittaisi virheellisesti "Reorder Now" tuotteelle, jota ei ole lainkaan varastossa. Tarkimman ja kiireellisimmän ehdon asettaminen ensin — ja laajempien ehtojen käyttäminen vasta myöhemmin — saa tällaisen ketjun toimimaan oikein.

Select Case

Kun tarkistat yhtä muuttujaa useita mahdollisia kiinteitä arvoja vastaan, Select Case ilmaisee saman asian kuin pitkä ElseIf-ketju, mutta on selkeälukuinen:

Select Case category
    Case "Electronics"
        discountRate = 0.05
    Case "Office"
        discountRate = 0.1
    Case Else
        discountRate = 0
End Select

Select Case käsittelee myös lukuvälejä selkeästi, mikä on vaikeampaa lukea ElseIf-vertailujen ketjuna:

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 vastaa mitä tahansa arvoa väliltä 1–19 (molemmat mukaan lukien); Case Is >= 50 käyttää Is-sanaa vertaillakseen testattavaan muuttujaan kiinteän arvon sijaan.

Tehtävä

  1. Kirjoita Sub, jossa on Select Case -lohko (kuten yllä), joka asettaa tilan merkkijonon kovakoodatun varastomäärän perusteella.
  2. Testaa sitä kolme kertaa saman Sub-rutiinin sisällä vaihtamalla varastoarvoa: kokeile 0, 15 ja 134, tulostaen tulos Debug.Print -komennolla joka kerta.
  3. Lisää neljäs ehto tarkalleen arvolle 20 (Keyboardin tilausraja) ja varmista, mikä Case sen nappaa.
Vihje
expand arrow

1. Sub-proseduurin kirjoittaminen Select Case -rakenteella

  • Määrittele yksi muuttuja varastomäärälle ja toinen tulostekstille (status).
  • Anna varastomuuttujalle ensin kovakoodattu arvo (esim. stockLevel = 0), ja käsittele se sitten Select Case stockLevel -rakenteella — kopioi sama Case-rakenne kuin kohdassa 2.4 (Case 0, Case 1 To 19, Case 20 To 49, Case Is > 50).
  • Jokainen Case-haara asettaa eri tekstiarvon muuttujaan status.

2. Kolmen arvon testaaminen yhdessä Subissa

  • Et tarvitse kolmea erillistä proseduuria — muuta vain muuttujan arvoa, suorita Select Case-lohko, tulosta tulos, muuta arvo uudelleen ja suorita toinen kerta, kaikki saman Subin sisällä peräkkäin.
  • Jokaisen arvon asettamisen jälkeen Debug.Print status näyttää tuloksen Välitön-ikkunassa ilman, että muut testit keskeytyvät ponnahdusikkunoilla.

3. Tapauksen lisääminen tarkalleen arvolle 20

  • Palaa kohtaan 2.4 ja tarkastele, missä Case 1 To 19 päättyy ja Case 20 To 49 alkaa — toinen näistä sisältää jo arvon 20.
  • Koska Select Case pysähtyy ensimmäiseen osumaan, erillisen Case 20 -rivin lisääminen vaikuttaa vain, jos sijoitat sen ennen sitä tapausta, joka muuten ottaisi sen.
  • Suorita koodia arvolla stockLevel = 20 ja tarkista, mikä viesti tulostuu — näin näet, mikä Case sen oikeasti käsitteli, ilman että tarvitsee lisätä mitään uutta.
Ratkaisu
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
Oliko kaikki selvää?

Miten voimme parantaa sitä?

Kiitos palautteestasi!

Osio 2. Luku 4

Kysy tekoälyä

expand

Kysy tekoälyä

ChatGPT

Kysy mitä tahansa tai kokeile jotakin ehdotetuista kysymyksistä aloittaaksesi keskustelumme

Osio 2. Luku 4
some-alt