Etusivu Aloitus Kontrollit Metodit Muuttujat Ohjausrakenteet Silmukat Matematiikka Debuggaus Virheenkäsittely Vuorovaikutus Valikot Tiedostonkäsittely Ikkunat Leikepöytä Drag and Drop Tiedostopäätteet Linkkejä Harjoitukset

Johdanto ja tavoite

Tässä osiossa tutustutaan Visual Basic:in ohjausrakenteisiin. Tämän osion jälkeen opiskelija osaa lisätä omiin ohjelmiinsa ohjausrakenteita ja tätä myöten saa ohjelmansa toimimaan esim. käyttäjän syötteestä riippuen eri tavoin.

Ohjausrakenteet

Miksi tarvitsemme ohjausrakenteita? Yksi syy siihen on se, että jos meillä ei olisi mahdollisuutta vaikuttaa ohjelman kulkuun ohjausrakenteita käyttämällä, ohjelmamme toimisi aina samalla tavalla. Käyttämällä seuraavaksi esiteltäviä ohjausrakenteita voimme tehdä monipuolisempia ohjelmia.

If Then Else

Ehkäpä yleisin ohjausrakenne on If Then Else -rakenne. Alla on esitelty If -lauseen rakenne muodollisesti. Muista, että [] -merkkien sisällä oleva teksti ei ole pakollista. Huomaa kuitenkin, että sinulla voi olla vain yksi If -lause, jossa voi olla 0, 1 tai useampia Elseif -lauseita ja 0 tai 1 Else -lausetta. If Then Else -rakenne sopii tilanteisiin, jossa meillä on mutkikkaitakin ehtoja joiden perusteella haluamme haarauttaa ohjelmaamme (eli ehdoista riippuen suoritetaan erilaisia ohjelmakoodirivejä).
If ehto_1 Then
    suoritettava ohjelmakoodi 1
[Elseif ehto_2 Then
    suoritettava ohjelmakoodi 2]
[Elseif ehto_n Then
    suoritettava ohjelmakoodi n]
[Else
    suoritettava ohjelmakoodi n+1]
End If
Käytännössä edellisen "rimpsun" voi lukea siten, että If -lausetta käytettäessä If -lause on pakollinen, Elseif ja Else -lausekkeita voi käyttää halutessaan. Lähdetään pureutumaan lausekkeisiin esimerkkien kautta.
Private Sub Command1_Click()

    Dim X As Long

    X = 15

    If X = 15 Then
        MsgBox "X on viisitoista"
    End If

End Sub
Esimerkissämme määrittelemme muuttujan X ja annamme sille alkuarvon 15. Sitten seuraa varsinainen asia eli If -lause. Vertaamme If -lauseessa muuttujan X -arvoa lukuun 15. Tässä tapauksessa X:n arvo on 15, joten suoritamme If -lauseen sisällä olevan ohjelmakoodin.
Private Sub Command1_Click()

    Dim X As Long

    X = 3

    If X = 15 Then
        MsgBox "X on viisitoista"
    End If

End Sub
Edellisessä esimerkissä X:n arvo on 3, joten If -lause ei toteudu. Entäpä jos haluamme verrata useampaa kuin yhtä arvoa:
Private Sub Command1_Click()

    Dim X As Long

    X = 3

    If X = 15 OR X = 3 Then
        MsgBox "X on viisitoista tai kolme"
    End If

End Sub
Nyt tutkimme ensin onko X:n arvo viisitoista TAI onko X:n arvo kolme. No, X:n arvo on kolme, joten lause on totta (True) ja voimme suorittaa If -lauseen sisältämän ohjelmakoodin. Lisätietoja ehtojen yhdistämisestä täällä.
Private Sub Command1_Click()

    Dim X As Long

    X = 76

    If X = 15 OR X = 3 Then
        MsgBox "X on viisitoista tai kolme"
    Elseif X > 15 AND X < 50 Then
    	MsgBox "X on suurempi kuin 15 JA pienempi kuin 50"
    Elseif X > 50 Then
    	MsgBox "X on suurempi kuin 50"
    Else
        MsgBox "X on jotain muuta kuin edelliset ehdot"
    End If

