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