Download as pdf or txt
Download as pdf or txt
You are on page 1of 31

Nenad ljivi

Microsoft Excel
EXPERT & VBA

Excel Expert i VBA


Podsetnik Excel funkcionalnosti
Relativne i apsolutne reference
U formulama moemo referisati druge elije relativno ili
apsolutno. Relativno referisanje znai da samo navodimo ime
elije u formuli (npr. B2*C2 D2). Kada kopiramo formulu sa
relativnim referencama na drugo mesto, adrese elija se pomeraju
za onoliko za koliko se odredite kopiranja pomera od originala.
Npr. u primeru na slici kada kopiramo formulu iz elije B7 (koja
sadri reference na drugi red) u eliju B8 sve reference u kopiranoj formuli (B8) e se promeniti tako da
pokazuju na trei red.
Apsolutne reference se definiu isto kao i relativne s tim to
imaju predznak $ ispred oznake kolone odnosno reda. Npr.
$A$1 znai apsolutna referenca na kolonu A i red 1. Ako
elimo moemo samo fiksirati kolonu: $A1, ili samo red: A$1.
Kada kopiramo formule koje sadre apsolutne reference,
reference se ne menjaju bez obzira gde je odredite. U
primeru na slici, formula je iskopirana iz elije B7 u eliju B8 (primetite za koje reference se menja broj
reda a za koje ne). (Savet: da bi relativne reference prebacili u apsolutne, selektujte ih i pritisnite F4).
Postoji sluaj kada apsolutne reference ne funkcioniu kako bi
moda oekivali. Npr. u tabeli prikazanoj na slici, imamo da se
profit rauna na osnovu najnovije vrednosti poreza. Kada bi
sada dodali novu vrednost poreza za 2008 godinu (desnim
dugmetom na 12-ti red, pa Insert), bez obzira to smo u
formuli u eliji B7 fiksirali vrednost $B$12, on e se promeniti
da bude $B$13. Ovakva situacija se reava upotrebom funkcije
INDIRECT koja vraa referencu na eliju iji naziv smo naveli
pod navodnicima. Npr, u primeru na slici umesto $B$12 bi trebalo da stoji: INDIRECT(B12). Sada kada
se ubacuje novi red, Excel nee videti da smo imali referencu na B12 zato to je ona u navodnicima (tj.
nije direktna referenca) i nee je ni menjati. Ali naa formula funkcionie zato to se prilikom
izraunavanja vrednosti INDIRECT funkcije B12 menja sa referencom na B12.

Korienje imenovanih opsega (Range names)


Opsezi se koriste za lake snalaenje u radnim listovima: npr, umesto da koristite opseg C2:C45, moete
samo koristiti Prodato (tj. Range name koji smo prethodno definisali za opseg C2:C45).
Ime opsega mora poinjati iskljuivo slovom i mora se sastojati od spojenih karaktera (ako elite da
razmaknete dve rei koristite znak _). Ne moete imenovati eliju tako da se podudara sa postojeim
imenima (npr. A1, B58, IS2002 i sl.) U jednom radnom listu moe postojati neogranien broj imenovanih
opsega, ali ne treba preterivati jer emo tee nai opseg koji nam treba i time ponititi njegovu
upotrebljivost.
Kreiranje opsega: selektujte jednu ili vie elija i promenite njihov naziv u posebnoj
eliji kao na slici. Drugi nain: ctrl+F3 (ili Insert->Name->Define) Define Name prozor
u ovom prozoru takoe moemo i brisati postojee opsege.
Korienje opsega: u formuli na mestu gde treba ukucati opseg samo ukucamo ime
naeg opsega (ili F3 da bi prikazali listu svih definisanih opsega, zatim izaberemo eljeni opseg).
Nekad je korisno defnisati opseg tako da zapravo bude konstanta: npr. PDV koji e biti 0,18. Ovakav
opseg moemo kasnije koristiti u formulama umesto korienja konstante ili referisanja neke elije. Da
bi definisali konstantu otvorimo Define Name prozor (ctrl+F3) i u polje Refers to ukucamo eljenu
konstantu. Primer korienja u formuli: =B18 * (1 PDV).
Da bi videli sve opsege, njihove vrednosti ili gde one referiu, na praznom listu uradite: F3 -> Paste list.
Ono to se verovatno najee koristi je automatsko imenovanje opsega. Selektujte opseg u tabeli
(selektujete jednu eliju i zatim ctrl+a). Pritisnite ctrl+shift+F3 (ili Insert->Name->Create) i izaberite
odakle Excel treba da izvue imena opsega (red, kolona, prvi ili poslednji red/kolona...).

Validacija unosa
Validaciju koristimo kada hoemo da obezbedimo da budui unos na radnom listu zadovoljava neke
unapred zadate kriterijume.
Npr, ako elimo da ograniimo unos u elijama B2:B30 da budu pozitivni celi brojevi do 100. Selektujemo
elije B2:B30, u meniju biramo Data->Validation->Whole number, between, min/max vrednost, pri emu
min i max mogu da budu reference na neke elije ili imenovane opsege.
Drugi koristan primer bi bio da recimo ograniimo unos duplih vrednosti (npr, za unos liste zaposlenih).
Za datu selekciju izabraemo Custom validaciju, i u prostor za kucanje formule ukucamo:
=COUNTIF($B$2:$B$30; B2) = 1

AutoFilter
Da bi aktivirali AutoFilter moramo imati selektovanu eliju koja pripada nekom opsegu. Kada smo
selektovali, kliknemo Data->Filter->Auto Filter. Dobiemo za svaku kolonu jedan dropdown meni iz kog
moemo birati vie opcija koje su generalno gledano samoobjanjive.
Ogranienje autofilter liste je to moe da prikae samo 1000 redova, i to uopte gledano za velike liste
postaje nepregledno izabrati samo jednu vrednost u listi. Da bi ovo prevazili posluiemo se trikom
grupisanja vrednosti. Npr, ako imamo liste imena i prezimena (ili uopte nekog teksta) dodaemo novu
kolonu koja e da izdvaja samo prvo slovo od vrednosti iz prve kolone: =LEFT(A2; 1).
Jo jedna zanimljiva opcija je da dodamo jednu kolonu koja e nam sluiti za pretraivanje liste. Npr, ako
nam se vrednosti od interesa nalaze u koloni A, dodaemo kolonu B bez naziva kolone. Vrednosti u
koloni B emo izraunavati po sledeoj formuli (ovde je data formula za eliju B2):
=IF(ISNUMBER(SEARCH($B$1;A2)); "Nadjen"; "Nije nadjen")
(ako elite pretragu osetljivu na mala i velika slova, koristite funkciju FIND umesto SEARCH).
Sada, kada ukucamo neku vrednost u eliju B1, kolona B e se popuniti vrednostima Nadjen i Nije
nadjen u zavisnosti od toga da li je ta vrednost pronaena u odgovarajuem redu A kolone. Ako imamo
ukljuen Auto format sada moemo birati da li elimo da prikaemo one redove koji sadre ili ne sadre
ovu vrednost, ime smo efektivno napravili pretraivanje po koloni na naem radnom listu.
Sumiranje vrednosti u auto filter listi se razlikuje u zavisnosti od toga da li koristimo SUM ili SUBTOTAL
funkciju. SUM e ignorisati prikaz filtera i uraunae sve vrednosti koje su date u opsegu. SUBTOTAL e
raunati samo redove koji su proli filter.

Uslovno formatiranje
Sa uslovnim formatiranjem (conditional formatting) moemo istai neke odreene vrednosti npr. da li
su neke vrednosti ispod dozvoljene i sl.
Selektujemo oblast za koju elimo da primenimo uslovno formatiranje, zatim iz Format menija
izaberemo Conditional Formatting. Zadamo kriterijum za formatiranje, i izaberemo format teksta koji
treba primeniti ako je uslov zadovoljen. Npr. Cell Value Is - less than - 3000 e primeniti format koji
izaberemo na sve elije koje imaju brojnu vrednost manju od 3000. Slino moemo dodavati i vie
uslovnih formata.
Ako imamo nazive kolona ili redova koji su zapravo brojevi (npr. godina 2008), da bi spreili da uslovno
formatiranje utie i na njih trebalo bi da ih promenimo tako to emo ih uneti sa jednim apostrofom pre
broja (2008). Time smo oznaili da je elija tipa teksta i njena vrednost e se ignorisati pri poreenju sa
brojevima u uslovnom formatiranju.

5
Pored osnovnih uslova za formatiranje mogue je uneti i uslov u obliku formule. Iskoristiemo ovo na
primeru senenja parnih redova (npr. zbog lakeg itanja u tampanoj verziji). Kao kriterijum biramo
Formula Is, a ukucavamo sledeu formulu: =MOD(ROW(); 2) = 0. U ovoj formuli MOD daje ostatak pri
deljenju sa 2, a ROW() daje broj reda za koji Excel trenutno ispituje da li zadovoljava uslov formatiranja.
Ukoliko je ovaj red neparni (npr, 3, 5, 7 itd...) pri deljenju sa 2 ostatak e biti 1 i nee proi uslov. Ako je
paran uslov je zadovoljen (zato to je jednako nula) i primenjuje se uslovno formatiranje.

