Makrot

Makrot ovat kokoelma toimenpiteistä, jotka on koottu yhdeksi kokonaisuudeksi eli makroksi. Usein käytetyt toimenpiteet voidaan koostaa makroksi ja ne voidaan suorittaa yhdellä komennolla. Makroiksi voidaan koostaa tekstinkäsittelyn ja taulukkolaskennan puolella miltei kaikki toimenpiteet, joita kyseisillä ohjelmilla pystytään tekemään. Jokainen hiiren valinta tai painikkeen napauttaminen voidaan nauhoittaa makroksi. Yhteen makroon voidaan esimerkiksi lisätä toimenpiteitä, jotka vaativat useammassa valikossa liikkumista. Kun toiminnot on koottu makroksi, toimenpiteiden suorittaminen voidaan tehdä esimerkiksi jollakin pikanäppäinkomennolla.

Makrot luonnollisesti ajetaan huomattavan paljon nopeammin kuin käyttäjän makroon nauhoittamat toimet on tehty. Sovellusohjelma perheissä käytetään erilaisia makrokieliä. Microsoft tuoteperheen sovelluksissa käytetään makrokielenä Visual Basic for Applications -kieltä eli VBA-kieltä, joka on todella tehokas ohjelmointikieli Windows-ympäristössä. Tehokkaasta makrokielestä on myös haittaa, koska sillä on helppo kirjoittaa makroviruksia. Seuraavissa luvuissa tutustutaan tarkemmin makrojen toimintaan ja niiden käyttämiseen. Kaikki seuraavassa käsiteltävät makrot ovat Microsoft Excelin makroja, joten ne eivät toimi missään muussa taulukkolaskentaohjelmassa.

Makrojen tekeminen

Makroja voidaan tehdä kahdella erilaisella tavalla. Makrot voidaan nauhoittaa tai kirjoittaa käsin. Ainakin aluksi makrot kannattaa tehdä nauhoittamalla, koska silloin ei tule kiusallisia kirjoitusvirheitä.. Makrojen kirjoittaminen on puhtaasti ohjelmointia, joten se vaatii hieman perehtymistä makrokielen syntaksiin sekä ohjelmoinnin periaatteisiin. Kuitenkin nauhoittamallakin saa hyvin tehokkaita makroja aikaan, mutta kaikki tehtävät toimenpiteet pitää suunnitellaan etukäteen todella huolellisesti. Nauhoitettuja makroja muokkaamalla saadaan aikaan toimivia ja käyttökelpoisia makroja.

Joissakin taulukkolaskentaohjelmissa makroja voidaan tehdä kahdella erillisellä kielellä. Toinen kielistä on ohjelman oma makrokieli ja toinen yleensä huomattavasti kehittyneempi ohjelmointikieli. Esimerkiksi Microsoft Excelin vanhemmissa versioissa makrot voitiin nauhoittaa myös ohjelman omalla makrokielellä, joka on huomattavasti "jäykempi" ohjelmointikieli kuin VBA-kieli. Makroja ei siis kannata tehdä sovelluksen omalla makrokielellä, vaan mahdollisuuksien mukaan jollakin oikealla ohjelmointikielellä.

Makrojen nauhoittaminen

Makrojen nauhoittaminen on yksinkertainen tapa yhdistää erilaisia toimenpidesarjoja. Nauhoitetut makrot täytyy kuitenkin suunnitella hyvin ennen nauhoittamisen aloittamista. Nauhoitetaan esimerkin vuoksi makro, jolla valitaan ensin solualue A1:B4. Valinnan jälkeen alue kopioidaan leikepöydälle, jonka jälkeen alue liitetään leikepöydältä soluihin D1:E4.

Makron nauhoitusikkuna.

Kuva 58. Makron nauhoitusikkuna.

