Razumevanje osnov je koristno tudi v primeru, ko želimo samodejno posnete makre nekoliko spremeniti.

Makre pišemo z urejevalnikom Visual Basic Editor, ki je del Excela. Prikličemo ga s kombinacijo tipk Alt+F11 oziroma prek menija Orodja\Makro\Urejevalnik za Visual Basic. Nato kliknemo na ime delovnega zvezka v oknu Project – VBAProject ter vstavimo nov modul (Insert/Modul). Na desni strani urejevalnika se nam prikaže prazen bel prostor. Funkcionalnosti urejevalnika bodo predstavljene pozneje. Za najbolj neučakane bralce raje napišimo prvi že legendarni začetniški primer, v katerem makro izpiše na zaslon pozdravno sporočilo.

Sub MojPrviMakro()
MsgBox("Pozdravljen, svet!")
End Sub

Makro poženemo s klikom gumba Run Sub/UserForm. Gumb je na sliki označen z rdečo puščico. Pred klikom gumba moramo biti s kazalnikom v makru, ki ga želimo pognati. Poganjanje makrov je eden ključnih dejavnikov, ki odloča o tem, kako so makri sprejeti pri končnih uporabnikih, zato bomo poganjanju makrov namenili posebno poglavje. Zaenkrat spoznajmo še en način, to je poganjanje makrov iz menija: Orodja/Makro/Makri.
Makro je del Excelove datoteke, v kateri smo ga napisali. Ali datoteka vsebuje makro, lahko ugotovimo le tako, da jo odpremo in prikličemo urejevalnik za makre. Excel 2007 prinaša novost, ki je do zdaj nismo poznali. Datotekam, ki vsebujejo makre, se spremeni končnica v imenu datoteke. Namesto končnice .xlsx (tudi osnovna končnica je pri Excelu 2007 druga), imajo datoteke z makri končnico .xlsm.

Kam makre shranimo, je odvisno od tega, kdo bodo uporabniki makra, kako jih bodo poganjali (gumb v orodni vrstici, gumb na delovnem listu, samodejno izvajanje,...) in od tega, kaj makri počnejo. Večinoma jih shranjujemo v navadne Excelove datoteke. Te morajo biti ob njihovem izvajanju odprte oziroma se ob zagonu makra preko gumba v orodni vrstici samodejno odprejo. Odpiranju datotek za zagon makrov se ne moremo izogniti tudi, če ji poganjamo prek menija Orodja/Makro/Makri, saj nam priklicano pogovorno okno prikaže zgolj makre v odprtih datotekah.

Za shranjevanje makrov je zelo primerna datoteka Personal.xls. Datoteko shranimo v mapo C:\Documents and Settings\uporabnik\Application Data\Microsoft\Excel\XLSTART. Njena značilnost je, da se ob zagonu samodejno odpre in ostane uporabniku nevidna. V primeru, da je vidna, jo skrijemo z izbiro Orodja\Skrij v meniju Excela. Makre shranjene v datoteki Personal.xls imamo, ker je datoteka odprta, tako vedno na voljo.

Makre, natančneje funkcije, je prikladno shraniti tudi v obliki Excelovega dodatka, to je posebna oblika datoteke s končnico ".xla" (v Excelu 2007 s končnico ".xlam" ). O Excelovih dodatkih smo v reviji Moj Mikro že pisali oktobra 2005.

TEMELJI JEZIKA VISUAL BASIC FOR APPLICATIONS

Preden se posvetimo podrobnostim pisanja makrov za Excel, poglejmo temelje.

Procedure in funkcije
Makre delimo na procedure in funkcije. Procedure pomenijo večino makrov v Excelu. Vsi samodejno posneti makri so procedure. Procedure izvajajo akcije. Spoznamo jih po ključni besedi Sub pred imenom makra. Funkcije, ki jih definiramo s ključno besedo Function, vedno vračajo rezultat. Uporabljamo (kličemo) jih v drugih makrih. Kar pa ni vse, saj jih lahko uporabljamo tudi kot običajne funkcije delovnega zvezka.

Objekti
Objekti, prek 100 jih je, so gradniki Excela. Najbolj tipični primeri objektov so Chart, Workbook, WorkSheet, Range, PivotTable ipd. Objekti so urejeni v hierarhijo. Na vrhu hierarhije je objekt Application, ki predstavlja Excel, vsebuje pa objekta Workbook in CommandBar.