Dinamiki opseg
Da bi napravili dinamiki opseg za rad, umesto definisanja fiksnog opsega (elije od do princip),
moemo kreirati region koji e se automatski proirivati kako budu dodavani redovi odnosno kolone.
Definicija regiona je data tekstom formule:
=OFFSET(Trgovina!$A$1,0,0,COUNTA(Trgovina!$A:$A), COUNTA(Trgovina!$1:$1))
Prva vrednost OFFSET funkcije je referenca na prvu-levu eliju opsega, druga i trea treba da budu 0, a
pretposlednja i poslednja definiu koliko opseg ima redova i kolona (respektivno). Da bi se ovaj broj
stalno uveavao kako se redovi i kolone menjaju (dodaju ili briu) koriena je funkcija COUNTA (count
all), koja e brojati koliko ima popunjenih redova u koloni A, odnosno kolona u redu 1. Zbog ovoga ne
smemo dodavati neke podatke na ovaj list ako ne pripadaju naem opsegu (ili bar ih treba uvati tako da
se ne nalaze u prvoj koloni/redu).

Pivot tabela, Pivot grafik


Pivot tabela je veoma koristan alat za brzo
sumiranje i pregled podataka. Pivot tabelu kreiramo
iz menija Data->PivotTable and PivotChart Report.
Poinje Wizard koji nas vodi kroz definisanje
podataka neophodnih za Pivot tabelu.
U prvom koraku biramo odakle elimo da
dohvatimo podatke ako su podaci u Excel-u
(najei sluaj) biramo prvu opciju. U drugom
koraku izaberemo opseg u kome se podaci nalaze, i
nakon toga konano biramo i gde elimo da se tabela kreira (na istom ili na novom listu).
Kreiranje sadraja PivotTabele
se vri prostim prevlaenjem
naziva kolona na eljeno mesto.
Npr. u primeru koji je podeljen
na vebama probajte da
prevuete Region u Row

6
Fields deo, i Ukupno u Data Items. Ovako smo dobili listu po regionima i ukupne ostvarene promete
po svakom gradu. Ako elimo da vidimo koji prodavac je prodavao gde, prevui emo kolonu Prodavac
u Column Fields. Na kraju, lista bi trebalo da izgleda ovako:

Da bi dobili prikaz tabele po gradovima i listu proizvoda koji su tamo prodati, prevui emo Region u
Page Fields, a u Row Fields emo sad staviti
Predmet. Rezultat bi trebalo da bude slian
kao na slici.
Promenom regiona biramo prikaz po
gradovima (ovde su prikazani podaci za
Beograd).
Duplim klikom na Sum of Ukupno moemo
promeniti prikaz u procentualni. Prvo proirimo prikaz vie opcija (klik na dugme Options...), i izaberemo
% of row.
Grupisanje podataka: Dodajte kolonu Datum deo sa kolonama a uklonite Prodavac. Da bi prikazali
prodaju po mesecima i godini, kliknuemo desnim dugmetom na kolonu Datum->Group and Show
Data->Group... U ponuenoj listi selektujemo i Months i Years. Dobili smo nov izgled tabele grupisan po
vrednostima za svaki mesec svake godine. Radi bolje preglednosti, prevui emo Years da bude u Page
Field delu. Izgled tabele bi trebalo da izgleda slino kao na slici (izabrana je 2006 godina u Page Field
delu).

Na slian nain moemo grupisati i druge tipove podatka (npr. po broju godina, po koraku od 10 godina
bi dobili grupe 10-20 god, 20-30, itd...).
Da bi od Pivot tabele dobili Pivot grafik, dovoljno je prvo kliknuti na
neku eliju tabele, zatim na Chart Wizard ikonicu kao na slici.

Rad sa nizovima (Array)


Nizovi (Array) predstavljaju niz od dve ili vie vrednosti. Npr. kada koristimo funkciju za sumiranje:
SUM(A1:A50) opseg od A1:A50 predstavlja jedan niz vrednosti.
Postoje neke formule koje ne mogu da se izraunaju na standardan nain, odnosno red po red. Npr:
=SUM(A1:A50*B1:B50)

