Luento 9 - Makrot, omat funktiot ja työkirjan ominaisuudet

Lyhyt kertaus edellisen luennon asioista

Esimerkkejä taulukkolaskentatyökalujen käytöstä:

Makrot

Makrojen suunnittelu

Makrojen tekeminen

Makron rakenne

Painikkeen liittäminen makroon

Nauhoittamalla tehtyjä makroesimerkkejä

Seuraavassa esitellään muutamia nauhoittamalla tehtyjä makroesimerkkejä. Esimerkkeihin on liitetty myös parannusehdotuksia, joilla makroista saadaan toimivampia ongelmaan, johon ne on toteutettu. Esimerkeissä on ensin lyhyt suunnitelma makroon tulevista toimenpiteistä ja tämän jälkeen löytyy vastaava makrokoodi. Esimerkeistä saa parhaiten tietoa vertailemalla suunnitelmaa ja makrokoodia keskenään.

Lisaa_lahdeviite-makro

Seuraavassa esimerkki tekstinkäsittelyssä (Word) joillekin käyttökelpoisesta makrosta. Loput esimerkistä ovat Excelissä nauhoitettuja makroja. Makron tarkoituksena on mahdollistaa pitkien lähdeviitteiden lisääminen tekstin joukkoon pikanäppäintä painamalla. Välttämättä toimintaan ei tarvita makroa, koska vastaava toiminta voidaan tehdä AutoCorrect-ominaisuuden avulla.

Sub lahdeviite()
    Selection.TypeText Text:="[Kukkanen, 2002, sivut ]"
End Sub

Kirjoita_soluun-makro

Seuraava esimerkki on yksinkertaisin mahdollinen makroesimerkki, jossa valitaan solu ja kirjoitetaan soluun tietoa.

Suunnitelma

Toteutus

Sub Kirjoita_soluun()
    Range("A3").Select
    ActiveCell.FormulaR1C1 = "Kukka"
End Sub

Kopioi-makro

Makrolla kopioidaan valittu solualue toiseen paikkaan.

Suunnitelma

Toteutus

Sub kopioi()
    ActiveSheet.Unprotect
    Range("A1:C6").Select
    Selection.Copy
    Range("G8").Select
    ActiveSheet.Paste
    ActiveSheet.Protect
End Sub

Lisaa-makro

Makron tarkoituksena on mahdollistaa säätilataulukkoon lisääminen ja muokkaaminen. Makrossa ei varsinaisesti lisätä tai muokata säätilataulukkoa, vaan ainoastaan avataan datalomake, jolla muutokset voidaan suorittaa.

Suunnitelma

Toteutus

Sub lisaa()
    ActiveSheet.Unprotect
    Range("A1").Select
    ActiveSheet.ShowDataForm
    ActiveSheet.Protect
End Sub

Jarjesta-makro

Makro järjestää säätilataulukon lämpötilan mukaan nousevaan järjestykseen.

Suunnitelma

Toteutus

Sub jarjesta()

    ActiveSheet.Unprotect
    Columns("A:D").Select
    Selection.Sort Key1:=Range("B2"), Order1:=xlAscending, Header:=xlGuess, _
        OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom
    ActiveSheet.Protect
End Sub

Makroa voitaisiin parantaa siten, että käytettäisiin sarakeviittausten (A:D) sijasta nimettyä aluetta saatila. Tällöin makron sarakkeiden valinnan tekevä rivi pitäisi muuttaa seuraavaksi:

Columns("saatila").Select

Suodata-makro

Suodata makrolla on tarkoitus suodattaa solualuetta käyttäjän antamien ehtojen perusteella erikoissuodatustyökalulla. Työkalun erikoispiirteenä on suodatuksen toteuttaminen erillisen ehtoalueen avulla.

Esivalmistelut

Suunnitelma

Toteutus

Sub suodata()
    ActiveSheet.Unprotect
    Columns("A:D").Select
    Range("A1:D30").AdvancedFilter Action:=xlFilterInPlace, _ 
		CriteriaRange:=Range("I1:L2"), Unique:=False
    ActiveSheet.Protect
End Sub

Edelliseen makroon parannuksena voitaisiin vaihtaa suodatettavan solualueen ja ehtoalueen viittaus nimetyille alueille, jolloin makro toimisi myös alueen laajenemisen yhteydessä. Seuraavassa suodatuksen toteuttava rivi muutettuna yleiskäyttöisemmäksi.

Range("saatila").AdvancedFilter Action:=xlFilterInPlace, _
				CriteriaRange:=Range("ehdot"), Unique:=False

Nayta_kaikki-makro

Seuraavalla makrolla saadaan näkyviin erikoissuodatuksella suodatetut rivit.

Suunnitelma

Toteutus

Sub naytakaikki()
    ActiveSheet.Unprotect
    ActiveSheet.ShowAllData
    ActiveSheet.Protect
End Sub

Paivita_kaavio

Kaavioiden tekemisessä on ongelmana usein kaavioalueen sarjojen lisääntyminen. Lisääntyneet sarjat eivät tule näkyviin kaavion päivitysyrityksistä huolimatta, koska kaavioon tallentuu nimetyn alueen sijasta soluviittaukset. Tämän vuoksi kaavioille voi olla hyödyllistä nauhoittaa kaavion päivittävä makro.

Sub kaavion_paivitys()
    ActiveSheet.ChartObjects("Chart 1").Activate
    ActiveChart.ChartArea.Select
    ActiveChart.SetSourceData Source:=Sheets("Kurssi1").Range("A2:A7,I2:I7"), _
        PlotBy:=xlRows
