VBA-perusteet erittäin lyhyesti
- Sisällysluettelo
- Kommentointi
- Muuttujien määrittely ja tietotyypit
- Erilaisia operaattoreita
- Kommunikointi käyttäjän kanssa
- Muutamia tietorakenteita
- Erilaisia silmukkarakenteita
- Esimerkkejä yksinkertaisista VBA-työkaluista
- Omien taulukkolaskentafunktioiden toteuttaminen
VBA (Visual Basic for Applications) on Microsoftin sovellusohjelmissa makrokielenä käytetty ohjelmointikieli. Seuraavassa käydään lyhyesti läpi erilaisia VBA:n rakenteita, joista makrojen muuttamisen tai kirjoittamisen yhteydessä voi olla suurestikin hyötyä.
Sisällysluettelo
- Kommentointi
- Muuttujien määrittely ja tietotyypit
- Erilaisia operaattoreita
- Kommunikointi käyttäjän kanssa
- Muutamia tietorakenteita
- Erilaisia silmukkarakenteita
- Omien funktioiden toteuttaminen
Kommentointi
Visual Basicin kommentit erotetaan ohjelmakoodista heittomerkillä ('). Heittomerkki voidaan sijoittaa mihin tahansa ohjelmakoodin sekaan. Heittomerkin jälkeinen rivin osa on kokonaan kommenttia! Kommentteja voidaan siis sijoittaa myös suoritetavien rivien loppuun.
Sub kysy_luku() ' Kysy_luku alkaa ' Ohjelma kysyy käyttäjältä luvun ja ' sijoittaa sen aktiiviseen soluun ActiveCell.Value = InputBox("Anna luku") ' kysely ja sijoitus End Sub ' Kysy_luku loppuu
Muuttujien määrittely ja tietotyypit
Muuttujien tietotyypit voivat olla seuraavat: Byte, Boolean, Integer, Decimal, Object, Long, Currency, Single, Double, Date, String, Variant.
Esimerkki muutaman tyyppisten muuttujien alustamisesta:
'Muuttujaan voidaan sijoittaa kokonaislukuja Dim muuttuja as Integer 'Muuttujaan voidaan sijoittaa merkkijonoja Dim muuttuja as String 'Muuttujaan voidaan sijoittaa mitä tahansa tietoa Dim muuttuja as Variant 'Muuttujaan voidaan sijoittaa desimaalilukuja Dim muuttuja as Double 'Muuttujaan voidaan sijoittaa mitä tahansa tietoa (Oletustyyppi on Variant) Dim muuttuja
Erilaisia operaattoreita
Seuraavassa esitellään muutamia erilaisia operaattoreita.
Aritmeettiset operaattorit
Aritmeettisia operaattoreita esitellään muutaman esimerkin avulla.
Dim potenssi, osamaara, tulo, erotus, summa As Variant ' potenssi saa arvon 25 potenssi = 5^2 ' osamaara saa arvon 2,5 osamaara = 5/2 ' tulo saa arvon 10 tulo = 5*2 ' erotus saa arvon 3 erotus = 5-2 ' summa saa arvon 7 summa = 5+2
Vertailuoperaattorit
Vertailuoperaattoreita esitellään seuraavassa muutaman esimerkin avulla.
' Erisuuri kuin Luku1 <> Luku2 ' Yhtäsuuri kuin Luku1 = Luku2 ' Pienempi kuin Luku1 < Luku2 ' Suurempi kuin Luku1 > Luku2 ' Pienempi tai yhtäsuuri kuin Luku1 <= Luku2 ' Suurempi tai yhtäsuuri kuin Luku1 >= Luku2
Liitosoperaattorit
Merkkijonojen liittäminen onnistuu muutaman operaattorin avulla, joita seuraavassa hieman havainnollistetaan.
merkkijono = merkkijono1 & merkkijono2 merkkijono = merkkijono1 + merkkijono2
Esimerkki liitosoperaattoreiden käytöstä:
Sub liitos() Dim luku, solu As Variant ' Poimitaan A1 solusta luku luku = Range("a1").Value ' Muodostetaan poimitun luvun perusteella soluosoite. ' Jos solussa A1 oli luku 10, niin soluosoitteeksi tulee A10. solu = "A" & luku ' Kirjoitetaan soluun A10 tekstiä Range(solu).Value = "Tämän solun osoite saatiin!" End Sub
Kommunikointi käyttäjän kanssa
Seuraavassa on esiteltynä muutamia käyttäjän kanssa kommunikointiin tarkoitettuja funktioita. Funktioilla voidaan informoida käyttäjää tapahtumista tai kysyä käyttäjältä tietoja.
Msgbox (Sanomaikkuna)
Syntaksi: MsgBox(kehote [, painikkeet] [, ikkunaotsikko])
Seuraavassa esimerkissä on yksinkertainen sanomaikkunasta, jossa on pelkkä OK-painike. Palautettavaa arvoa voidaan haluttaessa tutkia muuttujan arvo avulla. Palautettava arvo riippuu painetusta painikkeessa sanomaikkunassa.
Esimerkki 1: Sub viesti() Dim Arvo As Integer Arvo = MsgBox("Pelkkä OK-painike!", 0, "Koko ikkunan otsikko") End Sub Esimerkki 2: Sub viesti() Dim Arvo As Integer Arvo = MsgBox("Yes, No ja Cancel -painikkeet", 3, "Koko ikkunan otsikko") End Sub
Seuraavaan on listattu toisena parametrina annettavat painikevaihtoehdot.
Arvo Ikkunan muutos 0 Näyttää ainoastaan OK-painikkeen. 1 Näyttää OK ja Cancel -painikkeet. 2 Näyttää Abort, Retry ja Ignore -painikkeet. 3 Näyttää Yes, No ja Cancel -painikkeet. 4 Näyttää Yes ja No -painikkeet. 5 Näyttää Retry ja Cancel -painikkeet. 16 Näyttää Critical Message -ikonin. 32 Näyttää Warning Query -ikonin. 48 Näyttää Warning Message -ikonin. 64 Näyttää Information Message -ikonin.
Seuraavassa listassa on erilaisten painikkeiden palauttamia arvoja! Painikkeiden arvojen käsittelystä enemmän myöhemmissä esimerkeissä!
Arvo Painike 1 OK 2 Cancel 3 Abort 4 Retry 5 Ignore 6 Yes 7 No
Inputbox (Syöttöikkuna)
InputBox-ikkuna on helppo ja hyvä tapa kysellä käyttäjältä sovellukseen liittyviä tietoja. Seuraavassa lyhyt esimerkki tietojen kysymisestä.
Syntaksi: InputBox(kehote[, ikkunaotsikko] [, oletusteksti] [, xpaikka] [, ypaikka])
Seuraavassa on lyhyt esimerkkin syöttöikkunan käytöstä.
Sub syottoruutu() Dim syote As String syote = InputBox("Ilmoitettava asia", "Otsikkotiedot") End Sub
Muutamia tietorakenteita
IF-lause (Ehtolause)
Ehtolauseet ovat tarkoitettu erilaisten ehtojen testaamiseen. Ehtojen tai jonkin ehdon toteutuessa voidaan tehdä toimenpide, joka koostuu yhdestä tai useasta ohjelmointikielisestä lauseesta.
If ehto Then [lauseita] [ElseIf ehtoja Then [lauseita] ... [Else [Lauseita]] End If
Seuraavassa muutamia esimerkkejä ehtolauseen käytöstä.
Esimerkki 1: Sub If_lause() Dim Arvo As Integer ' Kysytään käyttäjältä lähteekö hän syömään Arvo = MsgBox("Haluatko lähteä syömään?", 0, "Sanomaruudun otsikko") ' Tutkitaan käyttäjän painaman painikkeen palauttama arvo If Arvo = 1 Then Arvo = MsgBox("Mennään syömään!") End If End Sub Esimerkki 2: Sub If_Else_lause() Dim Arvo As Integer ' Kysytään käyttäjältä lähteekö hän syömään Arvo = MsgBox("Haluatko lähteä syömään?", 1, "Sanomaruudun otsikko") ' Tutkitaan käyttäjän painaman painikkeen palauttama arvo If Arvo = 1 Then Arvo = MsgBox("Mennään syömään!") Else Arvo = MsgBox("Mennään sitten myöhemmin syömään!") End If End Sub Esimerkki 3: Sub If_Elseif_Else_lause() Dim Arvo As Integer ' Kysytään käyttäjältä lähteekö hän syömään Arvo = MsgBox("Haluatko lähteä syömään?", 3, "Sanomaruudun otsikko") ' Tutkitaan käyttäjän painaman painikkeen palauttama arvo If Arvo = 6 Then Arvo = MsgBox("Mennään syömään!") ElseIf Arvo = 7 Then Arvo = MsgBox("Mennään sitten toiste syömään!") Else Arvo = MsgBox("Mennään sitten myöhemmin syömään!") End If End Sub
Monivalintalause
Monivalintalauseella voidaan korvata edellä esitettyjä ehtolauseita. Monivalntarakennetta kannattaa käyttää, jos testattavien ehtojen määrä kasvaa suureksi.
Select Case testi [Case testitulos [lauseita]] ... [Case Else [Lauseita]] End Select
Seuraavassa esimerkissä edellä käytetyt ehtolauseet on korvattu Select Case -rakenteella.
Sub Select_Case_lause() Dim Arvo As Integer Arvo = MsgBox("Haluatko lähteä syömään?", 3, "Sanomaruudun otsikko") Select Case Arvo Case 6 Arvo = MsgBox("Mennään syömään!") Case 7 Arvo = MsgBox("Mennään sitten toiste syömään!") Case Else Arvo = MsgBox("Mennään sitten myöhemmin syömään!") End Select End Sub
Erilaisia silmukkarakenteita
FOR-silmukka
For-silmukka on kiinteä silmukkarakenne, jonka avulla voidaan tehdä operaatioita ennalta tiedetty määrä. Operaatiot suoritetaan jostakin alkuarvosta loppuarvoon määrätyin askelarvoin.
Syntaksi: For Laskuri = alkuarvo To loppuarvo [Step Askel] [Lauseet] [Exit For] [Lauseet] Next [Laskuri]
Esimerkki yksinkertaisen For-silmukkarakenteen käytöstä.
Sub For_silmukka() ' Esimerkki silmukkarakenteesta ' Tulostetaan luvut yhdestä kymmeneen ' aktiiviseen laskentataulukkoon Dim Arvo As Integer For Arvo = 1 To 10 Cells(Arvo, 1).Value = Arvo Next Arvo End Sub
Do Loop -silmukka
Do Loop -silmukka sopii hyvin erilaisiin testeihin, joissa silmukoiden lukumäärä ei ole ennalta käsin nähtävillä. Silmukkarakenteesta on olemassa kaksi erillistä versioita, joissa toisessa silmukan sisällä olevat lauseet suoritetaan vähintään kerran. Toisessa rakenteessa silmukan sisään ei välttämättä edes mennä.
Rakenne 1: Do [{While | Until} ehto] [Lauseet] [Exit Do] [Lauseet] Loop Rakenne 2: Do [Lauseet] [Exit Do] [Lauseet] Loop [{While | Until} ehto]
Seuraavassa esimerkki kummastakin silmukkarakenteesta. Silmukkarakenteen eron huomaa antamalla solujen lukumääräksi nollan (0).
Esimerkki 1: Sub Do_Loop_silmukka() ' Esimerkki silmukkarakenteesta ' Tulostetaan luvut yhdestä kymmeneen ' aktiiviseen laskentataulukkoon Dim Arvo, Loppu As Integer Arvo = 1 Loppu = InputBox("Anna solujen lukumäärä") Do While Arvo <= Loppu ' Laitetaan arvo soluun, jonka riviindeksiä kasvatetaan koko ajan Cells(Arvo, 1).Value = Arvo Arvo = Arvo + 1 Loop End Sub Esimerkki 2: Sub Do_Loop_silmukka2() ' Esimerkki silmukkarakenteesta ' Tulostetaan luvut yhdestä kymmeneen ' aktiiviseen laskentataulukkoon Dim Arvo, Loppu As Integer Arvo = 1 Loppu = InputBox("Anna solujen lukumäärä") Do Cells(Arvo, 1).Value = Arvo Arvo = Arvo + 1 Loop While Arvo <= Loppu End Sub
Esimerkkejä yksinkertaisista VBA-työkaluista
Seuraavassa muutamia käyttökelpoisia esimerkkejä VBA:lla tehdyistä työkaluista. Työkalut eivät ole toteutettu optimaalisesti eivätkä ole välttämättä virheettömiä. Jos sinulla on parannusehdotuksia työkaluihin, niin laita ihmeessä tulemaan niistä kommentteja Petri Heinoselle (peheinon@mit.jyu.fi).
Excel-taulukon muuttaminen HTML-taulukoksi
Seuraava esimerkki muuttaa aktiiviseksi valitun solualueen HTML-taulukoksi ja kopioi taulukon valmiiksi leikepöydälle. Työkalun käyttöön on olemassa myös tarkemmat ohjeet.
Sub taulukko() ' Petri Heinonen 20.02.2002 ' Tämä ohjelma tekee Excel-taulukosta HTML-taulukon ' Alustetaan tarvittavat muuttujat Dim arvo As String Dim i As Integer Dim j As Integer Dim rivilkm As Integer Dim sarakelkm As Integer Dim uusinimi As String Dim nimi As String ' Otetaan talteen aktiivisen lomakkeen nimi nimi = ActiveSheet.Name ' Määritellään aktiivisen alueenb rivien lukumäärä rivilkm = Selection.Rows.Count ' Määritellään aktiivisen alueen sarakkeiden lukumäärä sarakelkm = Selection.Columns.Count ' Lisätään uusi lomake Sheets.Add ' Otetaan uuden lomakkeen nimi talteen uusinimi = ActiveSheet.Name ' Aktivoidaan vanha lomake Sheets(nimi).Activate ' Aletaan varsinaisen taulukon muodostaminen Worksheets(uusinimi).Cells(1, 1).Value = "<table>" For i = 1 To rivilkm ' Aloitetaan uusi rivi Worksheets(uusinimi).Cells(i + 1, 1).Value = "<tr>" For j = 1 To sarakelkm ' Luetaan alkuperäisen taulukon solu arvo = Selection.Cells(i, j).Value If i = 1 Then ' Taulukon otsikkotiedot ensimmäiselle riville arvo = "<th>" + arvo + "</th>" Else ' Taulukon datat muille riveille arvo = "<td>" + arvo + "</td>" End If ' Sijoitetaan muutetut solun tiedot uuteen taulukkoon Worksheets(uusinimi).Cells(i + 1, j + 1).Value = arvo Next j Worksheets(uusinimi).Cells(i + 1, j + 1).Value = "</tr>" Next i Worksheets(uusinimi).Cells(i + 1, 1).Value = "</table>" ' Aktivoidaan lomake, jolla on muodostunut taulukko Sheets(uusinimi).Activate Range(Cells(1, 1), Cells(i + 1, j + 1)).Copy End Sub
Omien taulukkolaskentafunktioiden toteuttaminen
VBA:n avulla voidaan tehdä omia taulukkolaskentafunktioita, joita voidaan käyttää apuna laskennassa. Omat funktiot voidaan lisätä taulukkolaskentaohjelmissa normaalisti ohjatun funktion lisäämistä valikkokomennolla Insert | Function. Oma funktio löytyy käyttäjän määrittelemien (engl. User Defined) funktioiden joukosta.
Seuraava omasumma-funktio on yksikertaisin esimerkki oman funktion toteuttamisesta. Funktio laskee kahden luvun tai kahdessa solussa olevien lukujen summan. Esimerkkifunktio ei ole käyttökelpoinen, koska taulukkolaskentaohjelmista löytyy parempia funktioita kyseiseen käyttötarkoitukseen, mutta se on riittävän yksikertainen esimerkki funktion toiminnasta.
Function omasumma(ekaluku As Integer, tokaluku As Integer) As Integer ' Petri Heinonen 20.02.2002 ' Tämä on esimerkki mahdollisimman yksinkertaisesta itsetehdystä funktiosta ' Funktiolla voidaan laskea kahden parametrina annetun solun summan. ' Funktio omasumma = ekaluku + tokaluku ' Jos funktion halutaan palauttavan sijaintisoluunsa tuloksen, ' niin palauttaminen voidaan toteuttaa sijoittamalla ' haluttu arvo funktion nimeen edellisen esimerkin mukaisesti. End Function
Esimerkki funktion kutsusta ja sen palauttamasta arvosta.
- =omasumma(A12;B12) saa arvon 171, kun solussa A12 on luku 104 ja solussa B12 on luku 67.
Seuraava funktio on hieman edellistä käyttökelpoisempi. Funktiolla lasketaan kahden luvun tai soluarvon perusteella X^Y+1-sarjan arvoja. Kyseinen kaava voitaisiin toki toteuttaa suoraan laskutoimituksena soluviittauksilla, mutta sen tekeminen funktioksi helpottaa tulevaisuudessa kyseisen kaavan käyttöä.
Function SARJA(X As Integer, Y As Integer) ' Esimerkki omasta taulukkolaskentafunktiosta ' Funktio laskee kaavanmukaisen tuloksen annetuista luvuista SARJA = X ^ Y + 1 End Function
Esimerkkejä funktion kutsusta ja sen palauttamista arvoista.
- =SARJA(1;2) saa arvon 2.
- =SARJA(3;2) saa arvon 10.
- =SARJA(A6;B6) saa arvon 26, jos solussa A6 on arvo 5 ja solussa B6 on arvo 2.
Käyttäjien kommentit