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 tallennettu työkirja suljetaan. Lopuksi suljetaan vielä koko ohjelma. Makro on kirjoitettu osittain käsin!!

Sub Tallenna_ja_Sammuta()
    ActiveWorkbook.SaveAs FileName:="tyokirja.xls"
    ActiveWorkbook.Close
    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 nimetty alue. Alkuperäisen taulukon laajentuessa nimetty alue laajenee, 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_Lomake

Makro nimeää aktiivisen lomakkeen annetulla nimellä. Nimi kysytään käyttäjältä erillisen ikkunan avulla. Esimerkistä kannattaa huomata muuttujien käyttäminen, joka ei tässä tapauksessa ole kuitenkaan välttämätöntä. Makro on kirjoitettu osittain käsin!!

Sub Nimea_Lomake()
    Dim uusi_nimi
    uusi_nimi = InputBox("Uusi nimi??", "Lomakkeen nimeäminen")
    ActiveSheet.Name = uusi_nimi
End Sub

Tayta_solu

Makro sijoittaa käyttäjältä kysytyn arvon soluun A1. Kysyminen tehdään erillisen ikkunan avulla. Arvon sijoittaminen soluun tehdään erillisen uusi_nimi muuttujan avulla.

Sub Tayta_solu()
    Dim uusi_nimi
    Range("A1").Select
    uusi_nimi = InputBox("Kysymys", "Otsikko")
    ActiveCell.Value = uusi_nimi
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. Makro pitää 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 pitää kirjoittaa kokonaan käsin!

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

4.8.9 Makrojen yhdistäminen toisiinsa

Makroja nauhoittaessa ei aina muista ottaa kaikkea mahdollista huomioon, joten jokin pieni pala voi jäädä puuttumaan makrosta. Makroja ei kuitenkaan kannata nauhoittaa kokonaan uudelleen jonkin pienen palan jäädessä puuttumaan, koska se voidaan lisätä makroon jälkikäteen. Nauhoitetaan puuttuvista toiminnoista toinen makro. Makroja voidaan muokata käsin, joten uuden makron koodi voidaan kopioida toisen makron koodien joukkoon. Kopioitaessa pitää kuitenkin olla hyvin 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 mieltä 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 suojausten lisääminen rivin lisäämis-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