Makron nauhoittaminen aloitetaan valikkokomennolla , jolla avautuvasta ikkunasta voidaan makrolle määritellä muutamia yleisiä tietoja. Makrolle voidaan antaa nimi (engl. ), pikanäppäinkomento (engl, ) sekä lyhyt kuvaus (engl. ). Ikkunasta voidaan myös määritellä makron tallentamispaikka (engl. ). Makro kannattaa yleensä tallentaa sen työkirjan sisään, jossa sitä käytetään. Makroista voidaan myös kerätä eräänlainen makrokirjasto tallentamalla makrot yhteen ja samaan työkirjaan. Kirjaston keräämisestä voi olla hyötyä, koska silloin kerran hyvin suunnittellut makrot ovat käytettävissä aina uudelleen ja uudelleen.

Kun tarvittavat tiedot on määritelty makrolle, voidaan makron nauhoittaminen aloittaa OK-painikkeella. Makroon nauhoitettavat toimenpiteet voidaan suorittaa millä nopeudella tahansa hitaasti, koska makrojen nauhoittamisnopeus ei ole niiden ajonopeus. Ajettaessa makron toimenpiteet suoritetaan huomattavasti nopeammin kuin nauhoituksen aikana. Kun makron nauhoittaminen on käynnissä, avautuu näkyville oheisen kuvan mukainen nauhoituksen lopettamispainike (engl. Stop Recording). Makron nauhoittaminen voidaan lopettaa painamalla nauhoituksen lopetuspainiketta tai valikkokomennolla Tools | Macro | Stop Recording (suom. Työkalut | Makro | Lopeta Nauhoittaminen).

Nauhoituksen lopetuspainike.

Kuva 59. Nauhoituksen lopetuspainike.

Nauhoituksen lopettamispainikkeesta löytyy myös toinen painike. -painikkeen valinnalla voidaan tehdä makrosta suhteellinen. Makron suhteellisuus tarkoittaa sitä, että makron toimenpiteet suoritetaan aloituspaikan suhteen. Absoluuttinen makro suorittaa toimenpiteet aina samoilla soluilla, joten sillä ei voida tehdä kovin monipuolisia tai yleistämiskelpoisia toimenpiteitä. Suhteellinen makro taas tekee toimenpiteet sen solun suhteen, jossa se ollaan makron käynnistämishetkellä. Muuttamalla suhteellisen solun aloituskohtaa saadaan tehtyä kohtuullisen yleistämiskelpoinen makro, jonka toiminta ei rajoitu pelkästään muutamaan soluun.

Esimerkkimakroon nauhoitettavat toimenpiteet ovat hyvän suunnittelun jälkeen selvillä. Kun makron nauhoitus on päällä, valitaan leikepöydälle kopioitava alue A1:B4. Tämän jälkeen alue kopioidaan leikepöydälle valikkokomennolla Edit | Copy (suom. Muokkaa | Kopioi). Seuraavaksi valitaan solut, jonne leikepöydälle kopioitu alue halutaan liittää eli esimerkin tapauksessa valitaan solu D1. Solun valitsemisen jälkeen liitetään solut leikepöydältä valikkokomennolla Edit | Paste (suom. Muokkaa | Liitä). Toimenpiteet on suoritettu, joten makron nauhoittaminen voidaan lopettaa.

Seuraavassa on esitetty kaksi erilaista versiota makrosta, jolla kopioitiin solualue toiseen paikkaan. Ensimmäinen makroista on tehty absoluuttisilla viittauksilla ja toinen on tehty suhteellisilla viittauksilla. Absoluuttinen makro toimii siis ainoastaan edellä valittujen solujen kopioinnissa, kun taas toinen makro toimii sen paikan suhteen, josta makro ajetaan. Makroja nauhoittaessa kannattaa myös miettiä soveltuuko absoluuttinen vai suhteellinen makro paremmin käyttötarkoitukseen. Kummallakin tavalla on varmasti omat hyvät puolensa.