Funkcija SUM bi mogla da izrauna ovaj izraz kada bi to bio samo jedan opseg. Meutim, ovde ima dva
opsega i nije najjasnije koje vrednosti iz prvog opsega se mnoe sa kojim vrednostima iz drugog opsega.
Da bi ovo obradili, formulu je potrebno uneti umesto sa standardnim pritiskom tastera enter na kraju, sa
ctrl+shift+enter. Na ovaj nain, specificirali smo da je ovo Array formula, i ona se od ostalih razlikuje po
tome to Excel ispisuje vitiaste zagrade ({ i }) oko tela formule. Funkcionisanje array formule (na
prethodnom primeru): svaki opseg se obrauje red po red, odnosno, prvo e se raditi sa prvim redom
oba opsega (pomnoie se vrednosti A1 i B1), zatim sa drugim itd... Dobijeni rezultati se interno u Excelu smetaju u nov Array na kome se konano moe primeniti formula SUM. Oekivano, opsezi moraju
imati jednak broj redova u suprotnom dobiemo greku (#N/A).
esta greka je da se posle izmene Array formule ista ne potvrdi (ne unese) sa ctrl+shift+enter, ve samo
sa enter, to e uslediti grekom (#VALUE). Da ispravite ovu greku, kliknite na eliju, pritisnite F2 da bi
menjali njen sadraj i potvrdite je sa ctrl+shift+enter. Array formulu ne moete uneti tako to ete runo
upisivati zagrade oko vae formule - {=SUM(A1:A50*B1:B50)} - Array formule se mogu unositi samo na
prethodno opisani nain.

Greka u sabiranju
Ukoliko radite sa decimalnim vrednostima, a u tabeli ih prikazujete ih kao celobrojne, moete doi u
situaciju da se brojevi nekorektno sabiraju. Posmatraemo na primeru sledee tabele:
Prikazano je kao da je 1+1=3. Problem je nastao zbog toga
to e Excel zaokruiti decimalne vrednosti prilikom
njihovog prikazivanja i to na najbliu vrednost i tu
vrednost e prikazati. Meutim, prilikom raunanja koristi se prava vrednost (a ne prikazana), odnosno
u eliji B4 na prikazanom primeru, izraunata vrednost je 2.98 bez obzira to se sabiraju vrednosti iji je
prikaz u formatu celih brojeva. Naravno, kada se ta vrednost od 2.98 zaokrui na najblii celi broj,
dobiemo broj 3. Ovo za velike liste smanjuje greku pri sabiranju, ali postoje sluajevi (pogotovo za
male tabele) kada nam je potrebno da sabiramo samo vrednosti koje su zaokruene. Za reenje ovog
problema postoje dva naina.
1. Izaberite Tools->Options->Calculations i tiklirajte opciju Precision As Displayed. Ovime se sve
vrednosti u elijama odsecaju na onoliko decimala koliko je definisano formatom elije. Ovu
akciju nije mogue kasnije ponititi.
2. Koristite Array formule sa zaokruivanjem za gornji primer: {=SUM(ROUND(B2:B3;0))}.

Zatita radnog lista


Sve elije su po default-u zakljuane (locked). Meutim, ovo postaje aktivno tek kada se aktivira zatita
radnog lista (worksheet). Pre zatite, na probnoj tabeli, selektujte nekoliko elija i u format cells meniju,
u poslednjoj stavci (Protection) odtiklirajte Locked, a na drugom opsegu tiklirajte Hidden da bi
demonstrirali upotrebu ove opcije. Kada ste zavrili aktivirajte zatitu lista: Tools->Protection->Protect
Sheet. Izaberite opcije koje elite da dozvolite/zabranite, opciono unesite ifru za zatitu i kliknite OK.
Sada je onemoguena izmena elija koje su zakljuane, a ne vidi se sadraj formula u elijama koje imaju
tiklirano Hidden.
Mogue je posle zatite dozvoliti izmenu nekih opsega po korisnicima i eventualno uz ifru. Korisnici
moraju biti user-i Windows operativnog sistema na kome se pokree Excel (ili lanovi Domena ukoliko se
radi o mrenom okruenju). Ovo je dostupno preko opcije: Tools->Protection->Allow Users To Edit
Ranges. Za svakog korisnika moemo definisati posebnu ifru, i moemo za isti opseg elija dodati vie
od jednog korisnika u listu.
Zatita celog dokumenta se vri prilikom njegovog uvanja. File->Save As. Izaberite Tools->General
Options

Unesite polja Password to open i Password to modify u


zavisnosti od toga da li elite da zatite dokument od
otvaranja ili od izmena.
Napomena: Prilikom korienja zatite radnog lista, ne smete raunati na pouzdanost zatite svaka
zatita ifrom se moe probiti, samo je pitanje vremena. Zatita ima smisla ako elite da zatitite podatke
od sluajne izmene ili nasuminog pokuaja zloupotrebe od obinih korisnika, ali ako neko zaista eli da
otvori va dokument ili da vri izmene, uvek postoji nain (ovo vam zapravo moe biti korisno u
sluajevima kad zaboravite ifru).

VBA / Makroi
Makro je sekvenca instrukcija kojima se automatizuje neki proces. Na primer, jedan makro bi mogao da
bude: postavi pozadinsku boju elije na zeleno, postavi boju teksta na belo, podesi font da bude veliine
12. Ako primetimo da neki proces stalno ponavljamo najverovatnije je da bi nam se isplatilo da
napravimo makro koji jednom snimimo i kasnije moemo da ga koristimo svaki put kad nam to zatreba.
U Excelu makroi se piu koristei varijantu jezika Visual Basic (VBA = Visual Basic for Applications). VBA
je standardni jezik za vie Microsoft-ovih proizvoda, i principe koje nauite u Excelu moete primenjivati
npr. u Wordu, itd Takoe, makroi se esto koriste i u mnogim drugim aplikacijama (Photoshop npr
Window->Actions, itd) mada ne koriste VBA ve imaju svoju sintaksu.
Nakon default instalacije MS Office-a, makroi koje otvaramo sa dokumentima ne funkcioniu. Ovo je
uinjeno sa razlogom - ranije su se esto upisivali virusi u obliku makroa i ubacivali u dokumente. Samo
otvaranje takvog dokumenta bi zatim izazvalo aktiviranje virusa i zbog toga su proizvoai odluili da
onemogue pokretanje makroa osim ako korisnik to eksplicitno ne eli. Ako su vam podeavanja takva
da je pokretanje makroa onemogueno ispisae vam se sledea poruka prilikom pokretanja makroa:

Meutim, ovo vai samo za makroe koje dobijamo iz drugih dokumenata makroe koje sami piemo
(koje smo sami kreirali) su podrazumevano sigurni i Excel e vam dozvoliti da ih piete i pokreete.
Ako elite da smanjite nivo sigurnosti da bi omoguili pokretanje tuih (nepotpisanih) makroa, koristite
opciju: Tools->Options->Security->Macro Security. Po default-u izabran je nivo bezbednosti High
spustite na Medium ako elite da vas pita pre svakog pokretanja makroa (to je i preporuka ovde), ili na
Low ako elite da svi makroi mogu da se izvravaju bez vae prethodne saglasnosti. Da bi promene koje
ste ovde napravili postale aktuelne morate zatvoriti i ponovo otvoriti Excel.

Snimanje makroa
Najjednostavnija upotreba makroa je snimanje akcija korisnika.
Ne morate da poznajete VBA da bi mogli da ga koristite. Da ne bi
smo previe koristili Tools->Macro meni dodaemo novi Toolbar:
kliknite desnim dugmetom na Toolbar deo i izaberite Visual Basic (Toolbar su sve ikonice/dugmii koji se
najee nalaze odmah ispod padajueg menija Font, New, Open, Save, itd). Za sad emo koristiti
samo prva dva: pokretanje i snimanje makroa. Tree dugme pokree podeavanja za bezbednost (isto
kao Tools->Options->Security), a ostale dugmie emo koristiti neto kasnije.

10
Izaberite jednu eliju. Kliknite na dugme za snimanje i pojavie se prozor u kome definiete podatke o
makrou:

Macro Name: Naziv makroa. U naem primeru nazvaemo ga Zeleno


Shortcut key: Preica za pokretanje makroa. Kliknite na ovo polje, drite Shift i pritisnite L (ili
neko drugo slovo). Sledei put kad budemo hteli da pokrenemo makro, dovoljno je da
pritisnemo ctrl+shift+L (ne moramo da biramo na makro iz menija).
Store macro in. Ovde definiemo gde elimo da snimimo na makro. Postoje tri opcije:
o This workbook makro e se snimiti u workbook-u u kome radimo, i bie dostupan
samo dok je on otvoren
o New Workbook napravie se novi workbook, i makro e se snimiti u njega
o Personal Macro Workbook makro e se sauvati u posebnom fajlu personal.xls. Ovaj
fajl je poseban po tome to se nalazi u /XLStart folderu (najee to je putanja:
C:\Documents and Settings\myUsername\Application Data\Microsoft\Excel\XLSTART),
to znai da se otvara automatski pri pokretanju Excel-a. Excel ovaj dokument otvara i
automatski primenjuje Hide za workbook (podsetnik: da sakrijete/prikaete otvorene
workbook-ove koristite meni: Window->Hide/Unhide). Osim toga, ovo je sasvim
obina Excel tabela, ba kao i bilo koja druga. U Personal.xls uvamo sve makroe koji
nisu specifine prirode, tj. koje moemo da primenjujemo na vie dokumenata.

Kad ste zavrili sa definisanjem makroa, poinje snimanje makroa: promenite pozadinu elije u zelenu,
promenite boju teksta u belu, i pritisnite stop dugme. Upravo smo napravili makro koji e izabranu eliju
promeniti tako da ima zelenu pozadinu i beli tekst. Da bi pokrenuli makro, prvo selektujte neke elije
koje elite da promenite, kliknite na dugme koje podsea na Play, izaberite makro Zeleni i zatim Run.
Naa selekcija se promenila tako da odgovara onome to smo definisali kad smo snimali makro.
Da bi videli koje akcije smo snimili u makro, u meniju za pokretanje makroa (dugme Play, ili Alt+F8, ili
Tools->Macro) izaberite eljeni makro i zatim Edit (ako ste snimali u Personal Macro Workbook
moraete da ga prvo uinite vidljivim Window->Unhide). Otvorie se Visual Basic Editor (VBE) u kome
su prikazani makroi svih dokumenata koji su trenutno aktivni. U ovom prozoru moemo menjati kod koji
smo prethodno snimili, ali i pisati nov kod.
Treba primetiti da smo prvo selektovali eliju, a zatim poeli snimanje makroa. Da smo sluajno uradili
drugaije selekcija elije bi se upisala u makro, i svaki put kad pokrenemo makro prvo bi se selektovala ta
elija, a zatim bi se radile ostale akcije.

11

Visual Basic Editor


Ovo je program koji je zaseban i ne zavisi od Excel-a ali tesno sarauju. Da bi pokrenuli ovaj editor
moemo izabrati u Excel-u: Tools->Macro->Visual Basic Editor, ili Alt+F11 (ili, kao to je opisano ranije
kada elimo da izmenimo neki makro i kliknemo na Edit). Prikazae se sledei prozor:

Project Explorer

VB kod

U ovom prozoru je prikazan kod svih trenutno otvorenih dokumenata. U Project Explorer-u se nalazi
prikaz svih otvorenih dokumenata, grupisanih u VBAProject (jedan workbook = jedan VBAProject). Svaki
projekat sadri Microsoft Excel Objects u kome su svi spreadsheet-ovi, kao i ceo Workbook. Drugu grupu
ine moduli (Modules). Moduli su kutije (eng. containers) u kojima se uva kod. Videete da se na
makro upisao u jedan modul (Module1). Kod moemo pisati ili u modulima ili vezano za odreeni Sheet.
Treba razlikovati tri vrste koda koje emo pisati:
1. Procedure
2. Funkcije
3. Event code odnosno, kod koji se izvrava kada nastupi odreeni dogaaj (dupli klik, otvaranje
dokumenta, promena selekcije, itd)
Svaka vrsta ima svoje specifinosti zbog kojih se drastino razlikuje od drugih.

Procedure
Procedure moete shvatiti kao komande koje se izvravaju bilo na zahtev korisnika ili iz neke druge
procedure. Primer procedure bi bio: oseni eliju da bude siva, upii neki tekst, i sl. U optem sluaju

12
procedure se koriste kada treba neto napraviti, promeniti, kreirati Za razliku od funkcija, procedure
nemaju povratnu vrednost.
Primer:
Sub Macro1()
' Promena pozadine celije na zelenu i boju teksta na belu.
With Selection.Interior
.ColorIndex = 10
.Pattern = xlSolid
End With
Selection.Font.ColorIndex = 2
End Sub

Funkcije
Funkcije se piu veoma slino kao procedure, meutim, funkcije uvek vraaju jednu vrednost (ba kao i
funkcije u Excel-u npr. SUM, COUNT, itd). Moemo ih koristiti unutar drugih funkcija/procedura, ili u
radnim listovima. Funkcije koje koristimo u worksheet-u ne mogu da ga menjaju! Ako pokuamo da
izmenimo worksheet bilo gde unutar funkcije ona e vratiti greku (iako funkcije koje pozivamo iz
procedura mogu da menjaju izgled worksheeta, ta praksa se ne preporuuje).
Primer:
Function Saberi(a1, a2)
'Sabiranje brojeva a1 i a2
Saberi = a1 + a2 'vraanje vrednosti funkcije vrimo tako to imenu funkcije
'dodelimo vrednost
End Function

Event Code
To je kod koji e se izvravati svaki put kada nastupi neki dogaaj (event=dogaaj). Po sutini, event
code su procedure. Npr. moemo napisati kod koji se izvrava svaki put kad korisnik promeni selekciju
elije (tj. selektuje neku drugu eliju), u trenutku pre tampe, kad se aktivira list, itd... Event kod se ne
moe pisati u modulima, nego samo u kodu koji je predvien za worksheet/workbook (ali naravno
moemo odatle pozivati druge procedure/funkcije koje moemo smestiti bilo gde, pa i u modul).
Primer:
Private Sub Workbook_Open()
MsgBox "Dobrodosli u workbook sa makroima"
End Sub

Zakljuak:
Kada poinjete da piete kod, i kad odluujete ta vam treba, koristite funkcije ako vam treba neto da
se izrauna; ako treba neto uraditi/promeniti koristite procedure; ako treba reagovati na neke
dogaaje onda piite event code. Ali ak i ako pogreite i ponete npr. da piete funkciju a treba vam
procedura izmene je lako napraviti zato to je telo, tj. sadraj koda isti i dovoljno je promeniti
zaglavlje gde se definie procedura odnosno funkcija.

13

Objekti
Objekti
Objekti ine najbitniju stavku u VBA i od sutinskog je znaaja pravilno ih shvatiti. Svaki objekat definie
svoja ponaanja (tj. metode) i osobine (tj. podeavanja). Objekti su npr. Application, Worksheet,
Workbook, selektovani opseg elija, jedna elija, itd Osobine npr. elije bi bili okviri (borders), kom
redu pripada, kojoj koloni, sadraj elije, koja je pozadinska boja, boja fonta, veliina itd; ponaanje:
aktiviraj eliju (tj. da elija dobije fokus), dodaj komentar, uradi merge, obrii sadraj, itd
Kolekcije
Objekti iste vrste se nekad smetaju u kolekcije: npr. vie Worksheet-ova smetamo zajedno u
Worksheets kolekciju, vie elija u Cells Da bi dobili odreeni objekat iz kolekcije objekata navodimo
njegovo ime u zagradama, npr za odreeni worksheet: Worksheets(MojSheet). Sada na dalje moemo
raditi sa ovim izrazom potpuno iste akcije koje bi inae radili na jednom sheet-u.
Hijerarhija
Svaki objekat pored svojih osobina i ponaanja moe sadrati druge objekte npr. Workbook sadri
Worksheet objekte, Worksheet dalje ima Range objekte (opseg elija), koji opet ima elije itd Da bi
pristupili nekom objektu u VBA kodu, specificiramo njeno mesto u hijerarhiji koristei znak . (taka).
Na primer:
Application.Workbooks(Book1).Worksheets(Sheet1).Range(A1)

Ako izostavimo poetak hijerarhije podrazumevae se trenutno aktivni objekat. U prethodnom primeru,
ako izostavimo prva dva objekta i napiemo:
Worksheets(Sheet1).Range(A1)

to znai da referiemo Workbook koji je trenutno aktivan. Ako izostavimo i Worksheets(Sheet1), znai
da radimo na trenutno aktivnom sheet-u i moemo samo pisati Range(A1). Ovo je korisno zato to isti
makro moemo koristiti na vie worksheet-ova, u zavisnosti od toga koji je trenutno aktivan.

Programiranje
Osnovni principi
Linija koda moe biti proizvoljno dugaka. Ako elimo moemo je nastaviti u sledeem redu ako red
prekinemo sa znakom _ . VB e onda taj znak ignorisati i prei e da obrauje sledei red kao da je u
istom redu sa prethodnim. Na primer:
varA = Cells(1,2).Value * Cells(3,3).Value Cells(3,4).Value * _
Cells(5,5).Value / _
Cells(2,2).Value - 3

14
Obratiti panju na uvlaenje u svim sledeim primerima nije obavezno ali veoma pomae da lake
sagledamo koji red pripada gde (da li je ugnjeden ili ne, da li se nastavlja od prethodnog reda itd...).
Komentari koje dodajemo se ne izvravaju. Svaki komentar poinje znakom apostrofa () i vai do kraja
linije. Drugim reima, VB e ignorisati sve to pie posle apostrofa. Zbog toga, moemo pisati neto
ovako:
Sub Macro1()
' Komentar koji stoji samostalno u redu
With Selection.Interior ' komentar iza linije koda
.ColorIndex = 6 ' Boja 6 je uta boja opisujemo kod koji nije najjasniji
.Pattern = xlSolid
End With
Selection.Font.ColorIndex = 3 'Boja teksta crvena (tj. 3)
End Sub

Dodela vrednosti se vri prostim operatorom =. U odredite koje je sa leve strane jednakosti se
upisuje izraunata vrednost sa desne strane. Uvek se prvo izrauna desna strana jednakosti, a zatim se
to upisuje u odredite. Na taj nain, moemo zapisati:
varA = 0 'u varA upisujemo vrednost nula (0)
varA = varA + 1 'u varA upisujemo vrednost: varA+1, tj. 0+1, tj. 1

U ovom primeru, matematiki gledano poslednji red je netaan / neispravan, ali kao to smo rekli ranije
prvo se izrauna vrednost sa desne strane jednakosti, i zatim se to upie u varA. Leva strana jednakosti
nas ne interesuje do samog kraja kada treba u nju da upiemo vrednost.
Kada elimo da dodelimo promenljivoj vrednost nekog objekta, moramo prvo napisati kljunu re Set:
Dim varA As Range
Set varA = ActiveCell

Sad na dalje moemo koristiti varA isto kao to bi koristili ActiveCell zato to pokazuju na isti objekat.
Jo jedna vrsta dodele je kada odreenim paramentrima neke procedure/funkcije dodeljujemo
vrednosti. U tom sluaju, parametrima dodeljujemo vrednosti sa :=. Na primer:
Workbook.Open fileName:="Book1.xls", password:="pswd"

Promena osobine osobine moete shvatiti i kao podeavanja objekta. Npr. jedno od podeavanja za
eliju je njena vrednost, tj. ono to u njoj pie. Sledei kod e promeniti vrednost elije A3 tako da u njoj
pie re Test:
Range(A3).Value = Test
'sledei red ima potpuno isti efekat, ali eliji pristupa na drugi nain:
Cells(3,1).Value = Test ' trei red, prva kolona u vrednost upii Test

U prethodnom primeru na dva razliita naina smo doli do istog objekta elije A3. Koji ete nain da
koristite je potpuno nebitno, ali da vam treba referenca na neki opseg (npr. A2:A40, ili imenovani opseg
podaci, vrednosti itd) morali bi da koristite Range.

15
itanje osobine je veoma slino upisivanju vrednosti, samo to sada umesto upisivanja vrednosti u
osobinu, itamo osobinu (tj. smetamo je na desnu stranu) a na levu stranu emo staviti neku
promenljivu:
varA = Cells(1,3).Value ' upisujemo u varA vrednost elije C1
Cells(1,4).Value = varA ' u D1 upisujemo vrednost koju smo malopre proitali iz C1
Cells(2,2).Value = Cells(5,1) 'u B2 upisujemo vrednost iz A5

Matematike operacije su veoma sline drugim programskim jezicima. Na primer:


varA = varB + varC * varD / varB varD^2
' imamo redom: sabiranje, mnoenje, deljenje, oduzimanje, stepenovanje stepenom 2

Logike operacije su opet, veoma sline onome to ste verovatno sretali. Primer:
varA
varA
varA
varA

=
=
=
=

(varB > varC) ' u varA e


varC=varD 'prva jednakost
varD<=varE 'da li je varD
varE<>varA 'da li je varE

stajati TRUE ili FALSE


je za dodelu (uvek), a druga deo logike operacije
manje ili jednako od varE
razliito od varA

Promenljive u VB mogu da se definiu eksplicitno: Dim varA as Integer, ali imate slobodu da
jednostavno koristite promenljive i koje niste definisali, i VB e automatski da ih definie za vas. Nazivi
promenljivih moraju poeti slovom, mogu sadrati brojeve, ali ne i znak razmaka (ako elite da razmak
bude deo naziva promenljive koristite znak _). Primer:
Dim varA as Integer 'eksplicitno deklariemo da je varA celobrojnog tipa
varA = 12 'dodeljujemo joj vrednost 12
varB = varA * 2 'iako nismo deklarisali varB, upisujemo vrednost u nju
varA = varB / 4 'varB kasnije moemo koristiti potpuno ravnopravno

Tip podatka predstavlja vrstu podatka sa kojim radimo. Postoje vie standardnih tipova: Integer
(celobrojni), Double (decimalni), String (tekstualni), Boolean (logiki), itd... Takoe, svaki objekat u Excelu je poseban tip podatka Workbook, Worksheet, itd... Tip podatka odreuje ta moemo sa tim
podatkom da radimo. VisualBasic ne kontrolie u trenutku pisanja koda da li ono to radimo odgovara
tipu podatka: npr, moemo napisati: 3 * Workbooks(Sheet1), ali e zato prijaviti greku kada bude
pokuao da izvri kod. Neki smatraju da je ovo glavni nedostatak VB jezika zato to dozvoljava veliki broj
greaka u vremenu izvravanja (nije strong typed).
Velika i mala slova ne prave razliku za VB ako i stavimo negde malo slovo gde treba veliko, VB e
prepoznati na koju promenljivu/objekat se odnosi (case insensitive).
Kontrolisanje toka izvravanja
Kod se standardno izvrava jedan red za drugim. Meutim, ima sluajeva kada nam je potrebno da neki
kod izvrimo pod nekim uslovima, da neki deo koda ponavljamo odreen broj puta itd Zbog ovoga
postoje razliite dodatne komande kojima moemo da kontroliemo kako e da tee izvravanje koda.
Svaka od dole navedenih konstrukcija moe da se ugnjedava u samu sebe ili u druge komande, tj. moe
se posmatrati kao jedna zaokruena jedinica koda.

16
If-Then-Else konstrukcija omoguava da izvravamo neki kod samo pod odreenim uslovom. Sintaksa:
If uslov Then
Naredba1
Naredba2

Else
Naredba3

End If

Ako je uslov taan (tj. izraunava se na TRUE) onda e se izvriti Naredba1, Naredba2 i ostale ako
postoje. Ako je uslov netaan, izvrava se deo koda u Else grani tj. Naredba3 (i ostale ako postoje).
Ako piemo If-Then-Else u vie redova kao u gornjem primeru, obavezno je da naredbu zavrimo sa
End If. Ako nam Else deo nije potreban moemo izostaviti celu tu granu..
Konkretan primer:
If Cells(1, 1).Value = True Then
Cells(2, 2).Value = "Tacno"
Else
Cells(2, 2).Value = "Netacno"
End If

Ili:
If Cells(1, 1).Value = True Then
Cells(2, 2).Value = "Tacno"
End If

Ili:
If Cells(1, 1).Value = True Then Cells(2, 2).Value = "Tacno"

Select-Case je naredba koja je po funkciji slina If-Then-Else naredbi sa tom razlikom to se uporeuje
vie vrednosti, bez potrebe za ugnjedavanjem If delova. Sintaksa:
Select Case var
Case uslov1
Naredba1

Case uslov2
Naredba2

End Select

Promenljiva iju vrednost ispitujemo je oznaena sa var. U svakom Case delu ta vrednost se ispituje da li
je jednaka uslovu uslov1, uslov2 itd Ako je taan neki uslov, tada se izvrava odgovarajui set naredbi.
Npr, ako je taan uslov1, onda e se izvravati Naredba1 (i ostale ako postoje, sve do sledeeg Case
dela), ako je taan uslov2, izvrava se Naredba2, itd Ako u uslovima treba da iskoristimo vrednost var
(npr. var>2), onda piemo i kljunu re Is: Case Is > 2. Za operator jednakosti to nije potrebno (Case 4 e
ispitivati da li je var = 4).

17
Primer:
Select Case ActiveCell.Value
Case Is < 0
ActiveCell.Font.ColorIndex = 3
Case 0
ActiveCell.Font.ColorIndex = 5
Case Is >0
ActiveCell.Font.ColorIndex = 1
End select

For-Next petlja omoguava da neki deo koda ponavljamo odreeni broj puta. Sintaksa:
For var = x To y
Naredbe
Next var

Promenljiva var koristi kao broja prolaza kroz petlju pri svakom prolazu uveava se za 1 (ime
promenljive je proizvoljno). U prvom prolazu ova promenljiva dobija vrednost x, a petlja e ii dok god
ne dostigne vrednost y. U svakom prolazu izvrava se set komandi koji je unutar For petlje (obeleen sa
Naredbe). For petlju obavezno zavravamo sa Next var (ime promenljive nije neophodno, ali je
poeljno jer olakava razumevanje koda).
Konkretan primer:
Suma = 0
For iBr = 0 To 100
Suma = Suma + iBr
Next iBr

Ovaj primer e sabrati brojeve od 0 do 100. Rezultat sabiranja imamo u promenljivoj Suma. Sledei
primer upisuje redne brojeve u prvih 100 elija kolone A:
For iBr = 1 To 100
Cells(iBr, 1).Value = iBr
Next iBr

Postoji jo jedna konstrukcija koja se koristi za For naredbu kada je potrebno da proemo kroz sve
objekte neke kolekcije objekata. Tada e For naredba poinjati sa: For Each obj In Coll (ostalo je sve
isto), odnosno u prevodu: ponavljaj za svaki objekat obj u kolekciji Coll. U tom sluaju, objekat se ne
uveava za jedan kao u prethodom sluaju ve e za svaku sledeu iteraciju dobiti sledeu vrednost u
kolekciji (zbog toga je bitno da tu kolekciju ne menjamo unutar petlje).
Na primer, ako elimo da svaku eliju selekcije promenimo tako da sadri svoj redni broj:
varI = 0
For Each Item In Selection
varI = varI + 1
Item.Value = varI
Next Item

Ovo je vrlo korisno kada radimo sa nekom kolekcijom u kojoj ne znamo taan broj objekata a elimo da
ih proemo sve.

18
With je kljuna re koju emo koristiti u prilikama kada esto pristupamo istom objektu. Nema neki
funkcionalni znaaj za program osim to nam skrauje vreme pisanja. Sintaksa:
With objekat
Naredbe
...
End With

Objekat je neki objekat ije osobine ili ijim objektima elimo da pristupamo u delu Naredbe. Na primer,
umesto da piemo dugaki kod:
Selection.HorizontalAlignment = xlCenter
Selection.VerticalAlignment = xlCenter
Selection.WrapText = False

moemo da piemo skraeno:


With Selection
.HorizontalAlignment = xlCenter
.VerticalAlignment = xlCenter
.WrapText = False
End With

Interakcija sa korisnikom
Za sada koristiemo samo dve osnovne funkcije za interakciju InputBox i MsgBox, kojima emo uzimati
podatke od korisnika odnosno prikazivati poruke korisniku (respektivno). Detaljniju i mnogo opirniju
grafiku komunikaciju radiemo u delu sa UserForms.
InputBox je zapravo funkcija koja prikazuje korisniku poruku i prua mu prostor za unoenje proizvoljnog
teksta. Kada korisnik klikne OK vrednost koju je ukucao je sadrana u povratnoj vrednosti funkcije.
Primer:
inp = InputBox("Tekst poruke", "Naslov", "Default vrednost")

U ovom primeru, kada se pokrene makro, korisniku se prikazuje sledei prozor:


Kada klikne OK, InputBox e vratiti vrednost koju je on
uneo kao rezultat funkcije, i u naem primeru to emo
sauvati u promenljivu inp. Ako korisnik klikne na
Cancel InputBox e vratiti vrednost praznog stringa:
. Naslov i Default vrednost u pozivu ove funkcije
moemo izostaviti, dok je tekst poruke obavezan.
MsgBox je takoe funkcija ali za razliku od InputBox ova funkcija samo ispisuje poruku korisniku. Kao
povratnu vrednost vraa informaciju da li je korisnik kliknuo na OK, Cancel, ili sl. Ove povratne vrednosti
su konstante definisane objektom VbMsgBoxResult. Npr, ako je kliknuo OK, MsgBox e vratiti
VbMsgBoxResult.vbOK, ako je kliknuo Cancel, vratie vrednost VbMsgBoxResult.vbCancel, itd... vrednost
ovih konstanti moete uvek dobiti tako to ete napisati VbMsgBoxResult i zatim kad pritisnete taku
prikazae vam se sve konstante koje su definisane. Primer:
inp = MsgBox("Tekst poruke", definicijaTastera, "Naslov")

19
Tekst poruke je tekst koji se ispisuje korisniku. Definicija tastera podrazumeva jednu od konstanti u
vbMsgBoxStyle objektu (npr. vbOKOnly, vbYesNo, vbOKCancel, itd...). Naslov je naslov poruke.
Jedan od primera bi mogao da bude sledei:
inp = MsgBox("Nedovoljno podataka. Nastaviti obradu?", vbYesNo, "Naslov")

Ovde pitamo korisnika da li eli da nastavi obradu i prikazujemo mu Yes i No dugmie. Njegov izbor
pamtimo u promenljivoj inp. Nakon toga, moemo da ispitujemo ta je kliknuo tako to emo porediti
inp sa vbMsgBoxResult.vbNo i vbMsgBoxResult.vbYes.

Primeri Procedure
Procedura koja ispisuje nazive worksheet-ova aktivnog Workbook-a u kolonu A
Sub PopuniSheetove()
Dim jedanSheet As Worksheet
Cells(1, 1).Value = "Lista sheet-ova" 'zadajemo naziv kolone
i = 2
For Each jedanSheet In Worksheets 'kreemo se kroz listu sheet-ova
Cells(i, 1).Value = jedanSheet.Name 'upisujemo vrednosti u elije
i = i + 1 ' uveavamo u kom redu e se sledei put upisati vrednost
Next jedanSheet
End Sub

Verzija 2: Ispis ide poevi od trenutno aktivne elije. Na kraju reformatirati ispis (AutoFit).
Sub PopuniSheetove2()
Dim jedanSheet As Worksheet
Dim C As Range
Set C = ActiveCell
i = 1
C.Value = "Lista sheet-ova"
For Each jedanSheet In Worksheets
C.Offset(i, 0).Value = jedanSheet.Name
' u prethodnom redu offset vraa referencu koja je za i redova
' ispod aktivne elije, i za 0 kolona u desno (to znai da e biti
' u istoj koloni gde je i aktivna elija)
i = i + 1
Next jedanSheet
'Kad smo zavrili, uradimo AutoFit na koloni u kojoj se nalazi naa elija
Columns(C.Column).AutoFit
'C.Column e vratiti broj kolone u kojoj se nalazi aktivna elija, a Columns
'kolekcija e zatim vratiti objekat kolone (Column) na kome primenjujemo AutoFit
End Sub

20
Zadatak 1: Napisati makro koji e napraviti okvire (borders) za tabelu sa 5 kolona i 10 redova, a poev od
trenutno aktivne elije. Spoljanji okvir tabele treba da bude duplih ivica, a unutranje ivice izmeu elija
standardne debljine i stila.
-

Selektujte neki opseg elija.


Snimite makro u kome ete promeniti sve ivice tako da odgovaraju zahtevu. Zaustavite snimanje
Promenite dobijeni makro tako da odgovara zahtevima u zadatku.

Zadatak 2: Napisati makro u kome se od korisnika trai da unese neku vrednost (Vr). Zatim, pitati ga da li
eli da koristi tu vrednost za uveanje vrednosti. Ako odgovori pozitivno elije od B1 do B20 uveati, u
suprotnom umanjiti za vrednost koju je prethodno uneo (Vr).
-

Koristiti InputBox za dobijanje vrednosti Vr


Koristiti MsgBox sa dugmiima Yes i No (vbYesNo)
elije menjati u For petlji koristei Cells(red, kolona).Value

Primeri Funkcije
Funkcija koja sabira brojeve od zadatog broja do krajnjeg broja:
Function Saberi(a1, a2)
s = 0
For i = a1 To a2
s = s + i
Next i
Saberi = s
End Function

Funkcija koja vraa kvadrat najveeg broja u opsegu


Function KvadratMax(opseg)
maxVr = 0
For Each cel In opseg
If (cel.Value > maxVr) Then
maxVr = cel.Value
End If
Next cel
KvadratMax = maxVr ^ 2
End Function

Zadatak 1: Napisati funkciju koja vraa prosenu vrednost za zadati opseg.


Zadatak 2: Napisati funkciju koja vraa polovinu minimalne vrednosti.

21

Rad sa objektima
Object Model
esto nam zatreba da vidimo koji objekat je kog tipa, ili da pronaemo gde u hijerarhiji objekata
moemo nai traeni objekat/osobinu, itd... Ovo sve se moe pronai u tzv Object Model-u u Visual Basic
Editor-u. Object Model je prozor koji slui iskljuivo za pruanje informacija i pretragu po objektima.
Aktivira se u meniju pod View->Object Model ili pritiskom na taster F2.

Traeni termin
za pretragu

Gde selektovani
objekat/osobina pripada
(ko su roditelji)
Tip selektovanog objekta/osobine (na
slici je to trenutno Object)
Najei nain upotrebe: ukucavamo neki termin koji elimo da naemo gde pripada (npr, elimo da
vidimo odakle sve moemo da pristupimo objektu Line), i zatim odluujemo ta nam treba u zavisnosti
od roditelja koji su ponueni (tj. kojoj klasi pripada).

Utvrivanje tipa objekta


Kada posle imena objekta stavimo taku, oekujemo da nam Excel izlista sve osobine, metode, decu
objekte i dogaaje koje taj objekat podrava. Meutim, za neke ovo nije mogue npr. ako stavimo
taku posle Selection objekta oekujemo da dobijemo sve njegove osobine, ali problem je u tome to se
taj objekat stalno menja nekad korisnik selektuje jednu eliju, nekad selektuje neki crte na worksheetu, nekad grafik, itd... Zbog toga, Selection je objekat opteg tipa Object, koji nema nijednu mogunost.
Tek se u trenutku izvravanja koda zna ta je zapravo sadrano u tom Selection objektu, i kod koji smo
kucali ili moe ili ne moe da se izvri (npr, ako koristimo Selection da bi pristupili nizu elija sve e biti

22
OK ako je zaista i selektovan niz elija, ali ono to je problem je to emo dobiti greku ako je
selektovana linija, kvadrat ili sl. iz Drawing toolbar-a).
Da bi predupredili ove greke koristiemo funkciju TypeName koja e vratiti trenutni tip podatka koji je
prosleen kao parametar. Npr. TypeName(Selection) e vratiti Line ako je selektovana linija, Range ako
je selektovana jedna ili vie elija itd Sledei kod e uveati vrednost u selektovanim elijama samo ako
je zaista i selektovan opseg elija (tj. Range):
Sub Uvecaj()
If TypeName(Selection) = "Range" Then
For Each C In Selection
C.Value = C.Value + 1
Next C
End If
End Sub

Kada smo utvrdili da se radi o objektu eljenog tipa, moemo tu informaciju koristiti da radimo sa
promenljivima koje su tano definisanog tipa:
Sub Uvecaj()
If TypeName(Selection) = "Range" Then
Dim c As Range
For Each c In Selection
c.Value = c.Value + 1
Next c
End If
End Sub

Sada kad god budemo koristili c u kodu imaemo sve prednosti toga to tano znamo koje osobine i
metode c podrava kad stavimo taku iza c dobiemo kompletan listing, zato to je c tano
odreenog tipa Range.

UserForms
UserForms su zapravo Windows prozori iji izgled i ponaanje mi definiemo. Koristimo ih da bi dobili
informacije od korisnika, i za lake kontrolisanje korisnikovog unosa, i bilo ta drugo to inae ne bi mogli
da dobijemo upotrebom standardnih Excel funkcija, ili upotrebom naih makroa.
Pravljenje UserForms prozora se vri u dve faze: prvo rasporeujemo sve elemente po prozoru: tekst,
dugmie, checkBox-ove, opcije, itd..., a zatim piemo makroe kojima definiemo kako e se koji element
ponaati (npr, ta treba uraditi ako klikne dugme OK, ta ako klikne Unesi itd...).

Formiranje UserForms ekrana


Otvorite Visual Basic Editor (Tools->Macro->Visual Basic Editor, ili F11, ili ako ste aktivirali Visual Basic
toolbar imate VBE ikonicu). Kliknite desnim dugmetom na ime projekta u koji elite da smestite ekran
npr. VBAProject(Book1), zatim Insert ->UserForm. Prikazuje se ekran za izmene u dizajn modu. Postoje

23
dva moda rada: design u kome dodajemo i menjamo elemente; i runtime kada se prozor prikazuje
korisniku, tj. izvrava se.
Dobijamo ekran koji predstavlja radnu
povrinu za na nov ekran na slici je
predstavljeno
spoljanjim
prozorom
UserForms.xls UserForm1 (UserForm).
Unutar tog prozora mi definiemo izgled
naeg prozora koji emo u daljem tekstu
zvati radnom povrinom (na slici predstavljeno prozorom Izmena selektovane kolone). Kad se prvi put kreira UserForms ovaj
prozor e biti prazan. Popunjavamo ga
koristei elemente prikazane u Toolbox-u:
element koji elimo da koristimo prostim
prevlaenjem smestimo na radnu povrinu. Ako zaustavimo kursor mia iznad kontrole, pojavie se naziv
kontrole. Mi emo u ovom kursu raditi samo sa vrstama kontrola koje su izlistane u tabeli. Svaka
kontrola ima svoj set osobina (properties) koje menjamo u Properties prozoru (View->Properties, ili F4).
Najbitnije osobine su date uz svaku kontrolu u tabeli.
Kontrola

Opis

Bitan property

Label

Predstavlja obian tekst


koji ispisujemo na ekranu

Caption

TextBox

Mesto gde korisnik unosi


tekst

MultiLine mogunost unosa


vie redova
Text tekst koji je upisan u
kontrolu

CheckBox

Kutija za tikliranje

Value True/False tj. da li


je tiklirano ili nije

OptionButton

Biranje jedne od opcija

Value True/False, tj. da li je


opcija izabrana ili ne

ToggleButton
Frame

CommandButton

Dugme za
ukljuivanje/iskljuivanje
Kontrola ija jedina
uloga je da u sebi uva
druge kontrole
Glavni hvata dogaaja

Value True/False, tj. da li je


dugme utisnuto ili ne

Komentar
Najee se koristi da opie
korisniku ta se trai od njega,
funkciju prozora, dodatna
pojanjenja i sl.
Tekst koji korisnik unese moe biti
bilo koji niz karaktera, o emu treba
voditi rauna pri upotrebi ove
vrednosti u kodu
Najee koristimo kad treba da
dobijemo da/ne odgovor od
korisnika.
Za svaku opciju dodajemo poseban
option button, a korisnik na jednom
prozoru moe da izabere samo
jednu. Ukoliko nam treba vie
grupacija za opcije na istom prozoru,
moemo ih grupisati po frejmovima
Slina upotreba kao CheckBox,
samo sa drugaijim izgledom

Caption

Default, Cancel ako


korisnik pritisne <enter> ili
<esc> da li se automatski
poziva Click ovog dugmeta

Sve glavne dogaaje emo vezivati


za Click dugmeta.

24
Sve kontrole koje dodajemo na UserForm imaju vie osobina koje su im zajednike, od kojih su ovde
izlistane neke najbitnije/najkorisnije:

Caption koji odreuje ta na kontroli pie.


(Name) identifikator kontrole koji emo esto koristiti u naem kodu prilikom obrade unosa.
Postoje neki standardi za dodeljivanje imena kontrolama koji nam olakavaju da prepoznamo
tip kontrole iz njenog imena. Npr. TextBox-ovi uvek poinu sa txt a zatim se nastavlja sa logikim
imenom txtBroj, txtIme, txtLozinka, itd... Labele sa lbl, OptionButton opt, CheckBox chk,
CommandButton cmd, ToggleButton tgl, itd... Nije bitno koristiti ba tri slova, niti da to budu
ba ova slova, ali koju god sintaksu da uvedemo trebalo bi toga da se pridravamo u svom
daljem korienju zato to se time izbegavaju razni problemi koji mogu nastati kod sloenijeg
razvoja aplikacija u VB-u (ali i bilo kom drugom softverskom projektu).
Visible da li je kontrola vidljiva ili ne (u zavisnosti od nekih izbora moemo je sakriti ili
pokazati)
Enabled da li se korisniku dozvoljava da radi sa kontrolom ili ne
TabIndex kada korisnik pritiska Tab on e ii redom od kontrole do kontrole i to pratei ovaj
indeks od manjeg ka veem broju.
ControlTipText kada se kursor mia pozicionira iznad kontrole neko vreme, prikazae se ovaj
tekst (moemo koristiti da blie objasnimo neku opciju korisniku)
Locked ova opcija nema uticaja na korisnika koristimo je dok dizajniramo prozor da bi
osigurali kontrolu od sluajnog pomeranja.

Sve elemente smo reali na UserForm koji sam po sebi sadri neke osobine od kojih emo samo izdvojiti
Caption (naslov prozora), i StartUpPosition mesto gde se forma pojavljuje na ekranu prilikom
prikazivanja. Identifikator prozora naveden sa (Name) za sada stoji podeen na UserForm1, mada bi
mogli da ga promenimo npr. na frmUnos, ili slino.

Kodiranje ponaanja
Prvo emo napisati kod koji e prikazivati formu koju smo prethodno napravili. Taj kod piemo u modulu
gde smo i ranije pisali makroe. Za prikaz ekrana koristi se njegova Show metoda, na sledei nain:
Sub prikazi()
UserForm1.Show
End Sub

Ovaj makro moemo da pokrenemo na standardni nain, kao i bilo koji makro koji smo pokretali ranije
(npr, pozicioniranjem bilo gde na kod i pritiskom na F5 (odnosno klikom na play)). Kad se pokrene,
prikazae se forma koju smo malopre napravili. Obzirom da nismo iskodirali nikakve akcije za dugmie,
oni nee reagovati na klik. Na sledei zadatak je da napiemo kod kojim emo obraditi ponaanja
dugmia.

25
U VBE-u otvoriti UserForms, i duplim klikom na dugme koje je tu postavljeno otvoriemo kod koji e se
izvravati kada korisnik klikne na dugme.
Automatski e se ispisati format koda koji odgovara
kliku na dugme. Sve to napiemo ovde e se izvriti
kada korisnik klikne na dugme.
Dogaaj (Event) za
izabranu kontrolu

Ako elimo runo da dodamo neko ponaanje za bilo


koju kontrolu prvo izaberemo identifikator kontrole
(definisan u Property prozoru sa (Name)), a zatim dogaaj u kome elimo da izvrimo akciju. Ako u
UserForms prozoru u dizajnu duplim klikom kliknemo na bilo koju kontrolu VBA e automatski otvoriti
kod za default dogaaj (npr, za dugme e biti Click, za TextBox e biti Change, itd).
Kontrola

Dodaemo sada kod za Odustani dugme koji samo treba da zatvori prozor bez ikakve obrade:
Private Sub cmdOdustani_Click()
Unload UserForm1
End Sub

Unload je metoda kojom se unitava objekat koji je specificiran u ovom sluaju navodimo identifikator
naeg prozora UserForm1.

Oitavanje osobina elemenata u kodu


Sve osobine kontrola koje smo koristili prilikom dizajna mogu da se proitaju (i promene) i u kodu.
Pristup do osobina je potpuno isti kao i za bilo koje druge Excel objekte npr. da bi dobili tekst koji je
napisan u TextBox-u kome je (Name) podeen na txtBroj, koristiemo njegov property Text koji, kako
smo ranije naveli, definie ta je ispisano (bilo od ranije, bilo da je korisnik uneo u toku izvravanja koda):
msgBox Uneli ste & txtBroj.Text

Ovde smo tekstu Uneli ste dodali tekst koji je napisan u txtBroj.Text osobini, i sve to ispisali kao poruku
korisniku. Na slian nain moemo oitati bilo koju osobinu bilo koje kontrole.
Takoe, dok piemo kod za UserForm mi imamo i kompletan pristup standardnim objektima
Worksheet, ActiveCell, Selection itd Ako bi hteli da menjamo trenutno selektovane elije, od korisnika
moemo zahtevati da prvo selektuje neki opseg pre nego to nastavimo dalje, i slino.

26

Dogaaji na worksheet-u / workbook-u


Ranije smo videli da neke kontrole imaju default dogaaje npr. za CommandButton dogaaj Click, za
TextBox Change, itd Pored ovih default mogli smo da definiemo kod i za bilo koji drugi dogaaj
(dupli klik mia itd). Slino tome, i workbook i worksheet imaju svoje dogaaje.

Worksheet Events
Otvorite Visual Basic Editor (VBE) i u Project prozoru duplim klikom na ime sheet-a otvorite njegov kod
(npr. Sheet1). Prikazuje se standardni prozor za kod, gde moemo da selektujemo objekat i odreeni
dogaaj u njemu. Po default-u, u vrhu Code prozora prikazuje se (General) u Object box-u (levo), i
(Declarations) u Procedures/Events box-u (desno). Dok je izabran General mi piemo nae procedure i
funkcije. Meutim, u Object box-u pored General moemo izabrati Worksheet kao objekat i tom prilikom
automatski se bira default dogaaj za njega SelectionChange (tj. promena trenutne selekcije, odnosno
trenutak kad korisnik klikne na drugu eliju npr. Promena selekcije podrazumeva da se radi sa elijama
kada se selektuju grafiki elementi linija, kvadrat i sl. dogaaj se ne pali). U ovom kodu imamo
sledeu definiciju procedure, koju principijelno nikad ne bi trebali da menjamo:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)

Kljuna re Private ograniava vidljivost ove procedure na Sheet u kome trenutno radimo, tj. za koji
piemo kod ovo je tipino za bilo koji Event kod koji piemo. Posle kljune rei Sub ide ime objekta za
koji je dogaaj definisan, koji je donjom crtom odvojen od naziva dogaaja. Ono zbog ega je ovaj
dogaaj razliit od neeg to smo do sada radili je u tome to poseduje svoj parametar procedure
naveden u zagradama. Kada procedura za dogaaj ima parametar onda e taj parametar uvek dobiti
vrednost koja je relevantna za dogaaj u sluaju SelectionChange dogaaja, relevantna informacija je
novi opseg koji je selektovan. Koristei taj parametar, moemo na primer napisati sledei kod koji e
ispisivati adresu trenutno selektovanog opsega u eliju A1:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Range("A1").Value = Target.Address
End Sub

Primer promena u eliji A1: $A$1, $S$32, $F$8:$J$20 i sl


Jo jedan primer za Sheet dogaaje je Change event. Ovaj dogaaj se aktivira kada nastane promena na
nekom opsegu (bilo jednoj eliji ili vie njih). Ako na naem Sheet-u imamo raunanje nekih vrednosti u
makrou, a taj makro koristi vrednosti odreenog opsega (npr. nazvaemo opseg Podaci), mogli bi da
pratimo izmene koje su izvrene na tom opsegu i svaki put kad nastane promena da ponovo pokrenemo
makro za izraunavanje. Da nismo koristili makro ve funkcije, Excel bi automatski ponovo izraunao sve
vrednosti, ali u naem sluaju mi moramo sami da vodimo rauna. Procedura je data sledeim kodom:

27
Private Sub Worksheet_Change(ByVal Target As Range)
Application.EnableEvents = False
If Not (Intersect(Target, Range("Podaci")) Is Nothing) Then
Call Proracunaj 'poziv procedure
End If
Application.EnableEvents = True
End Sub

Prvi i poslednji red procedure ukljuuju i iskljuuju osobinu Excel-a da reaguje na dogaaje pomou
osobine Application.EnableEvents. Ovo je potrebno ukoliko u proceduri Proracunaj menjamo neku
eliju iz opsega Podaci ako ne bi iskljuivali dogaaje, u tom trenutku bi se ponovo aktivirao Change
dogaaj, koji opet poziva proceduru koja opet menja sadraj, i tako u krug dobijamo beskonanu petlju
(ukoliko vam se ovo dogodi, izvravanje moete prekinuti sa Esc tasterom).
Funkcija Intersect vraa presek dva opsega. Ako se opsezi ne presecaju, vraa poseban Excel tip Nothing
koji je zapravo specijalna vrednost koja se koristi za poreenje sa objektima (slino kao to se nula koristi
u poreenju sa brojevima, tako i Nothing moe da se koristi pri poreenju sa objektima ali se umesto
znaka jednakosti koristi kljuna re Is). Ukoliko presek nije prazan, pozivamo proceduru za obradu
Proracunaj. Obzirom da smo ve iskljuili reagovanja na dogaaje, ne moramo da vodimo rauna koje
elije menjamo u toj proceduri, i da li e nastupiti beskonana petlja.
Treba voditi rauna o tome da ako obriemo neki worksheet, ujedno briemo i sve dogaaje koje smo za
njega pisali.

Workbook Events
Workbook je optiji od worksheet-a zato to on sadri sve worksheet-ove. U njemu moemo uhvatiti
dogaaje kao to su na primer otvaranje dokumenta (Open), dodavanje novog Sheet-a (NewSheet), itd
Jedan primer za dogaaj BeforePrint bi bio sledei:
Private Sub Workbook_BeforePrint(Cancel As Boolean)
vr = MsgBox("Da li ste promenili footer da sadri brojeve stranica?", _
vbYesNo, "Podsetnik")
If vr = VbMsgBoxResult.vbNo Then
Cancel = True
End If
End Sub

Ovaj kod se izvrava svaki put pre tampe (bilo PrintPreview, bilo pravi Print). Ovaj primer je uzet zbog
parametra koji sadri Cancel As Boolean. Ovaj parametar je u vezi sa dogaajem i ima default
vrednost True koja odreuje da tampanje treba da se izvri. Ako ga promenimo na False unutar naeg
koda, prekinuemo izvravanje tampe. Slino korienje ete verovatno sretati i kod drugih dogaaja.

28

Dodavanje kontrola na Worksheet


Ako elimo da iskoristimo worksheet da nam bude prostor za unos podataka, ne moramo praviti
posebne UserForms ekrane moemo sve kontrole smetati na worksheet umesto na poseban prozor.
Ovo se najee radi kada imamo neku jednostavnu interakciju sa korisnikom, koju moemo da
ostvarimo i na samom worksheet-u.
Dodavanje kontrola se vri iz toolbar-a Control Toolbox (ako imate aktiviran toolbar VisualBasic, moete
ga aktivirati i odatle klikom na odgovarajue dugme). Pored ovog postoji jo jedan toolbar sa setom
kontrola Forms. Meutim, kontrole koje Forms prua na korienje imaju manje opcija i podeavanja i
generalno se ne koriste. Control Toolbox ima sledei izgled:

U njemu su izlistane skoro sve kontrole koje smo koristili i za pravljenje UserForms ekrana. Pored njih
imamo jo nekoliko:
-

Design Mode: prebacivanje i mod za editovanje, i za izlazak iz tog moda. Dok je ovo aktivno.
dugme izgleda utisnuto i moemo menjati sve kontrolne elemente koje smo dodali na sheet.
Kada je deaktivirano onda kontrole izvravaju funkciju koju smo im definisali u design modu.
Properties: Koristi se kada smo u design modu za promenu osobina kontrola (slino kao i pri
dizajnu UserForms ekrana)
ViewCode: Moe se kliknuti samo dok smo u design modu. Prikazuje kod koji se nalazi iza
dugmeta, ili bilo koje druge kontrole. Slino kao i u UserForms, kod moemo videti i duplim
klikom na kontrolu.
More Controls: Izlistava sve ActiveX kontrole koje su instalirane u Windows-u. Na ovaj nain uz
malo poznavanja kontrola unutar worksheet-a moete dodati video klip, otvoriti pdf dokument
itd...

Kao primer, probajte da dodate jedan CommandButton, i promenite njegov property Caption tako da na
njemu pie: Pokreni obradu. Sada, duplim klikom na dugme (u design modu) otvorie se kod i to u
Sheet-u u kome se nalazi dugme (a ne u modulu), i napravie se standardna procedura za obradu
dogaaja. Ovde moemo sada unositi neki makro kao to smo i ranije pisali u obinim makroima. Na
primer, moemo i prikazati neku UserFormu:
Private Sub CommandButton1_Click()
UserForms1.Show
End Sub

Da bi ste isprobali kako dugme funkcionie, iskljuite design mod klikom na odgovarajue dugme u
toolbar-u. Ako elite ponovo da vrite neke izmene na kontroli, morate ponovo ui u design mode.

29

Povezivanje kontrola sa worksheet-om


Neke kontrole su automatski programirane tako da mogu da se poveu sa elijama worksheet-a pomou
svog property-a LinkedCell. Npr. Spin Button moemo povezati sa nekom elijom unosom reference na
eliju u polje LinkedCell, tako da kada korisnik klike dugmie gore-dole vrednost u eliji se automatski
menja.
ListBox i ComboBox imaju dodatne opcije kod njih moemo definisati opseg odakle se popunjava lista
sa ListFillRange property-jem, a ta je korisnik izabrao se smeta u eliju definisanu sa LinkedCell.
Za sve kontrole koje smo dodali moemo definisati dodatne obrade dogaaja u kodu za Sheet u kom se
nalaze kada otvorite kod za Sheet, u Object box-u, gde smo ranije imali samo Worksheet, sada imamo
izlistane sve kontrole koje smo dodavali (sa onim imenima koje smo definisali u njihovom property-u
(Name)).
Prilikom tampe worksheet-a koji na sebi ima kontrole za unos odtampae se ujedno i sve kontrole.
Meutim, imamo mogunost da ovo iskljuimo dovoljno je promeniti Print object u property prozoru i
setovati na False za svaki objekat koji elimo da iskljuimo iz tampe.

Obrada greaka
Kada nastupi greka u VBA kodu automatski se zaustavlja izvravanje i prikazuje se deo koji je
problematian. Postoje situacije kada znamo da neka komanda moe izazvati greku, i umesto da
prekidamo izvravanje elimo da obradimo greku na neki nain i da nastavimo dalje. Da bi ovo ostvarili
postoji vie naina. Upotrebu emo objasniti na sledeem primeru. U ovom primeru greka moe
nastupiti u vie sluajeva: npr. prilikom pokretanja makroa nije selektovana elija nego neki grafiki
element, ili u eliji A1 pie tekst umesto broja.
Private Sub CommandButton1_Click()
On Error GoTo greska
Selection.Value = 5
Range(A1).Value = Range(A1).Value + 1
Exit Sub 'da nismo stavili ovo nastavili bi izvravanje i sledeih redova
greska:
MsgBox "Doslo je do greske: " & Error()
On Error GoTo 0
End Sub
On Error GoTo linija ako doe do greke prebaci se na

liniju koja je oznaena labelom linija. Labele


se piu tako to stoje same u liniji, a iza njih je znak dvotake (kao u gornjem primeru greska:). U
ovom primeru, im nastupi greka prekidamo izvravanje koda gde god da je nastupila greka i
prebacujemo se na liniju oznaenu sa greska:. Npr, ako je greka nastupila u prvoj naredbi
Selection.Value = 5 sledea naredba koja se izvrava e biti ona iza greska:, dok se Range(A1)
nee izvriti.

30
resetuje prethodno ponaanje, tako da kada nastupi greka negde drugde u kodu,
ne idemo stalno na liniju greska:, ve se primenjuje standardni nain rada sa grekama.

On Error GoTo 0

Bitno je primetiti da pre labele za obradu greke stoji Exit Sub to znai da ako smo doli do te linije
prekidamo dalje izvravanje procedure. Da kojim sluajem nismo stavili Exit Sub, procedura bi nastavila
sa izvravanjem, i izvrio bi se kod koji ispisuje Dolo je do greke, bez obzira to greke nema.
Jo jedan nain obrade greaka je: On Error Resume Next ako nastupi greka ignoriemo red u kome
je nastala i nastavljamo izvravanje sa sledeom linijom. Npr, u gornjem primeru, ako je nastupila greka
pri radu sa Selection objektom, nastaviemo kod i pokuati da izmenimo eliju A1.

Pronalaenje greaka - Debugging


Kao i u veini programskih alata, i VBA prua usluge debugger-a. Debugger je poseban deo programa koji
vam veoma olakava da otklonite neke logike greke tako to ete zaustaviti izvravanje koda u
trenutku koji vama odgovara i izvravati liniju po liniju, pratei nain izvravanja (u koje grane koda
ulazimo, koliko puta, itd) i koje vrednosti se pri tome menjaju.
Breakpoint taka zaustavljanja programa. Postavlja se
klikom u sivi deo koda, u nivou reda u kome elimo da se
zaustavimo (vidi sliku treba kliknuti u sivi deo gde je velika
taka). Kada dodamo breakpoint, red se boji u crveno i dodaje
se velika taka sa leve strane. Kada pokrenemo kod, on e se zaustaviti na ovom mestu. Red koji e se
sledei izvriti je obeleen utom bojom.
Step Over komanda koja se nalazi u meniju Debug->Step Over, e izvriti prvu sledeu naredbu u nizu
izvravanja (odnosno, red koji je obeleen utom bojom). Najee postavimo breakpoint, i zatim se
kreemo red po red sa Step Over. Ako elimo da nastavimo dalje do kraja, odnosno do sledeeg
breakpoint-a, kliknemo Run->Continue (ili pritisnemo F5).
Watches prozor u kome pratimo vrednosti promenljivih. Aktiviramo ga preko View->Watch Window, a
promenljive dodajemo u Debug->Add watch. U Watch moemo dodavati bilo kakve vrednosti npr.
vrednosti opsega iz worksheet-a, osobine raznih kontrola u UserForm-i, vrednosti promenljivih itd
Vrednosti promenljivih koje koristimo u kodu moemo videti i prostim pozicioniranjem kursora mia
iznad te promenljive njena vrednost bie ispisana kao Tooltip.
Pomeranje sledeeg reda za izvravanje dok je izvravanje pauzirano, utu liniju koja predstavlja
sledei red koji se izvrava moete jednostavno pomeriti na neki drugi red tako to ete levim
dugmetom mia uhvatiti utu strelicu sa strane i prevui je na eljeni red. Na ovaj nain moete
preskakati redove, ili neke redove ponovo izvravati.

31

Zatita koda
Slino kao to moemo da zatitimo worksheet, tako moemo da zatitimo i sav kod koji piemo tako da
ne moe da se vidi i menja bez ukucavanja ifre.
Kliknite desnim dugmetom na ime projekta u Visual Basic Editoru (npr. VBAProject (Book1)), i izaberite
Properties. Dobiete sledei ekran:

tiklirajte Lock Project For Viewing i unesite ifru koja je obavezna. Da bi zatita postala aktivna,
sauvajte dokument, zatvorite ga i probajte ponovo da ga otvorite. Dokument e se otvoriti bez
problema, moete menjati worksheet, a ak je dozvoljeno i da se pokreu makroi. Meutim, ako neko
pokua da otvori VBA kod, od njega e se traiti da ukuca ifru kojom je taj kod zatien.

- Kraj kursa -

You might also like