Zbirke objektov
Zbirke objektov združujejo objekte istega tipa. Poimenovane so tako, da je imenu objekta dodana končnica »s«. Ločevanje med zbirkami objektov in objekti je v začetku težavno. Primer zbirke objektov je WorkSheets, ki združuje vse delovne liste v delovnem zvezku. Pri pisanju makrov zbirke objektov pogosto uporabljamo. Če se želimo sklicevati na konkreten list, to storimo z naslednjo sintakso: WorkSheets("List1"), torej ime zbirke objektov in v oklepajih in narekovajih določitev konkretnega objekta. Še nazornejši je naslednji primer, ki določa sklic na List3 v delovnem zvezku Test.xls:

Workbooks("Test.xls").Worksheets("List3"). Iz primera lahko razberemo tudi, da objekt Workbooks("Test.xls") vsebuje objekt WorkSheets("List3"). Hierarhija se določa z zapisom NadobjektPikaPodobjekt.

Lastnosti objektov
Lastnosti objekta najlaže razumemo, če nanje gledamo kot nastavitve objekta. Če želimo neki celici nastaviti vrednost, uporabimo njeno lastnost Value. Če ji želimo nastaviti pisavo, uporabimo lastnost Font. Nekaj zmede povzroča dejstvo, da kot ločilo med objekti in njihovimi lastnostmi ponovno uporabimo piko. Primer Range("A1").Value = "Testno besedilo" zapiše besedilo v celico A1.

Čas je, da razbijemo teorijo s konkretnim in uporabnim primerom. Excel kljub obilici funkcij ki so na voljo prek gumba Vstavi funkcijo, nima funkcije, ki bi vračala ime uporabnika, zato jo bomo ustvarili sami. Zapišimo naslednjo kodo:

Function Uporabnik()
' Funkcija vrne ime uporabnika
Uporabnik = Application.UserName
End Function

Preverimo delovanje. V poljubno celico, na primer v celico A1, vnesemo =Uporabnik(). V celici A1 imamo poslej ime uporabnika. Gre za ime uporabnika, ki je definiran kot uporabnik programa Excel. in ne za uporabniško ime, pod katerim je uporabnik prijavljen v lokalno omrežje. Velja dodati opozorilo, da je funkcija Uporabnik na voljo le v delovnem zvezku, kjer je makro, ki jo definira. Tovrsten makro je smiselno shraniti v že omenjeno datoteko Personal.xls ali v Excelov dodatek.

Metode
Metode so akcije nad objekti. Morda najpogosteje uporabljena metoda pri pisanju makrov za Excel je metoda Select. Napišimo preprost makro, ki označi List3.

Sub PrestaviList()
' Makro označi list3
Worksheets("List3").Select
End Sub

Že v prejšnjem makru smo uporabili komentar. Ker namen pisanja komentarjev v računalniški reviji poznamo, omenimo samo njegovo značilnost oziroma omejitev. Komentar označimo z znakom ', kar je prikladno. Moteče pa je dejstvo, da ni mogoče »zakomentirati« več vrstic hkrati. Vsako posebej moramo označiti kot komentar!

Standardni programski konstrukti
Visual Basic for Applications (v nadaljevanju tudi VBA) je sodoben programski jezik in vsebuje vse, kar programski jeziki ponujajo in kar bomo spoznali v nadaljevanju: zanke, spremenljivke, konstante, nize ...

Posebne lastnosti objekta Application (=Excel)
Lastnosti objekta Application: ActiveWorkbook, ActiveWindow, ActiveSheet, ActiveCell, ActiveChart, Selection so zelo koristne, pogosto uporabljene ter značilne za makre v Excelu, zato smo jih uvrstili kar med temelje. Z njihovo uporabo je naslavljanje aktivnih delovnih zvezkov, oken, delovnih listov, celic, grafov in poljubnih objektov zelo enostavno. V naslednjem primeru z uporabo metode Clear zbrišemo vsebino aktivne celice. Primer nam pokaže tudi dejstvo, da lahko navedbo objektov, ki so hierarhično nad konkretnim objektom, izpustimo. Programiranje v Excelu je namreč "ohlapno" in nam dopušča izpuščanje določenih navedb.

Sub Brisi()
' Zbrišemo vsebino aktivne celice
ActiveCell.Clear
End Sub