Absoluuttinen makro:
Sub valitse_ja_kopioi_alue()
'
' valitse_ja_kopioi_alue Macro
' Macro recorded 7.1.2000 by Petri Heinonen
'
Range("A1:B4").Select
Selection.Copy
Range("D1").Select
ActiveSheet.Paste
End SubSuhteellinen makro:
Sub valitse_ja_kopioi_alue()
'
' valitse_ja_kopioi_alue Macro
' Macro recorded 7.1.2000 by Petri Heinonen
'
ActiveCell.Range("A1:B4").Select
Selection.Copy
ActiveCell.Offset(0, 3).Range("A1").Select
ActiveSheet.Paste
End Sub

Makrojen ajaminen

Makrojen ajaminen.

Kuva 59. Makrojen ajaminen.

Kerran nauhoitettua makroa voidaan ajaa usealla eri tavalla. Makro voidaan ajaa jollakin pikanäppäinkomennolla tai se voidaan ajaa jonkin itse tehdyn painikkeen avulla. Makron yhdistäminen pikanäppäinkomentoon antaa todella tehokkaan ja nopean tavan tehdä usein toistuvia toimintoja! Makrot voidaan ajaa myös käsin, jolloin ne ajetaan valikkokomennon kautta avautuvasta ikkunasta. Ajettava makro on ensin valittava aktiiviseksi ja sen jälkeen makron ajaminen onnistuu valinnalla . Ajamisen yhteydessä suoritetaan markon sisältämät toimenpiteet ja makron suorittaminen lopetetaan automaattisesti.

Makrojen muokkaaminen

Makroja voi mennä muokkaamaan tai parantelemaan niiden nauhoittamisen jälkeen käsin, mutta muokkaaminen vaatii jo hieman makrokielen ja ohjelmoinnin tuntemusta. Kerran nauhoitetut makrot toimivat todella hyvinä pohjina yleiskäyttöisille makroille. Pienillä muutoksilla makroista saadaan entistäkin käyttökelpoisempia.

Makrojen muokkaaminen onnistuu Microsoft Excelissä samasta ikkunasta kuin makrojen ajaminen. Aktiivista makroa päästään muokkaamaan komennolla Edit (suom. Muokkaa). Valitun koodi avautuu näkyville Microsoft Visual Basic-editorissa. Editorissa makron koodia päästään muokkaamaan käsin. Muutoksia tai parannuksia tehdessä pitää olla todella varovainen, koska pieninkin kirjoitusvirhe estää koko makron toiminnan. Makrojen muokkaaminen tulee yleensä kysymykseen, kun halutaan lisätä makroihin kysely- tai viestidialogeja, joita makroon ei saada nauhoittamalla. Luvussa Hieman kehittyneempiä makroja on muutamia esimerkkejä, jotka on toteutettu nauhoitettua makroa muokkaamalla.

Makrojen yhdistäminen objekteihin

Microsoft Excelissä makrot voidaan yhdistää painikkeisiin, valikoihin, kuvaan sekä moneen muuhun laskentataulukossa sijaitsevaan objektiin. Makron liittäminen objekteihin onnistuu napauttamalla objektin ääriviivoilla hiiren oikeaa painiketta, jolloin näkyville avautuu lista, josta voidaan valita komento Assign Macro (suom. Liitä makro). Makron liittäminen objektiin onnistuu valitsemalla avautuneesta listasta makro, joka halutaan suorittaa, kun objektia napautetaan hiirellä.

Makrojen rakenne