End Sub

Edellisessä makrossa on viittaukset suoritetaan suoraan soluihin, joten päivityksen varmistamiseksi täytyy solualue viittaus A2:A7,I2:I7 muuttaa nimetyksi alueeksi yhteensa myös makrossa.

Muutamia hieman vaikeampia esimerkkejä

Esimerkkien makroihin on jouduttu tekemään paljon korjauksia käsin ja toimenpiteita on tullut kohtuullisen paljon. Kannattaa pyrkiä toteuttamaan toiminnot esimerkkejä helpommin, mutta joskus se ei onnistu!

Lisaa_harkka-makro

Seuraavassa on hieman toisenlainen esimerkki tietojen kysymisestä. Kysyminen tehdään erillisen InputBoxin avulla. Tämän vuoksi makrossa joudutaan kopioimaan tarvittavia kaavoja. Lisäys voidaan totettaa huomattavasti helpommin datalomakkeen avulla.

Suunnitelma

Toteutus

Sub lisaa_harkka()
    ActiveSheet.Unprotect
    Range("A3").Select
    Selection.EntireRow.Insert
    Range("A2:F2").Select
    Selection.Copy
    Range("A3").Select
    ActiveSheet.Paste
    Application.CutCopyMode = False
    Range("A3").Select
    ActiveCell.FormulaR1C1 = InputBox("Anna opis ID")
    Range("C3").Select
    ActiveCell.FormulaR1C1 = InputBox("Anna Bonus")
    Range("D3").Select
    ActiveCell.FormulaR1C1 = InputBox("Anna HT1 PVM")
    Range("E3").Select
    ActiveCell.FormulaR1C1 = InputBox("Anna HT2PVM")
    Range("A3").Select
    ActiveSheet.Protect
End Sub

Suojaukset päälle kaikkiin laskentalomakkeisiin

Seuraavassa on pieni työkalu suojausten päälle laittamiseksi kaikkiin laskentataulukoihin. Kun tehdään pientä taulukkolaskentasovellusta, niin usein on tarpeen testata suojausten toimintaa. Tällöin tarvitaan usein suojaukset päälle asettavaa makroa.

Sub suojaukset_paalle()
    Application.ScreenUpdating = False
    For i = 1 To Sheets.Count
        Sheets(i).Protect
    Next i
    Application.ScreenUpdating = True
    
End Sub

Suojaukset pois kaikilta laskentalomakkeilta

Seuraavassa on pieni työkalu suojausten poistamiseksi laskentataulukoista. Kun tehdään pientä taulukkolaskentasovellusta, niin usein on tarpeen testata suojausten toimintaa tai esimerkiksi muuttaa tyylin ominaisuuksia. Toimet eivät välttämättä onnistu, jos kaikista laskentataulukoista ei ole poistettu suojauksia. Tällöin tarvitaan tarvitaan suojaukset nopeasti poistavaa makroa.

Sub suojaukset_pois()
    Application.ScreenUpdating = False
    For i = 1 To Sheets.Count
        Sheets(i).Unprotect
    Next i
    Application.ScreenUpdating = True

End Sub

Excel-taulukon muuttaminen HTML-taulukoksi

Eräs makrojen sovellusesimerkki on työkalu Excel-taulukon muuttamiseksi HTML-taulukoksi. Makro täytyy kirjoittaa kokonaan käsin, joten sen tekeminen ei onnistu ilman jonkinlaista ohjelmointikielen tuntemusta. Jos haluat lisätietoja tai kokeilla makron toimintaa, niin tutustu tarkempiin ohjeisiin.

Lisäominaisuuksia makroihin

Seuraavassa on esitelty muutamia makroihin lisättäviä ja makroilla saavutettavia lisäominaisuuksia.

Kommunikointi käyttäjän kanssa

Käyttäjän kanssa voidaan kommuninoida muutamalla helppokäyttöisellä elementillä, jotka voidaan lisätä makroon.

Aloitus- ja lopetustoimenpiteet

Omien funktioiden tekeminen

Excelin makrokielen (VBA) avulla voidaan tehdä omia taulukkolaskentafunktioita, joita voidaan käyttää apuna laskennassa. Omat funktiot voidaan lisätä normaalisti ohjatun funktion lisäämistä valikkokomennolla Insert | Function. Oma funktio löytyy käyttäjän määrittelemien (engl. User Defined) funktioiden joukosta.

Funktiot joudutaan kirjoittamaan kokonaan käsin, joten niiden tekeminen vaatii jonkinlaista ohjelmointikielen tuntemusta. 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.

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.

Makrovirukset

Leviäminen

Tarttuminen

Suojautuminen kaikkia viruksia vastaan

Tuhot

Erikoispiirre

Poistaminen

Taulukkolaskennan työkirjamalli

Taulukkolaskennan työkirjamalliin voidaan tallentaa

Esimerkiksi opettaja voi tallentaa työkirjamalliksi opiskelijoiden arvosanojen laskentaan käyttämänsä sovelluksen. Ennen tallentamista hän on tyhjentänyt sovelluksen opiskelijoista. Opettaja voi käyttää eri luokille tai vuosikursseille aina uutta työkirjamalliin perustuvaa opiskelijoiden arvosanojen laskentasovellusta.

http://appro.mit.jyu.fi/2002/kevat/ohjelmistot/luennot/luento9/index.html
© Petri Heinonen ()<URL: http://www.mit.jyu.fi/peheinon/>
18.03.2002 10:38:09