Uporabnost omenjenih lastnosti objekta Application ni zgolj v olajšanem naslavljanju aktivnih objektov. Omogočajo tudi bistveno večjo uporabnost makrov. Če bi se vrstica ActiveCell.Clear glasila Range("A1").Clear, bi makro vedno zbrisal vsebino celice A1. Zgoraj napisani makro Brisi pa zbriše vsebino celice, ki je aktivna pred zagonom makra.
Pozorni bralci, ki boste v praksi preizkusili makro Brisi, boste opazili, da potem, ko makro zbriše vsebino aktivne celice, ni na voljo zelo koristna funkcionalnost Razveljavi. Žal se tega, kar naredi makro, ne da razveljaviti, pa četudi makro izvede preprosto akcijo. Začetniki so razočarani tudi ob dejstvu, da se koda makrov ne prilagaja spremembam, ki jih uporabnik opravi v delovnih zvezkih. Če smo v makru PrestaviList zapisali Worksheets("List3").Select in kasneje list List3 preimenovali v Podatki, smo s preimenovanjem delujoč makro spremenili v nedelujočega. Da bo makro po preimenovanju lista deloval, moramo popraviti kodo makra (ali preklicati spremembo). V našem primeru se mora koda glasiti Worksheets("Podatki").Select.

Ker je naslednje poglavje, kljub obljubi iz uvoda v članek, precej teoretično, se pomudimo še pri naslednjem primeru uporabe posebne lastnosti objekta Application – lastnosti ActiveWorkbook. Gre za uporaben način, kako priti do informacij o aktivnem delovnem zvezku. Uporabimo lastnost BuiltinDocumentProperties. Ta nam daje marsikatero zanimivo informacijo. V primeru nam bo makro sporočil podatek o datumu zadnjega tiskanja. Lastnost BuiltinDocumentProperties daje veliko koristnih informacij o delovnem zvezku. Seznam informacij prikličemo s tipko F1 – ob mora biti kazalec na omenjeni lastnosti.

Sub KdajNatisnjen()
'Kdaj je bil delovni zvezek nazadnje natisnjen
Msgbox (ActiveWorkbook.BuiltinDocumentProperties ("Last Print Date"))
End Sub

Iz primera je razvidno, da imajo tudi lastnosti svojo hierarhijo in da lahko tudi pri njih govorimo o t.i. zbirkah lastnosti, kjer je konkreten primerek neke lastnosti določen z navedbo v oklepajih in narekovajih.

Spremenljivke

Makri obdelujejo podatke. Podatki so shranjeni v Excelovih objektih (npr. celicah) ali pa, kot pri vseh drugih programskih jezikih, v spremenljivkah. Spremenljivko določata njeno ime in njena trenutna vsebina, po želji pa ji lahko predpišemo tudi tip (vrsto). Visual Basic for Applications od programerja ne zahteva napovedovanja spremenljivk. V primerih v članku spremenljivke večinoma napovedujemo, saj so s tem makri razumljivejši. V praksi pa je stanje drugačno - spremenljivke se ne napovedujejo.

• Tipi spremenljivk
Spremenljivke napovedujemo z ukazom Dim. Sintaksa je naslednja: Dim ImeSpremenljivke [As Podatkovni Tip]. Oglati oklepaji nakazujejo, da določitev podatkovnega tipa ni obvezna. Pri pisanju makrov v Excelu imamo na voljo naslednje tipe:
Številski tipi (Byte, Integer, Long, Single, Double, Currency, Decimal, pa tudi Boolean)
Datumski tip (Date)
Niz znakov (String)
Objekt (poljuben Excelov objekt, npr: Workbook, WorkSheet, PivotTable, Chart, Range, Cell, …)
Prilagodljivi tip – Variant. Spremenljivka tega tipa lahko hrani vrednost kateregakoli tipa. Kadar spremenljivki ne določimo tipa, ji Excel samodejno priredi tip Variant.

• Prirejanje vrednosti spremenljivkam
Način prirejanja vrednosti spremenljivkam je odvisen od tipa spremenljivke. Če je spremenljivka stevilo številskega tipa, ji priredimo vrednost 15 s programskim stavkom: stevilo = 15. Spremenljivki naslov, ki naj ji bo za potrebe primera dodeljen tip niz znakov, priredimo vrednost Slovenska cesta 111 s programskim stavkom: naslov = "Slovenska cesta 111". Iz primera je razvidno, da vrednosti niza znakov pišemo v narekovajih.

Prirejanje vrednosti spremenljivkam datumskega tipa skriva manjšo past. Začetniki pogosto zapišejo datum = "25.05.2007". To je napačno, saj s tem spremenljivki datum dodelimo niz znakov "25.05.2007" in ne datuma. Ali se napaka odrazi pri uporabi makra, je odvisno od načina nadaljnje uporabe spremenljivke. Oglejmo si naslednji primer.