Makrot ovat pieniä ohjelmamoduuleita, joilla jokaisella on oma tehtävänsä. Jokainen ohjelma suorittaa toisistaan riippumattomasti joitakin pieniä toimenpiteitä. Makro-ohjelmamoduuli alkaa määrittelyllä Sub ohjelman_nimi ja se loppuu määrittelyyn End Sub. Kaikki alku- ja loppurivien väliin tuleva on samaa ja kerralla suoritettavaa kokonaisuutta eli makroa. Alku- ja loppurivien välille voidaan laittaa kommenttaja ja suoritettavaa ohjelmakoodia. Kommentit erottaa rivin alussa olevasta kommenttimerkistä (') , joka kertoo ettei kyseistä riviä suoriteta.

Seuraavassa esimerkissä on makro, jonka rakennetta tarkastellaan hieman tarkemmin. Makro alkaa määrittelyllä Sub valitse_ja_kopioi_alue(). Riviltä käy muun muassa ilmi, että makron nimi on valitse_ja_kopioi_alue. Seuraavat kolme riviä, jotka alkavat kommenttimerkillä ('), ovat kommentteja. Kommenttirivejä ei suoriteta, joten niillä voi olla kommentteja makron toiminnasta. Kommenttirivien jälkeen tulee ensimmäinen suoritettava rivi, jolla on komento Range("A1:B4").Select . Rivin koodi tarkoittaa alueen A1:B4 valitsemista aktiiviseksi. Seuraavalla rivillä valittu alue kopiodaan leikepöydälle. Edelleen valitaan solu D1, jonka jälkeen liitetään leikepöydällä olleet solut edellä valittuun paikkaan. Viimeisellä rivillä on makron lopettava koodi End Sub.

Sub valitse_ja_kopioi_alue(
' valitse_ja_kopioi_alue Macro
' Macro recorded 7.1.2000 by Petri Heinonen
'
Range("A1:B4").Select
Selection.Copy
Range("D1").Select
ActiveSheet.Paste
End Sub

Muutamia yksinkertaisia makroja

Seuraavaan on koottu muutamia käyttökelpoisia makroja ja kerrottu niiden toimintaperiaatteista. Kaikki seuraavassa esiintyvät makrot voidaan kokonaisuudessaan nauhoittaa. Luvun loppuun on koottu muutamia makroja, joiden nauhoittamista joudutaan jo hieman suunnittelemaan.

Valitse_Solu

Makro valitsee solun B3 aktiiviseksi. Makron tekeminen onnistuu nauhoittamalla.

Sub Valitse_Solu()
' Valitse_Solu Macro
' Macro recorded 4.1.2000 by Petri Heinonen
Range("B3").Select
End Sub

Valitse_Alue

Makro valitsee solualueen A1:C5 aktiiviseksi. Makron tekeminen onnistuu nauhoittamalla.

Sub Valitse_Alue()
Range("A1:C5").Select
End Sub

Lisaa_Rivi

Makro lisää rivin aktiivisen rivin paikalle. Lisäyksen yhteydessä aktiivinen rivi ja sitä seuraavat rivit siirtyvät yhden rivin alaspäin. Makron tekeminen onnistuu nauhoittamalla.

Sub Lisaa_Rivi()
Selection.EntireRow.Insert
End Sub

Lisaa_Sarake

Makro lisää yhden sarakkeen aktiivisen sarakkeen paikalle ja siirtää aktiivista ja sitä seuraavia sarakkeita yhden oikealle. Makron tekeminen onnistuu nauhoittamalla.

Sub Lisaa_Sarake()
Selection.EntireColumn.Insert
End Sub

Avaa_Tyokirja

Makro avaa työkirjan, jonka nimi on tyokirja.xls. Makrolla saadaan avattua mikä tahansa työkirja pelkästään vaihtamalla avattavan tiedoston nimeä. Makron tekeminen onnistuu nauhoittamalla.

Sub Avaa_Tyokirja()
Workbooks.Open FileName:="tyokirja.xls"
End Sub

Tallenna

Makro tallentaa aktiivisen työkirjan nimelle tyokirja.xls. Makrolla voidaan tallentaa mikä tahansa työkirja muuttamalla makrossa olevan tiedoston nimeä. Makron tekeminen onnistuu nauhoittamalla.

Sub Tallenna()
ActiveWorkbook.SaveAs FileName:="tyokirja.xls"
End Sub

Suojaus

Makro asettaa aktiivisen laskentataulukon suojauksen päälle ja ottaa sen välittömästi pois. Makron tekeminen onnistuu nauhoittamalla.

Sub Suojaus()
ActiveSheet.Protect DrawingObjects:=True, Contents:=True, _
Scenarios:=True
ActiveSheet.Unprotect Poistetaan aktiivisen taulukon suojaus
End Sub

Jarjesta

Makro valitsee ensin taulukon alueelta A1:F21 ja sen jälkeen järjestää sen A-sarakkeen mukaan nousevaan järjestykseen. Makron tekeminen onnistuu nauhoittamalla.

Sub Jarjesta()
Range("A1:F21").Select
Selection.Sort Key1:=Range("A1"), Order1:=xlAscending, _
Header:=xlGuess, OrderCustom:=1, MatchCase:=False, _
Orientation:=xlTopToBottom
End Sub

Suojaus_ja_Lisays

Makro valitsee aktiivisen laskentataulukon B3 solun. Makro poistaa laskentataulukon suojauksen, jonka jälkeen lisää laskentataulukkoon uuden rivin. Lopuksi laskentataulukon suojaus laitetaan takaisin päälle. Makron tekeminen onnistuu nauhoittamalla. Tehtävät toimenpiteet on kuitnekin suunniteltava hyvin etukäteen. Suojaus_Lisays-makro koostuu kokonaisuudessaan kolmesta edellä esitetystä makrosta.

Sub Suojaus_ja_Lisays()
Range("B3").Select
ActiveSheet.Unprotect Poistetaan suojaus
Selection.EntireRow.Insert Lisätään rivi
ActiveSheet.Protect DrawingObjects:=True, Contents:=True, _
Scenarios:=True Suojataan laskentataulukko uudelleen
End Sub

Hieman kehittyneempiä makroja

Seuraavassa esitellään muutamien hieman kehittyneempien makrojen toimintaa. Makrojen tekeminen on viime kädessä ohjelmointia, joten seuraaviin makroihin on ensin nauhoitettu makron runko, jonka jälkeen sitä on muutettu yleiskäyttöisemmäksi käsin.

Tallenna_ja_Sammuta

Makro tallentaa asiakirjan nimelle tyokirja.xls, jonka jälkeen suljetaa ohjelma. Makro on kirjoitettu osittain käsin.

Sub Tallenna_ja_Sammuta()
ActiveWorkbook.SaveAs FileName:="tyokirja.xls"
Application.Quit
End Sub

Jarjesta_nimetty_alue

Makro valitsee ensin nimelle Taulukko_alue nimetyn alueen, jonka jälkeen alue järjestetään A-sarakkeen mukaan nousevaan järjestykseen. Edellä esiteltyä järjestä makroa on muokattu siten, että soluviittauksen paikalle on laitettu nimetyn alueen nimi. Alkuperäisen taulukon laajentuessa myös nimettyä aluetta laajennetaan, joten järjestäminen onnistuu esimerkiksi rivin lisäämisen jälkeenkin.

Sub Jarjesta_nimetty_alue()
Range("Taulukko_alue").Select
Selection.Sort Key1:=Range("A1"), Order1:=xlAscending, _
Header:=xlGuess, OrderCustom:=1, MatchCase:=False, _
Orientation:=xlTopToBottom
End Sub

Nimea_Taulukko

Makro nimeää aktiivisen laskentataulukon annetulla nimellä. Nimi kysytään käyttäjältä erillisen ikkunan avulla. Makro on kirjoitettu kokonaan käsin.

Sub Nimea_Taulukko()
ActiveSheet.Name = InputBox("Uusi nimi??", "Laskentataulukon nimeäminen")
End Sub

Tayta_solu

Makro sijoittaa käyttäjältä kysytyn arvon soluun A1. Arvon kysyminen tehdään erillisen ikkunan avulla.

Sub Tayta_solu()
Range("A1").Select
ActiveCell.Value = InputBox("Kysymys", "Otsikko")
End Sub

Auto_Open

Makrolla voidaan suorittaa toimenpiteitä, jotka tehdään työkirjan avaamisen yhteydessä. Auto_Open niminen makro suoritetaan automaattisesti työkirjan avaamisen yhteydessä. Makrolla on hyvin tehokasta valmistella työkirja haluttuun kuntoon ennen sen näyttämistä käyttäjälle. Esimerkiksi tietyn aloitussivun laittaminen näkyville voidaan hoitaa Auto_Open nimisellä makrolla. Seuraavassa esimerkissä on käyttäjän nähtäville tulostettu tervehdys työkirjan avaamisen yhteydessä. Tervehdyksen näyttäminen luultavasti ärsyttää käyttäjää enemmän kuin hänelle on siitä hyötyä, joten sellaista ei yleensä kannata näyttää! Makro täytyy kirjoittaa kokonaan käsin.

Sub Auto_Open()
Dim vastaus
vastaus = MsgBox("Tervetuloa", , "Otsikko")
End Sub

Auto_Close

Makrolla voidaan suorittaa toimenpiteitä, jotka tehdään työkirjan sulkemisen yhteydessä. Auto_Close niminen makro suoritetaan automaattisesti työkirjan sulkemisen yhteydessä. Työkirjan sulkemisen yhteyteen voidaan halutessa määritellä automaattinen tallentaminen tai jokin työtä helpottava toiminto. Makro täytyy kirjoittaa käsin.

Sub Auto_Close()
Dim vastaus
vastaus = MsgBox("Näkemiin", , "Otsikko")
End Sub

Makrojen yhdistäminen toisiinsa

Makroja nauhoittaessa ei aina muista ottaa kaikkea mahdollista huomioon, joten jokin toiminto voi jäädä puuttumaan makrosta. Makroja ei kannata nauhoittaa kokonaan uudelleen jonkin toiminnon jäädessä puuttumaan, koska toiminto voidaan lisätä makroon helposti käsin. Puuttuvat toiminnot kannattaa nauhoittaa toiseen makroon ja tämän jälkeen toiminnot voidaan kopioida alkuperäiseen makroon. Kopioitaessa täytyy olla selvillä makrojen rakenteesta ja toiminnasta!

Hyvin tyypillinen tilanne, jossa makroja voi joutua yhdistämään, on erilaisten suojauksien lisääminen makroihin. Taulukkolaskentasovellusta rakennettaessa ei välttämättä ole muistettu ottaa suojauksia mukaan, kun on suunniteltu makroja. Työkirjan suojaaminen ja suojauksen poistaminen ovat hyvin lyhyitä toimenpiteitä, joten ei ole järkevää alkaa nauhoittamaan koko makroa uudelleen niiden puuttuessa. Nauhoittamalla saadaan kätevästi aikaan suojaukset päälle laittava makro. Suojauksesta syntyneen makron koodin voi käydä kopioimassa minkä tahansa makron alkuun. Sama pätee myös suojausten poistamisessa.

Otetaan yksinkertaisuuden vuoksi esimerkiksi suojauksien lisääminen rivin lisäävään makroon. Suojauksen pois ottava koodi on kopioitu makron suoritettavan osan ensimmäiseksi riviksi ja suojaukset päälle asettava makro on kopioitu suoritettavan osan viimeisiksi riveiksi. Käsin ei ole siis tarvinnut kirjoittaa riviäkään makrokoodia!

Sub Lisää_rivi_suojaus()
ActiveSheet.Unprotect
Selection.EntireRow.Insert
ActiveSheet.Protect DrawingObjects:=True,Contents:=True, _
Scenarios:=True
End Sub

Käyttäjien kommentit

Kommentoi tätä sivua Lisää uusi kommentti
Kurssimateriaalien käyttäminen kaupallisiin tarkoituksiin tai opetusmateriaalina ilman lupaa on ehdottomasti kielletty!
http://appro.mit.jyu.fi/doc/tiedonhallinta/taulukkolaskenta/index9.html
© Antti Ekonoja (anjoekon@jyu.fi) <http://users.jyu.fi/~anjoekon/>
Tommi Lahtonen (tommi.j.lahtonen@jyu.fi) <http://hazor.iki.fi/>
Jukka Mäntylä (jmantyla@iki.fi) <http://www.iki.fi/jmantyla/>
2003-10-08 11:24:04
Informaatioteknologia - Jyväskylän yliopiston IT-tiedekunta ja avoin yliopisto