End Sub
Viimeisessä If Then Else -esimerkissämme yhdistimme kaikki ominaisuudet eli käytimme If:iä, Elseif:iä ja Else:ä. Huomaa, että lausekkeiden järjestys on oltava edellä näytetty eli sinulla ei voi olla Else -lause esim. Elseif -lausekkeiden välissä.

Ehtojen yhdistäminen

Voit yhdistellä ehtolausekkeita käyttäen AND, OR, XOR, EQL, IMP tai NOT -sanoja. Ehtolauseissa taasen voit verrata käyttäen seuraavia vertailuoperaattoreita: =, <>, <, <=, > ja >=. Alla esimerkki vähän monimutkaisemmasta ehtolauseesta:
Private Sub Command1_Click()

    Dim X As Long
    Dim Y as Long

    X = 3
    Y = 6

    If (X = 15 OR X = 3) AND (Y > 1) Then
        MsgBox "X on oltava JOKO viisitoista TAI kolme JA Y on oltava suurempi kuin 1"
    End If

End Sub
Kuten ehkä huomasitkin, osa ehdoista on laitettu sulkujen sisään jotta ehtolausekkeita olisi helpompi ymmärtää.

Select Case

Select Case -sopii tilanteisiin, jossa halutaan haarauttaa ohjelma muuttujan parin erilaisen arvon perusteella. Formaali syntaksi on seuraavanlainen:
Select Case iMuuttuja
Case 1
    suoritettava ohjelmakoodi 1
[Case 2
    suoritettava ohjelmakoodi 2]
[Case 3 to 5
    suoritettava ohjelmakoodi 3]
[Case 6,7,8
    suoritettava ohjelmakoodi 5]
[Case Else
   suoritettava ohjelmakoodi 6]
End Select
Kun puramme edellä näytetyn formaalin määrittelyn, voimme ymmärtää sen siten, että meillä on oltava Select Case Muuttujan_nimi ja End Select -lauseet. Muuttujan_nimi -paikalla on tietysti verrattava muuttuja. Em. rivien sisällä on oltava vähintään yksi Case -rivi jonka sisältämä ohjelmakoodi suoritetaan JOS muuttujan arvo on sama kuin Case -rivin arvo(t). Voimme esittää Case -rivin arvo(n/t) eri tavoin, yksi tapa on esittää vain yksi arvo kuten Case 1 -kohdassa on tehty. Tässä tapauksessa rivin sisältämät ohjelmakoodirivit suoritetaan jos muuttujan arvo on 1. Toinen tapa on kertoa arvoalue kuten rivillä Case 3 to 5 on tehty, tässä tapauksessa jos muuttujan arvo on 3, 4 tai 5, suoritetaan ohjelmakoodirivit jotka kuuluvat em. Case -lauseen alle. Kolmas tapa on esitellä halutut arvot pilkulla eroteltuina. Viimeinen Case Select -ehdon sisältämä koodirivi suoritetaan jos yksikään edellä olleista Case -riveistä ei ollut toteutunut.
Private Sub Command1_Click()

    Dim X As Long

    X = 7

    Select Case X
        Case 0
            MsgBox "X on 0"

        Case 1 To 5
            MsgBox "X on 1, 2, 3, 4 tai 5"

        Case 6, 7, 8
            MsgBox "X on 6, 7 tai 8"

        Case Else
            MsgBox "X on jokin muu kuin 0-8"

    End Select

End Sub
Esimerkissämme määrittelimme muuttujan X alkuarvolla 7. Select Case X -rivi kertoo meille, että haluamme tutkia mikä X:n arvo oikein on. Koska X:n arvo on seitsemän, on oikea rivi Case 6, 7, 8 jonka seurauksena suoritamme rivin jälkeen olevan ohjelmakoodirivin MsgBox "X on 6, 7 tai 8".

Huom! Muista, että esimerkeissämme meillä on ollut vain yksi ohjelmakoodirivi ehtojen jälkeen. Ohjelmakoodirivejä voi olla kuitenkin lukematon määrä.

Tehtävä 13
Tehtävä 14