Attribute VB_Name = "Module1" 'Kuten todettu, funktio osaa palauttaa ainoastaan yhden vastauksen. 'Kun vastauksia halutaan useampia, kannattaa miettiä parametrien välitystä ByRef-tyyppisesti. 'Tällöin aliohjelmassa parametreihin tehdyt muutokset välittyvät kutsujalle. 'Otetaan tästä esimerkiksi vaikka tilanne, ' jossa merkkijonosta pitäisi laskea siinä olevien kirjainten, numeroiden ja erikoismerkkien määrä. 'Jokaisesta näistä haluttaisiin siis oma vastauksensa. 'Kun aliohjelma suoritettaisiin vaikka merkkijonolla ”abc+12=n/a”, ' vastaukseksi haluttaisiin ”5 kirjainta, 2 numeroa ja 3 erikoismerkkiä”. 'Jotta ei jouduttaisi kirjoittamaan kolmea funktiota, ' tehdäänkin tästä proseduuri, jossa osa parametreista välitetään viittauksena. Private Sub MerkkiLaskuri(ByVal MJono As String, _ ByRef KplK As Long, ByRef KplN As Long, _ ByRef KplM As Long) 'Funktiossa MerkkiLaskuri on määritelty neljä parametria. 'Näistä MJono-parametrilla välitetään käsiteltävä merkkijono. ' 'Tämä parametri on välitetty arvon mukaisesti, joten se on aliohjelmassa erillinen muuttuja. 'Parametrit KplK, KplN ja KplM sen sijaan on määritelty käytettäväksi viittaustyyppisenä, ' joten näillä parametreilla voidaan välittää vastaus kutsuvalle aliohjelmalle. 'Aliohjelman MerkkiLaskuri rakenteessa ei sinällään ole mitään erikoista. 'Kaikki rakenteet ovat jo tässä vaiheessa tuttuja, ainakin niille lukijoille, jotka lukivat edellisen jakson Ohjausrakenteet. 'Proseduurissa on yksi iso silmukka, joka alkaa riviltä 5 ja päättyy riville 14. 'Silmukkarakenne huolehtii siitä, että merkkijono tulee käytyä läpi kukin positio kerrallaan. 'Silmukan sisällä on yksi iso ehtolause, jossa tarkistetaan merkkijonon käsiteltävässä positiossa oleva merkki. 'Jos se on kirjain, rivin 6 ehtolause toteutuu, ja lisätään KplK-muuttujaan yksi. 'Jos se on numero, ElseIf-ehto rivillä 8 toteutuu, ja tällöin kasvatetaan KplN-muuttujan arvoa yhdellä. 'Jos kumpikaan näistä ei toteudu, oletetaan että kyseessä on erikoismerkki, jolloin yksi lisätään KplM-muuttujaan. Dim MJonoL As Long Dim Pos As Long MJonoL = Len(MJono) Pos = 1 Do While Pos <= MJonoL If UCase(Mid(MJono, Pos, 1)) >= "A" And _ UCase(Mid(MJono, Pos, 1)) <= "Z" Then KplK = KplK + 1 ElseIf (Mid(MJono, Pos, 1) >= "0") And _ (Mid(MJono, Pos, 1) <= "9") Then KplN = KplN + 1 Else KplM = KplM + 1 End If Pos = Pos + 1 Loop End Sub Sub TestaaMerkkiLaskuri() 'Aliohjelmalla TestaaMerkkiLaskuri voidaan testata MerkkiLaskuri-proseduurin toiminnallisuutta. 'Parametrit L1, L2 ja L3 välitetään tässä esimerkissä viittauksen mukaisesti, ' joten jokainen muutos muuttujiin KplK, KplN ja KplM aliohjelmassa MerkkiLaskuri vaikuttaa näiden muuttujien arvoon. 'Muuttujat toimivat ikäänkuin pareittain, ja teknisesti ajatellen ne viittaavatkin samaan muistipaikkaan. Dim M As String Dim L1 As Long Dim L2 As Long Dim L3 As Long M = "abc+12=n/a" 'M = ThisWorkbook.ActiveSheet.Range("A1").Value Call MerkkiLaskuri(M, L1, L2, L3) MsgBox L1 & " kirjainta, " & _ L2 & " numeroa, " & _ L3 & " erikoismerkkiä" End Sub