Sub DatumskeSpremenljivke()
' Pravilno in napačno prirejanje
' vrednosti datumskim spremenljivkam
Datum1 = #05/25/2007#
Datum2 = "25.05.2007"
Datum1 = datum1 + 3
Datum2 = datum2 + 3
MsgBox Datum1
MsgBox Datum2
End Sub

Makro nam najprej izpiše pravilen rezultat 28.05.2007, nato napačen 25052010. Do napake ne pride, če spremenljivko Datum2 ustrezno napovemo (Dim Datum2 As Date). Posebej še velja opozoriti, da spremenljivkam datumskega tipa vrednosti vedno prirejamo s sintakso #mm/dd/yyyy#, in to ne glede na krajevne nastavitve osebnega računalnika. Podobno velja za decimalna števila, kjer za ločilo med celimi in decimalnimi mesti vedno uporabljamo piko in nikdar vejice.

Prirejanje vrednostim spremenljivkam, ki so tipa Excelov objekt, se razlikuje od prirejanja vrednostim spremenljivkam drugih tipov zaradi nujne uporabe ukaza Set. V makru UcenjeSet napovemo spremenljivko MojeObmocje kot spremenljivko tipa Range, nato ji dodelimo območje celic od B4 do B9 v listu Podatki in na koncu območje označimo (»selektiramo«).

Sub UcenjeSet()
'Primer uporabe ukaza Set
Dim MojeObmocje As Range
Set MojeObmocje = Worksheets("Podatki").Range("B4:B9")
MojeObmocje.Select
End Sub

Posebnost izdelave makrov za Excel je v tem, da spremenljivkam zelo pogosto priredimo vrednosti, ki so zapisane v celicah delovnega zvezka. Vrednost celice, na primer B5, priredimo spremenljivki podatek na dva načina. Prikazuje ju makro Priredi.

Sub Priredi()
'Vrednosti celic prirejamo na dva načina
Dim Podatek As Variant
Podatek = Range("B5").Value
Podatek = Cells(5,2).Value
End Sub

Prvi način je lažje berljiv, drugi pa uporabnejši, kadar želimo vrstice in predvsem stolpce označiti s spremenljivkami. Naj ne bo odveč opozorilo, da je pri določanju celic z zbirko objektov Cells vrstni red označevanja stolpca in vrstice v primerjavi z označevanjem z objektom Range zamenjan. Glasi se Cells(številka vrstice, številka stolpca).

• Pretvarjanje tipov
Programer pogosto naleti na potrebo po zamenjavi tipa spremenljivke. Vzemimo za primer funkcijo &, ki združuje dva ali več nizov znakov. Ponazorimo: "Moj" & "Mikro" nam vrne "MojMikro". Oglejmo si makro Pretvarjanje.

Sub Pretvarjanje()
'Uporaba funkcij & in CStr
Dim Stevilka As Integer
Stevilka = 10
MsgBox("Moj" & "Mikro" & CStr(Stevilka))
End Sub

V primeru želimo k nizoma "Moj" in "Mikro" dodati še podatek o številki, ki pa je spremenljivka številčnega tipa, zato jo z uporabo ustrezne funkcije za pretvarjanje podatkovnih tipov – CStr pretvorimo v niz znakov. Makro nam izpiše "MojMikro10". A še preden naštejemo nekaj funkcij za pretvarjanje podatkovnih tipov, takoj poudarimo, da nam Excel omogoča opuščanje njihove uporabe. Če v makro zapišemo MsgBox("Moj" & "Mikro" & Stevilka), dobimo enak rezultat. Excel se namreč »potrudi« in pretvorbo tipov naredi samodejno.

Imena funkcij za pretvarjanje podatkovnih tipov se začnejo s črko C. Razlog za to je angleška beseda convert (=pretvori). Ker se na samodejno pretvarjanje podatkovnih tipov ne moremo v celoti zanesti, naštejmo najpogosteje uporabljene funkcije:
CStr – poljuben tip pretvori v niz znakov.
CDate ¬¬– poljuben datumski izraz, ki ustreza krajevnim nastavitvam, pretvori v datumski tip.
CInt – izraz ali niz, ki predstavlja število, pretvori v številki tip.
CVar – poljuben tip pretvori v tip Variant.

Tako, prebili smo se čez nujno teorijo. V naslednjem članku pa obljubljamo več zanimivejših in koristnejših primerov.

Samo Rubin