VBA Programiranje

77
Programiranje http://arhimed.matf.bg.ac.rs/~misko/flf/prog/prog.html Kratak uvod u programiranje o Osnovni pojmovi u programiranju o Predstavljanje podataka u računaru o Istorijat programiranja Programski jezik VBA o Osnovne informacije o VBA Literatura Korisni saveti za brži i lakši rad o Sintaksa jezika Konstante i promenljive Deklaracija i imenovanje konstanti Deklaracija i imenovanje promenljivih Tipovi u VBA Prosti tipovi Nizovni tip podataka Korisnički definisani tipovi Konverzija tipova Izrazi u VBA Osnovne naredbe u VBA Naredba dodele Blok naredba Razgranata struktura IF naredba SELECT CASE naredba 1

Transcript of VBA Programiranje

Page 1: VBA Programiranje

Programiranje http://arhimed.matf.bg.ac.rs/~misko/flf/prog/prog.html

Kratak uvod u programiranje o Osnovni pojmovi u programiranju

o Predstavljanje podataka u računaru

o Istorijat programiranja

Programski jezik VBA

o Osnovne informacije o VBA

Literatura

Korisni saveti za brži i lakši rad

o Sintaksa jezika

Konstante i promenljive

Deklaracija i imenovanje konstanti

Deklaracija i imenovanje promenljivih

Tipovi u VBA

Prosti tipovi

Nizovni tip podataka

Korisnički definisani tipovi

Konverzija tipova

Izrazi u VBA

Osnovne naredbe u VBA

Naredba dodele

Blok naredba

Razgranata struktura

IF naredba

SELECT CASE naredba

Ciklička struktura

For … Next

While … Wend

1

Page 2: VBA Programiranje

Do … While

Do … Until

Potprogrami

Procedure

Funkcije

Prenos parametara potprograma

Ugrađene funkcije u VBA

Struktura programa

Makroi i moduli

Projekti

Opseg važenja promenljivih

o Objektno-orijentisano programiranje

Programske paradigme

Deklaracija i imenovanje objektnih promenljivih

Ugrađene klase u VBA

Osnovne naredbe za rad sa objektima u VBA

Naredba dodele Set

For Each … In naredba (petlja, ciklus)

With naredba

o Kontrole u VBA

Mađarska notacija za kontrole

Zajednička svojstva kontrola

Label (oznaka, obeležje)

TextBox (tekstuelno polje, polje za unos teksta)

CommandButton (komandno dugme)

CheckBox (polje za potvrdu)

OptionButton (opciono dugme, radio dugme)

Frame (okvir)

2

Page 4: VBA Programiranje

Osnovni pojmovi u programiranju

Računar o informacije

o podaci

ulaz

izlaz

promenljiva

o tipovi podataka

o definicija

deklaracija

inicijalizacija

o vrednost promenljive (izrazi)

aritmetički izrazi

relacijski izrazi

logički izrazi

prioritet

naredbe

o terminologija

instrukcije (procesora)

komande (operativnog sistema)

naredbe (programskog jezika)

o vrste naredbi

naredba dodele

blok-naredba

uslovne naredbe

petlje (ciklusi)

4

Page 5: VBA Programiranje

potprogrami (rutine)

o ulaz potprograma (argumenti)

o lokalne promenljive

o izlaz potprograma (povratna vrednost)

procedure

funkcije

Programski jezik VBA

Osnovne informacije o VBA

Visual Basic for Applications ili Visual Basic, Applications Edition (skr. VBA) je programski jezik koji koristi Microsoft Office i niz drugih aplikacija. VBA je 'makro' jezik. U računarstvu se pod pojmom makro (eng. macro ili macroinstruction) podrazumeva niz komandi i instrukcija (zadatih preko tastature/miša) koje su povezane u jednu komandu kako bi zadatak bio automatski izvršen. Na ovaj način se postiže da se često ponavljani niz zadataka koje je korisnik ranije morao ručno da izvršava, sada automatski izvršava jednim klikom miša ili kombinacijom dva ili tri tastera sa tastature. U okviru paketa Office postoje dva načina da se kreira makro:

korišćenjem zapisivača makroa (eng. macro recorder) ili korišćenjem VB Editora.

U prvom slučaju program paketa Office (Word, Excel i sl) 'snima' akcije korisnika kao makro sa jedinstvenim imenom koji se kasnije može ponovo koristiti za ponavljanje tih akcija. 'Snimanje' se svodi na prevođenje akcija korisnika u naredbe programskog jezika VBA.

U drugom slučaju se programira u okviru VB Editora. Neke od naredbi programer ručno unosi kao tekst, dok se neke automatski generišu kombinacijom miša i tastature (npr. kreiranje formulara). Iako korišćenje zapisivača makroa na prvi pogled deluje lakše i primamljivije, njime se ne mogu iskoristiti sve mogućnosti kojima VBA kao programski jezik raspolaže. Pritom, zapisivač makroa često generiše i nepotrebne naredbe.

Važno je napomenuti da VBA nije istovetan sa programskim jezikom Microsoft Visual Basic (skr. VB), a takođe se razlikuje i od jezika VBScript (eng. VB Scripting Edition). VB je daleko opširniji i moćniji jezik

Za rad su potrebni sledeći programi:

1. Micosoft Office (preciznije Word i Excel, Visual Basic Editor)

5

Page 6: VBA Programiranje

Visual Basic Editor (VB Editor) je sastavni deo paketa Microsoft Office i pokreće se iz menija Tools programa iz kog se koristi (Word ili Excel). Precizna putanja je: Tools > Macro > Visual Basic Editor.

Način korišćenja VB Editora biće ilustrovan na vežbama.

Literatura:1. Office Online . Pretraga po frazi "Visual Basic" daje raznovrsne članke na temu VBA (Slika 1). (!!Vodite

računa da se u Office-u jedino pojavljuje VBA, a ne i VB. Ako pretražujete koristeći Google, ne zaboravite da dodate "for Applications", jer Visual Basic nije isto što i VBA!!)

2. Microsoft Word (makroi za Word 2003)

3. Microsoft Excel (makroi za Excel 2003) Na istom sajtu mogu se naći članci i za novije verzije Office-a.

4. Office praktikum

5. Pol Mekfedris, Vodič kroz VBA za apsolutne početnike, Kompjuter biblioteka, Čačak, 2005. Na ovoj stranici je dostupno i promotivno poglavlje o primenama VBA u Word-u.

Slika 1

Korisni saveti za brži i lakši rad Novije verzije paketa Micosoft Office poseduju ružnu osobinu da njihovi programi ne prikazuju

kompletan sadržaj menija (osim ako korisnik to neposredno ne zahteva) već samo one stavke koje su korišćene tokom prethodnog rada sa tim programima. Time se stvara dezorijentacija i gubi nepotrebno vreme na neprekidno zahtevanje da celokupan sadržaj menija bude prikazan. Stoga treba proveriti da li su sledeće opcije ispravno uključene pre početka rada (dijalog se aktivira putanjom: Tools > Customize > Options, Slika 2).

6

Page 7: VBA Programiranje

Makroi u Office-u predstavljaju mini-programe koji se izvršavaju u okviru postojećih programa (Word, Excel i sl). Stoga, oni mogu da predstavljaju i viruse, kao i ostale vrste malicioznog softvera. Iz tog razloga Office poseduje nekoliko nivoa sigurnosti koji određuju pod kojim uslovima se makro može izvršiti (Slika 3). Pre pošetka rada najbolje je proveriti da li je izabran srednji nivo sigurnosti (dijalog se aktivira putanjom Tools > Macro > Security, Slika 3)

Konstante

U okviru jezika VBA postoje dve vrste konstanti:

Ugrađene konstante (literali) Celobrojne konstante (23, 456, -234 itd). Vrednosti tipa Integer i Long. Realne konstante (23.34, -4.9E-20). Vrednosti tipa Single i Double.

Niske ("Tekst pod navodnicima"). Vrednosti tipa String.

Logičke konstante (True i False). Vrednosti tipa Boolean.

Datumi (#10/24/02#). Vrednosti tipa Date. Format je #mm/dd/gg#, gde je m mesec, d dan, a g godina.

7

Page 8: VBA Programiranje

Konstante koje definiše korisnikSintaksa za definisanje korisničkih konstanti je

Const imeKonstante As Tip = vrednostKonstanteNpr,

Const BROJ_MESECI As Integer = 12

Promenljive

Promenljive se koriste u programu za čuvanje podataka i to:

ulaznih podataka programa, podataka koji su dobijeni kao međurezultati izračunavanja u programu, i

izlaznih podataka programa.

Njihov naziv dolazi otud što se vrednost promenljivih tokom programa može menjati.

Tip promenljivih

S obzirom da se podaci u računaru čuvaju kodirani binarnom azbukom, a jedna binarna niska može da se interpretira (dekodira) na razne načine (npr. kao karakter 'A' ili kao dekadni broj 65), neophodno je svakoj promenljivoj pridružiti njen tip. Tip promenljive određuje koje su dozvoljene vrednosti promenljive, i koje operacije mogu da se izvode nad tom promenljivom (tj. u kojim izrazima promenljiva sme da se pojavi kao sastavni deo). Takođe, tip promenljive određuje na koji način će njen binarni sadržaj biti interpretiran.

Detalji o tipovima u programskom jeziku VBA

Deklaracija promenljivihDeklaracijom promenljiva započinje svoj "život" u programu. Smisao deklaracije je da se u memoriji odvoji lokacija za smeštaj podatka željenog tipa, a kojoj će se pristupati ne preko njene memorijske adrese već preko željenog imena.

Deklaracija promenljivih prostog tipa u VBADeklaracija promenljivih prostog tipa u VBA se obavlja naredbom Dim čiji su opšti oblici:

Dim imePromenljive As prostTipNpr,

Dim godina As Integer

Inicijalizacija promenljivihPre no što se započne sa korišćenjem promenljive, neophodno je da ona poseduje nekakvu vrednost. Dodeljivanje početne vrednosti promenljivoj se naziva inicijalizacija promenljive. Inicijalizacija

8

Page 9: VBA Programiranje

promenljivih prostog tipa se obavlja naredbom dodele Let, dok se promenljive koje predstavljaju reference na objekte inicijalizuju naredbom dodele Set.

Mađarska notacija

Mađarska notacija je dogovor o imenovanju promenljivih u programiranju. Ovde ćemo ilustrovati jedan oblik te notacije kod kojeg prefiks imena promenljive ukazuje na njen tip, dok ostatak imena ukazuje na namenu promenljive. Prefiks je obično skraćenica (3-4 slova) koja se lako pamti i koja asocira na tip promenljive. Prefiks se piše malim slovima. Ostatak imena su spojene reči koje označavaju namenu promenljive, pri čemu je prvo slovo svake reči veliko, dok su ostala mala.

U tabeli su navedeni najčešće korišćeni prefiksi za imena promenljivih određenog tipa u programskom jeziku VBA. Npr. iDan može da predstavlja ime celobrojne promenljive koja sadrži redni broj dana (1-31), sDan - promenljivu tipa String (tekst), koja čuva ime dana u nedelji ("Ponedeljak" - "Nedelja"), dok bJeParan predstavlja promenljivu logičkog tipa čija vrednost (True ili False)pokazuje da li je neki broj paran ili ne .

Prost tipPrefiks nazivapromenljive

Primer

Integer i iDan

String s sDan

Boolean b bJeParan

Tipovi Prosti tipovi Nizovni tip podataka

Korisnički definisani tipovi

Konverzija tipova

Tip u programskom jeziku predstavlja konačan skup vrednosti i operacija koje se mogu primeniti nad tim vrednostima. Programski jezici obično sadrže određeni broj ugrađenih prostih tipova, a često omogućavaju korisniku da definiše svoje sopstvene tipove.

Prosti tipovi

9

Page 10: VBA Programiranje

Vrednosti prostih tipova ne mogu se rastaviti na jednostavnije komponente.

Integer (16-bitni celobrojni tip, opseg vrednosti -32,768..32,767, operacije +, -, *, \, Mod, ^) Long (32-bitni celobrojni tip, operacije +, -, *, \, Mod, ^)

Single (realni tip jednostruke tačnosti, operacije +, -, *, /, ^)

Double (realni tip dvostruke tačnosti, operacije +, -, *, /, ^)

String (tekstuelni tip, niske, operacija dopisivanja &). Funkcije za rad sa niskama.

Boolean (logički tip, vrednosti True i False, operacije And (konjunkcija), Or (disjunkcija), Not (negacija))

Date (datum u formatu #mesec/dan/godina#, npr. #12/31/2008#)

Variant (proizvoljan tip koji dobijaju nedeklarisane promenljive)

Moguća je konverzija vrednosti promenljivih iz jednog prostog tipa u drugi korišćenjem funkcija za konverziju tipova.

Nizovni tip podataka

Jedan od najčešće korišćenih složenih tipova podataka jeste nizovni tip. Niz je konačan i uređen skup podataka istog tipa koje se nazivaju elementi niza. Elementima niza se pristupa preko zajedničkog imena (naziv nizovne promenljive) i fiksnog broja indeksa. Stoga se niz može posmatrati kao grupa indeksiranih promenljivih istog tipa sa zajedničkim imenom.

U zavisnosti od broja indeksa niz može biti jednodimenzionalan i višedimenzionalan, a broj indeksa koji se koristi za pristupanje elementu se naziva dimenzija niza. Ovde će biti reči isklxučivo o jednodimenzionalnim nizovima.

U slučaju jednodimenzionalnih nizova veličina niza se poistovećuje sa brojem njegovih elemenata, a indeks elementa se svodi na redni broj elementa u nizu. Pritom prvi indeks može biti nula (podrazumevano) ili jedinica. Ukoliko se na početku modula koristi naredba

Option Base 1

redni broj prvog elementa svakog deklarisanog niza u tom modulu biće 1.

Nizovi mogu biti statički i dinamički. Kod statičkih nizova veličina niza mora biti poznata pre kompilacije, tj. u deklaraciji statičkih nizova veličina mora biti konstantna vrednost (literal ili imenovana konstanta). U navedenom primeru i prviNiz i drugiNiz su deklarisani kao statički nizovi od po 10 elemenata:

Const MAX_VELICINA As Integer = 10Dim prviNiz(10) as String 'niz od 10 elemenata tipa String

10

Page 11: VBA Programiranje

Dim drugiNiz(MAX_VELICINA) as String 'niz od MAX_VELICINA elemenata tipa String

Dinamički nizovi se deklarišu bez navođenja veličine, a tokom izvršavanja programa se može zadati njihova veličina primenom naredbe ReDim:

Dim dinNiz() as String… 'n je celobrojna promenljiva dobijena nekim izračunavanjemRedim dinNiz(n)

Elementu niza se pristupa preko imena nizovne promenljive i indeksa. Npr.

Dim niz(10) as Integer 'niz od 10 elemenata tipa Integer (tj. celobrojni niz od 10 elemenata)niz(5) = 16 'inicijalizacija 5. elementa niza (ako je Option Base 1)x = 2 * niz(4) + 1 'element niza se koristi u izrazu kao bilo koja celobrojna vrednost Pri radu sa nizovima najčešće se koriste petlje pošto je to najefikasniji način da se nad svakim elementom niza obavi isti niz radnji (npr. For petlja za inicijalizaciju i ispisivanje elemenata niza).

Korisnički definisani tipovi

Pored ugrađenih (prostih) tipova, u VBA je omogućeno korisniku da definiše i sopstvene tipove.

Konverzija tipova

U slučaju da se u izrazu pojavljuju operandi različitih tipova, postavlja se pitanje kog tipa će biti rezultat, tj. vrednost celokupnog izraza. Takođe je potrebno razjasniti kako se izvršava naredba dodele u slučaju da su tip promenljiva sa leve strane dodele (znaka jednakosti) i tip izraza sa desne strane znaka jednakosti različiti. Npr.

Dim ix As Integer, ry As Double, s As String 'operandiDim iz As Integer, iv As Integer, rw As Double, s2 As String 'rezultatiDim poruka As Stringix = 5 'inicijalizacijary = 4.3 'inicijalizacijas = "123" 'inicijalizacijaiz = ix * ry ' 5 * 4.3 => 5.0 * 4.3 => 21.5 => 21 rw = ix * ry ' 5 * 4.3 => 5.0 * 4.3 => 21.5s2 = s & ix ' "123" & 5 => "123" & "5" => "1235"iv = ix + s ' 5 + "123" => 5 + 123 => 128MsgBox ix + s ' 5 + "123" => 5 + 123 => 128 => "128"s = "a123"iv = ix + s ' Greška!! "a123" ne može da se konvertuje u brojMsgBox ix + s ' Greška!! "a123" ne može da se konvertuje u brojs = "123.4"rw = ix + s ' ' 5 + "123.4" => 5 + 123.4 => 5.0 + 123.4 = 128.4iv = ix + s ' ' 5 + "123.4" => 5 + 123.4 => 5.0 + 123.4 = 128.4 => 128MsgBox ix + s ' 5 + "123.4" => 5 + 123.4 => 5.0 + 123.4 = 128.4 => "128.4"

11

Page 12: VBA Programiranje

Navedeni primeri pokazuju da se podrazumevaju pravila poput:

Integer * Double => Double; String & Integer => String;

prilikom naredbe dodele, VBA pokušava da konvertuje tip izraza sa desne strane u tip promenljive sa leve strane znaka jednakosti;

prilikom poziva funkcije (npr. MsgBox ix) VBA pokušava da konvertuje tip stvarnog argumenta (ix As Integer) u tip parametra naveden u definiciji te funkcije (u slučaju funkcije MsgBox, prvi parametar mora da bude tipa String).

Za slučaj String + Integer vidimo da rezultat zavisi od vrednosti tipa String:

ako je vrednost tipa String validan tekstuelni zapis celog broja ili broja u pokretnom zarezu, moguće je izvršiti konverziju iz tipa String u odgovarajući celobrojni ili realni tip; u tom slučaju se izraz svodi na Integer + Integer => Integer ili Double + Integer => Double

ako vrednost tipa String nije validan tekstuelni zapis ni celog broja ni broja u pokretnom zarezu, prijavljuje se greška.

Ovakva podrazumevana pravila se još nazivaju pravila implicitne konverzije tipova. Iako deluje da je zahvaljujući njima sintaksa jednostavnija, višestruke "skrivene" konverzije u izrazu mogu dovesti do grešaka koje se teško otkrivaju. Osim toga potrebno je pamtiti i mnogobrojne izuzetke od pravila. Stoga je bolje eksplicitno izvršiti konverziju kako bismo bili sigurni u tip izračunate vrednosti primenom funkcija za za eksplicitnu konverziju tipova:

s = "123.4"iv = CInt(s) + ix ' CInt("123.4") + 5 => 123 + 5 => 128 MsgBox CDbl(s) + ix ' CDbl("123.4") + 5 => 123.4 + 5 => 128.4 => "128.4"'CInt('a123') i CDbl('a123.4') prijavljuju grešku!

Izrazi

Aritmetički izrazi

1. Celobrojne i realne konstante su aritmetički izrazi. 2. Celobrojne i realne promenljive su aritmetički izrazi.

3. Pozivi celobrojnih i realnih funkcija su aritmetički izrazi.

4. Ako su E1 i E2 aritmetički izrazi, tada su i

E1 + E2 (zbir)

E1 - E2 (razlika)

12

Page 13: VBA Programiranje

E1 * E2 (proizvod)

E1 \ E2 (količnik pri celobrojnom deljenju)

E1 Mod E2 (ostatak pri celobrojnom deljenju)

E1 / E2 (količnik pri deljenju realnih brojeva)

E1 ^ E2 (stepenovanje)

(E1) (izraz u zagradama)

+E1 (potvrda znaka)

-E1 (promena znaka)

5. takođe aritmetički izrazi

Relacijski izrazi

Neka su E1 i E2 aritmetički izrazi. Tada su:

E1 = E2 (upoređivanje da li su vrednosti dva aritmetička izraza jednake)

E1 <> E2 (upoređivanje da li su vrednosti dva aritmetička izraza različite)

E1 < E2 (upoređivanje da li je vrednost prvog aritmetičkog izraza manja od vrednosti drugog)

E1 <= E2 (upoređivanje da li je vrednost prvog aritmetičkog izraza manja ili jednaka vrednosti drugog)

E1 > E2 (upoređivanje da li je vrednost prvog aritmetičkog izraza veća od vrednosti drugog)

E1 >= E2 (upoređivanje da li je vrednost prvog aritmetičkog izraza veća ili jednaka vrednosti drugog)

relacijski izrazi.

Logički izrazi

1. Logičke konstante True i False su logički izrazi. 2. Logičke promenljive tipa Boolean su logički izrazi.

13

Page 14: VBA Programiranje

3. Relacijski izrazi su logički izrazi.

4. Pozivi logičkih funkcija su logički izrazi.

5. Ako su L1 i L2 logički izrazi, tada su i

L1 And L2 (konjunkcija, vrednost je True jedino ako su vrednosti oba izraza L1, L2 jednake True)

L1 Or L2 (disjunkcija, vrednost je True ako je vrednost bar jednog od izraza L1, L2 jednake True)

Not L1 (negacija)

6. takođe logički izrazi.

Prioritet operatora

Prioritet operatora (od višeg ka nižem)

^ (stepenovanje)

- (promena znaka)

* / (množenje i realno deljenje)

\ (celobrojno deljenje)

Mod (ostatak pri celobrojnom deljenju)

+ - (sabiranje, oduzimanje)

& (konkatenacija)

= < <= > >= <> (relacijski operatori)

And Or Not (konjunkcija, disjunkcija, negacija)

Naredbe Naredba dodele

o Naredba dodele Let

o Naredba dodele Set

Blok naredba

14

Page 15: VBA Programiranje

Razgranata struktura

o IF naredba

o Select Case naredba

Ciklička struktura

o For…Next naredba (petlja, ciklus)

o While…Wend petlja

o Do…While petlja

o Do…Until petlja

Naredbe specifične za rad sa objektima (For Each…In naredba i With naredba ) biće posebno obrađene.

Naredba dodele

Postoje dva oblika naredbe dodele:

1. Let (za promenljive prostog tipa) 2. Set (za reference na objekte)

Naredba dodele Letpromenljiva = izraz

Naredba ovog oblika izračunava vrednost izraza i upisuje tu vrednost u promenljivu. Npr, ako je x celobrojna promenljiva (tipa Integer ili Long), tada naredba dodele

x = 3*4-2izračunava izraz 3*4-2 i njegovu vrednost (10) upisuje u promenljivu x. Slično, ako je ind promenljiva logičkog tipa, tada naredba dodele

ind = Falseupisuje vrednost logičkog izraza (False) u promenljivu ind.

Ukoliko su promenljiva i izraz različitih tipova, dolazi do konverzije

Naredba dodele Set

Ova naredba je posebna opisana u odeljku o objektima.

Blok naredba

15

Page 16: VBA Programiranje

Niz naredbi koji se izvršava kao celina (tj. ili se izvršavaju sve naredbe niza ili se nijedna naredba niza ne izvršava) predstavljaju blok naredbu. Blok naredba predstavlja sastavni deo For…Next i For Each…In naredbi. If Then Else naredbe , Select Case naredbe , For…Next petlje, While…Wend petlje, Do…While petlje, Do…Until petlje, For Each…In naredbe i With naredbe .

Razgranata struktura

IF naredba

Uslovno izvršavanje naredbi. Ako je uslov (nekakav logički izraz) ispunjen (tj. ima vrednost True), tada se izvršava If-blok naredbi, a naredbe Else-bloka se ignorišu. U protivnom, ako uslov nije ispunjen (tj. ima vrednost False), naredbe If-bloka se ignorišu, a izvršavaju se naredbe Else-bloka.

If uslov Then naredba 'If-blok naredbi naredba … naredbaElse naredba 'Else-blok naredbi naredba … naredbaEnd If

Ponekad je Else-blok prazan, pa se If-naredba navodi u obliku:

If uslov Then naredba 'If-blok naredbi naredba … naredbaEnd If

Ako je uslov ispunjen, izvršava se If-blok naredbi, u protivnom se If-naredba preskače i prelazi se na sledeću naredbu programa.

Opšti oblik If-naredbe je:

If uslov1 Then naredba 'If-blok naredbi naredba … naredbaElseIf uslov2 Then naredba 'ElseIf-blok naredbi naredba …

16

Page 17: VBA Programiranje

naredbaElseIf uslov3 Then naredba 'ElseIf-blok naredbi naredba … naredba…Else naredba 'Else-blok naredbi naredba … naredbaEnd If

Ako uslov1 ima vrednost True, tada se izvršava If-blok naredbi, ostali blokovi (ElseIf i Else) se ignorišu. U protivnom, ako uslov1 nije ispunjen (tj. ima vrednost False), naredbe If-bloka se ignorišu, a testira se uslov2. Ako je uslov2 ispunjen (True), izvršavaju se naredbe odgovarajućeg ElseIf-bloka, a ostali blokovi se ignorišu. Ako uslov2 nije ispunjen, testira se uslov3 itd.

Dakle, ako postoji neki uslov iz If ili ElseIf-bloka koji je ispunjen, izvršavaju se naredbe bloka koji odgovara prvom takvom uslovu (posmatrano odozgo nadole). Ukoliko nijedan od uslova iz If ili ElseIf-bloka nije ispunjen, izvršavaju se naredbe Else-bloka. U svakom slučaju, naredbe ostalih blokova se ignorišu.

If x > 5 Then 'izvršava se za vrednosti veće od 5 x = x - 5Else If x > 3 Then 'izvršava se za vrednosti 4 i 5 x = x - 3Else If x > 2 Then 'izvršava se za vrednost 3 x = x + 2Else x = 1 'izvršava se za sve ostale celobrojne vrednosti (x <= 2)End If

Select Case naredba

U slučaju da je potrebno testirati vrednost neke promenljive i izvršiti različite akcije u slučaju različitih konkretnih vrednosti te promenljive, pogodnije je umesto If-naredbe koristiti Select Case naredbu:

Select Case TestIzraz Case SpisakSlučajeva1 naredbe Case SpisakSlučajeva2 naredbe Case SpisakSlučajeva3 naredbe … Case Else naredbe 'podrazumevana akcijaEnd Select

17

Page 18: VBA Programiranje

Pritom:

TestIzraz je izraz celobrojnog ili tekstuelnog tipa (Integer, Long, String); SpisakSlučajeva je niz

o vrednosti (istog tipa kao i TestIzraz),

o opsega 'vrednosti (npr. 1 To 12) ili

o uslova (npr. is > 10) međusobno razdvojenih zapetom.

Npr. Case 4, 20 To 30, Is > 100 obuhvata vrednosti 4, 20, 21, 22,...30 i vrednosti veće od 100

Sledeća Select Case naredba određuje broj dana u mesecu na osnovu rednog broja meseca m (1-12) i tekuće godine g:

Select Case m Case 1, 3, 5, 7, 8, 10, 12 BrDanaUMesecu = 31 Case 4, 6, 9, 11 BrDanaUMesecu = 30 Case 2 If JePrestupna(g) Then BrDanaUMesecu = 29 Else BrDanaUMesecu = 28 End If Case Else BrDanaUMesecu = 0 'MsgBox "Nepostojeci mesec " & mEnd Select

Ciklička struktura

For…Next naredba (petlja, ciklus)

Ponavljanje grupe naredbi naveden broj puta.

For brojač = početna To krajnja [Step korak] naredba 'For-blok naredbi … naredbaNext

Srednje zagrade ([]) se ne pišu u naredbi, već se ovde koriste samo da bi naglasile da je deo naredbe između njih neobavezan (tj. da se ne mora navesti). Ako nije naveden korak (tj. Step korak), podrazumeva se da je njegova vrednost 1. For…Next naredba se izvršava na sledeći način:

18

Page 19: VBA Programiranje

1. Celobrojnoj promenljivoj brojač se dodeljuje vrednost početna (inicijalizacija brojača). Prelazi se na 2. 2. Uslov koji se proverava zavisi od vrednosti koraka:

a. ako je vrednost koraka pozitivna, proverava se da li je vrednost promenljive brojač manja od ili jednaka vrednosti krajnja;

b. ako je vrednost koraka negativna, proverava se da li je vrednost promenljive brojač veća od ili jednaka vrednosti krajnja.

Ako je uslov ispunjen, izvršavaju se naredbe For-bloka i prelazi se na 3. Ako uslov nije ispunjen, For…

Next naredba je završena.

3. Na vrednost promenljive brojač se dodaje vrednost korak. Ako nije naveden korak (tj. Step korak), podrazumeva se da je njegova vrednost 1. Prelazi se na 2.

Dakle, brojač uzima celobrojne vrednosti iz intervala početna..krajnja (pri čemu se uzastopne vrednosti brojača razlikuju za vrednost korak) i za svaku od tih vrednosti izvršava sve naredbe For-bloka. korak je vrednost za koju se brojač menja tokom svakog prolaska kroz petlju.

While…WendWhile uslov naredbe 'blok naredbi = telo petljeWend

Ako je uslov True, izvršava se blok naredbi tela petlje (između While i Wend). Zatim se ponovo testira uslov i proces se ponavlja sve dok je njegova vrednost True. Ako uslov nije ispunjen (False), prelazi se na sledeću naredbu programa iza While…Wend petlje.

Ukoliko na samom početku izvršavanja naredbe uslov nije ispunjen (False), naredbe tela petlje neće nijednom biti izvršene.

Preko While-petlje mogu da se realizuju sve ostale petlje. Ona je opštija od For-petlje jer omogućava da se telo petlje ponavlja nepoznat broj puta u zavisnosti od ispunjenosti nekog uslova

Do…WhileDo naredbe 'blok naredbi = telo petljeLoop While uslov

Najpre se izvršava blok naredbi tela petlje (između Do i Loop). Zatim se testira uslov i proces se ponavlja sve dok je njegova vrednost True. Ako je vrednost uslova False, prelazi se na sledeću naredbu programa iza Do…While petlje.

Za razliku od While-petlje čije telo ne mora nijednom da se izvrši, telo Do…While petlje se uvek izvršava bar jednom.

19

Page 20: VBA Programiranje

Do…UntilDo naredbe 'blok naredbi = telo petljeLoop Until uslov

Najpre se izvršava blok naredbi tela petlje (između Do i Loop). Zatim se testira uslov (nekakav logički izraz) i proces se ponavlja sve dok uslov ima vrednost False. Ako je vrednost uslova jednaka True, prelazi se na sledeću naredbu programa iza Do…Until petlje.

Za razliku od While-petlje čije telo ne mora nijednom da se izvrši, telo Do…Until petlje se uvek izvršava bar jednom.

Potprogrami

Potprogrami su zapravo programi unutar programa. Naime, program može da se podeli na logičke celine od kojih je svaka zadužena za izvršavanje specifičnog zadatka. Moguće je da u programu postoji potreba da se isti zadatak obavi više puta, ali na različitim mestima. Umesto da se naredbe za izvršavanje takvog zadatka iznova navode, ideja je da se one izdvoje u posebnu imenovanu celinu, potprogram, i da se po potrebi pozivaju samo navođenjem imena potprograma i eventualnih ulaznih podataka.

Potprogramima se postiže ušteda, mogućnost da se isti niz naredbi ponovo iskoristi, a program postaje čitljiviji jer se ne posmatra samo kao niz naredbi, već i kao niz specifičnih zadataka. Takođe, prilikom pisanja programa, najlakše je tokom analize problema podeliti program na specifične zadatke, a onda za svaki od njih ispisati odgovarajući niz naredbi koji ga realizuju.

U okviru objektno-orijentisanih programskih jezika (kakav je VBA) često se koristi termin "metod" umesto potprogram.

Postoje dve vrste potprograma:

Procedure (eng. subroutine) Funkcije (eng. function)

Procedure

Definicija procedure izgleda ovako:

Sub imeProcedure(argumenti) naredba naredba … naredbaEnd Sub

20

Page 21: VBA Programiranje

gde argumenti predstavljaju deklaracije promenljivih koje procedura koristi kao ulazne podatke.

Primer: napisati proceduru koja na osnovu zadate vrednosti, menja veličinu prvog pasusa tekućeg dokumenta.

Sub PromeniVelicinu(iSize as Integer) ActiveDocument.Paragraphs(1).Range.Font.Size = iSizeEnd Sub

Da bi se naredbe neke procedure izvršile u programu, potrebno je da se procedura pozove i da se obezbede konkretne vrednosti za njene argumente. Npr. nakon sledećeg poziva

PromeniVelicinu 14vrednost argumenta iSize postaje 14 i naredba procedure menja veličinu prvog pasusa u 14pt.

Često je potrebno da procedura uradi nekakav posao bez dodatnih informacija, te joj ulazni podaci (argumenti) nisu neophodni.

Sub imeProcedure() naredba naredba … naredbaEnd Sub

Primer: napisati proceduru koja formatira prvi pasus tekućeg dokumenta koristeći italic.

Sub PromeniUItalic() ActiveDocument.Paragraphs(1).Range.Italic = TrueEnd Sub

Važno! Prilikom poziva procedure ne koriste se zagrade oko konkretnih vrednosti za njene argumente!

Funkcije

Osnovna razlika između procedura i funkcija je u tome što funkcija vraća vrednost, tj. poziv funkcije može da se tretira kao izraz određenog tipa i da se kao takav koristi u okviru drugih izraza istog tipa.

Function imeFukcije(argumenti) As tipVrednosti naredba naredba … naredba imeFunkcije = vrednostFunkcije 'naredba kojom funkcija vraća vrednostEnd FunctionVažno! Prilikom poziva funkcije moguća su dva slučaja:

21

Page 22: VBA Programiranje

1. Koristi se vrednost funkcije u okviru nekog izraza (npr. u naredbi dodele). U tom slučaju je obavezno pisati zagrade oko konkretnih vrednosti za njene argumente! (Ovo je najčešći slučaj sa funkcijom InputBox)

2. Vrednost funkcije se ignoriše, tj. jedino su bitni efekti naredbi tela funkcije. U tom slučaju ne koriste se zagrade oko konkretnih vrednosti za njene argumente, tj. poziv funkcije se tretira isto kao poziv procedure! (Ovo je čest slučaj sa funkcijom MsgBox)

Primer: napisati funkciju koja računa koliko samoglasnika ima data niska. Ideja: svako slovo niske izvlačimo kao podnisku dužine 1 i proveravamo da li je u pitanju neki od samoglasnika ("a", "e", "i", "o", "u"). Pošto se iste naredbe obavljaju za svako slovo, koristimo For petlju. Function BrojVokala(niska as String) As Integer Dim pozicija As Integer 'pozicija slova u niski Dim brVokala As Integer 'brojac samoglasnika u niski Dim duzina As Long 'duzina niske Dim slovo As String 'slovo kao podniska duzina = Len(niska) brVokala = 0 For pozicija = 1 To duzina slovo = Mid(niska, pozicija, 1) If (slovo = "a") Or (slovo = "e") Or (slovo = "i") Or (slovo = "o") Or (slovo = "u") Then brVokala = brVokala + 1 End If Next BrojVokala = brVokala 'naredba kojom funkcija vraća vrednostEnd FunctionS obzirom da je poziv funkcije vrednost ona se može i mora koristiti u izrazu:

Dim brojSuglasnika as IntegerbrojSuglasnika = Len("maestro") - BrojVokala("maestro") 'u promenljivu se upisuje 7 - 3 = 4

Prenos argumenata potprograma

U prethodnim odeljcima su prikazani primeri definisanja i pozivanja procedura i funkcija. Prilikom definisanja potprograma deklarisane su posebne promenljive koje treba da prihvate ulaz potprograma, a koje smo nazvali argumentima. Te promenljive se još nazivaju formalni parametri potprograma.

S druge strane, prilikom pozivanja potprograma potrebno je obezbediti konkretne vrednosti za argumente; te vrednosti se još nazivaju stvarni parametri potprograma. Stvarnih parametara mora biti koliko i formalnih, moraju biti navedeni u odgovarajućem redosledu, a odgovarajući formalni i stvarni parametri moraju biti istog tipa. (Ukoliko stvarni parametar nije istog tipa kao odgovarajući formalni parametar, VBA pokušava da obavi konverziju tipa, što nije uvek moguće).

22

Page 23: VBA Programiranje

Neka je definisana funkcija f. Ona računa izložilac najvećeg stepena broja 2 koji ne prelazi x; tj. vrednost f(x) je n, gde je 2n <= x < 2n+1. Npr, f(46) = 5 jer je 25 = 32 <= 46 < 64 = 26.

Function f(x as Integer) as Integer f = 0 While x >= 2 x = x \2 f = f + 1 Wend MsgBox x 'Ispisuje vrednost formalnog parametra xEnd Function

Neka procedura test poziva funkciju f.

Sub test() Dim m as Integer m = 46 MsgBox f(m) 'Ispisuje f(46) = 5 MsgBox m 'Ispisuje vrednost stvarnog parametra mEnd Sub

Postavlja se pitanje: kolika je vrednost promenljive m posle poziva funkcije f?

Postoje dva načina za prenos argumenata u VBA:

po adresi ili referenci (eng. By Reference) i po vrednosti (eng. By Value).

Prenos po adresi bi podrazumevao da formalni i njemu odgovarajući stvarni parametar predstavljaju istu memorijsku lokaciju. Stoga bi formalni i njemu odgovarajući stvarni parametar mogli imati različita imena, ali njihov sadržaj bi se nalazio na istoj adresi u memoriji. Tako bi svaka promena vrednosti formalnog parametra u okviru potprograma dovela i do promene vrednosti odgovarajućeg stvarnog parametra.

U ovom konkretnom primeru, prenos po adresi bi značio da su x i m jedno te isto, te bi prilikom ispisivanja njihovih vrednosti u oba slučaja MsgBox prikazao 1. Dakle, prenos po adresi bi doveo do toga da se vrednost promenljive m promeni u okviru poziva funkcije f(m).

S druge strane, prenos po vrednosti bi podrazumevao da se prilikom poziva potprograma kreira posebna memorijska lokacija za formalni parametar i da se u nju kopira vrednost odgovarajućeg stvarnog argumenta. Na taj način bi formalni i njemu odgovarajući stvarni parametar predstavljali dve različite memorijske lokacije i promena vrednosti formalnog parametra ne bi uticala na vrednost stvarnog parametra.

U ovom konkretnom primeru, prenos po vrednosti bi značio da promenljivama x i m odgovaraju dve različite memorijske lokacije, i promena vrednosti prve ne utiče na drugu, tj. MsgBox x bi prikazao 1, a

23

Page 24: VBA Programiranje

MsgBox m - vrednost 46. Dakle, prenos po vrednosti ne bi doveo do toga da se vrednost promenljive m promeni u okviru poziva funkcije f(m).

VBA omogućava oba navedena prenosa argumenata, tj. i prenos po referenci i prenos po vrednosti. Da bi se zadao odgovarajući prenos argumenata, prilikom deklaracije formalnog parametra navodi se ByRef (za prenos po adresi/referenci) ili ByValue (za prenos po vrednosti). Ukoliko se ekplicitno ne navede ni ByRef ni ByValue, efekat je isti kao da je navedeno ByRef (tj. u VBA je prenos po adresi podrazumevani način za prenos argumenata potprograma).

Prema tome, u gore navedenom primeru efekat je isti kao da je funkcija definisana sa:

Function f(ByRef x as Integer) as Integer f = 0 While x >= 2 x = x \2 f = f + 1 Wend MsgBox x 'Ispisuje vrednost formalnog parametra xEnd Function

Stoga je vrednost na kraju vrednost promenljive m ista kao i za x, tj. 1. Ako ne želimo da se vrednost promenljive m promeni prilikom poziva funkcije f, koristićemo sledeću definiciju:

Function f(ByValue x as Integer) as Integer f = 0 While x >= 2 x = x \2 f = f + 1 Wend MsgBox x 'Ispisuje vrednost formalnog parametra xEnd Function

Ugrađene funkcije Ugrađene funkcije za konverziju tipova (CInt, Round, CLng, CSng, CDbl, CDate, CStr, CVar) Ugrađene funkcije za rad sa niskama (Len, Left, Right, Mid, LTrim, RTrim, Trim, Lcase, Ucase)

Ugrađene funkcije za unos podataka (InputBox)

Ugrađene funkcije za ispisivanje poruka (MsgBox)

Ugrađene funkcije za konverziju tipova

CInt(izraz) konvertuje tekstuelni ili numerički izraz u vrednost tipa Integer

Round(izraz[, brojDecimala]) zaokružuje broj na zadati broj decimala. Ako broj decimala nije zadat,

24

Page 25: VBA Programiranje

podrazumeva se 0 decimala, tj. vrednost funkcije je ceo broj

CLng(izraz) konvertuje tekstuelni ili numerički izraz u vrednost tipa Long

CSng(izraz) konvertuje tekstuelni ili numerički izraz u vrednost tipa Single

CDbl(izraz) konvertuje tekstuelni ili numerički izraz u vrednost tipa Double

CDate(izraz) konvertuje tekstuelni ili numerički izraz u vrednost tipa Date

CStr(izraz) konvertuje tekstuelni ili numerički izraz u vrednost tipa String

CVar(izraz) konvertuje tekstuelni ili numerički izraz u vrednost tipa Variant

Ugrađene funkcije za rad sa niskama

Primer: Podniske, velika i mala slovaLen(niska)

Vrednost funkcije je dužina ulazne niske, tj. broj karaktera od kojih se sastoji niska (Len dolazi od eng. Length). Primer:

Dim ime as String 'deklaracija promenljive za niskuDim duzina as Integer 'deklaracija promenljive za duzinu niske imeime = "Pera" 'početna vrednost niske (inicijalizacija)duzina = Len(ime) 'u promenljivu se upisuje duzina niske 'Pera', tj. 4

Left(niska, dužina)

Vrednost funkcije je prefiks ulazne niske zadate dužine. Primer:

Dim prezime as String 'deklaracija promenljive za niskuDim prefiks as 'deklaracija promenljive za prefiks niske prezimeprezime = "Petrović" 'početna vrednost niske (inicijalizacija)prefiks = Left(prezime, 3) 'u promenljivu se upisuje prefiks dužine 3, tj. "Pet"

Right(niska, dužina)

Vrednost funkcije je sufiks ulazne niske zadate dužine. Primer:

Dim prezime as String 'deklaracija promenljive za niskuDim sufiks as 'deklaracija promenljive za sufiks niske prezimeprezime = "Milosavljev" 'početna vrednost niske (inicijalizacija)sufiks = Right(prezime, 4) 'u promenljivu se upisuje sufiks dužine 4, tj. "ljev"

Mid(niska, pozicija, dužina)

Vrednost funkcije je podniska ulazne niske koja počinje na zadatoj poziciji i ima zadatu dužinu (Mid dolazi od eng. Middle). Primer:

25

Page 26: VBA Programiranje

Dim prezime as String 'deklaracija promenljive za niskuDim infiks as 'deklaracija promenljive za podnisku niske prezimeprezime = "Milosavljev" 'početna vrednost niske (inicijalizacija)infiks = Mid(prezime, 5, 3) 'u promenljivu se upisuje infiks koji počinje na poziciji 5 i ima dužinu 3, tj. "sav"

LTrim(niska)

Vrednost funkcije je zadata niske iz koje su uklonjeni eventualni razmaci sa levog kraja niske (L dolazi od eng. Left). Primer:

Dim prezime as String 'deklaracija promenljive za niskuDim rezultat as 'deklaracija promenljive za rezultatprezime = " Milosavljev " 'početna vrednost niske (inicijalizacija)rezultat = LTrim(prezime) 'u promenljivu se upisuje niska bez razmaka sleva, tj. "Milosavljev "

RTrim(niska)

Vrednost funkcije je zadata niske iz koje su uklonjeni eventualni razmaci sa desnog kraja niske (R dolazi od eng. Right). Primer:

Dim prezime as String 'deklaracija promenljive za niskuDim rezultat as 'deklaracija promenljive za rezultatprezime = " Milosavljev " 'početna vrednost niske (inicijalizacija)rezultat = RTrim(prezime) 'u promenljivu se upisuje niska bez razmaka zdesna, tj. " Milosavljev"

Trim(niska)

Vrednost funkcije je zadata niske iz koje su uklonjeni eventualni razmaci sa oba kraja niske. Primer:

Dim prezime as String 'deklaracija promenljive za niskuDim rezultat as 'deklaracija promenljive za rezultatprezime = " Milosavljev " 'početna vrednost niske (inicijalizacija)rezultat = Trim(prezime) 'u promenljivu se upisuje niska bez razmaka sa oba kraja, tj. "Milosavljev"

Lcase(niska)

Vrednost funkcije je zadata niska u kojoj je svako veliko slovo zamenjeno odgovarajućim malim slovom (eng. lower case, odatle Lcase). Primer:

Dim prezime as String 'deklaracija promenljive za niskuDim rezultat as 'deklaracija promenljive za rezultatprezime = "Milosavljev" 'početna vrednost niske (inicijalizacija)rezultat = Lcase(prezime) 'u promenljivu se upisuje niska sa odgovarajućim malim slovima, tj. "milosavljev"

Ucase(niska)

Vrednost funkcije je zadata niska u kojoj je svako malo slovo zamenjeno odgovarajućim velikim slovom (eng. upper case, odatle Ucase). Primer:

Dim prezime as String 'deklaracija promenljive za niskuDim rezultat as 'deklaracija promenljive za rezultatprezime = "Milosavljev" 'početna vrednost niske (inicijalizacija)rezultat = Ucase(prezime) 'u promenljivu se upisuje niska sa odgovarajućim velikim slovima, tj. "MILOSAVLJEV"

Ugrađene funkcije za unos podataka

26

Page 27: VBA Programiranje

Funkcija InputBox prikazuje dijalog koji očekuje od korisnika da unese neku vrednost (broj ili tekst) i da potom klikne na odgovarajuće dugme (OK/Cancel). Vrednost funkcije je uneta vrednost.

Ova funkcija ima samo jedan obavezan argument (poruka korisniku šta da unese) dok su ostali argumenti neobavezni (najčešće se koriste naslov dijaloga i podrazumevana vrednost koja se nudi korisniku). Stoga se ova funkcija uobičajeno koristi na jedan od sledeća dva načina (ulaz je promenljiva nekog tipa koja prihvata korisnikov unos):

1. ulaz = InputBox(poruka). Npr. ulaz = InputBox("Unesite ceo broj veći od 2"). 2. ulaz = InputBox(poruka, naslovDijaloga, podrazumevanaVrednost).

Npr. ulaz = InputBox("Unesite ceo broj veći od 2", "Ulaz", 3).

Funkcije se mogu koristiti samo u okviru izraza, te mora postojati promenljiva kojoj se dodeljuje rezultat funkcije InputBox:

Dim ulaz as String 'deklaracija promenljive kojoj se dodeljuje ulaz ulaz = InputBox("Unesite ceo broj veći od 2", "Ulaz", 3)

Ugrađene funkcije za ispisivanje poruka

Funkcija MsgBox (skr. od eng. Message Box) prikazuje dijalog sa obaveštenjem za korisnika, a potom čeka da korisnik klikne na odgovarajuće dugme (OK, OK/Cancel, Yes/No, Yes/No/Cancel, Abort/Retry/Ignore, Retry/Cancel). Vrednost funkcije je konstanta koja ukazuje na koje dugme je korisnik kliknuo.

Najjednostavnija upotreba funkcije MsgBox je

MsgBox(poruka)

koja prikazuje samo jedno dugme (OK) na koje korisnik može da klikne.

27

Page 28: VBA Programiranje

Struktura programa

Ovde će biti razmotreni samo VBA programi u okviru aplikacije MS Word.

Makroi i moduli

Najjednostavaniji program napisan u programskom jeziku VBA je procedura bez ulaznih argumenata:

Sub imeProcedure() naredba … naredbaEnd Sub

Ovakav VBA program se naziva makro. Njemu se može pridružiti prečica sa tastature, opcija u meniju ili dugme sa palete alata (eng. toolbar). Aktiviranjem prečice, opcije menija ili dugmeta sa palete alata izvršava se odgovarajući makro, tj. njegove naredbe.

Važno je zapamtiti da procedure sa bar jednim argumentom, kao i funkcije (sa i bez argumenata) NISU makroi i ne mogu se samostalno izvršavati, pa im se stoga ne mogu pridružiti ni prečica sa tastature, ni opcija u meniju,s niti dugme sa palete alata.

U opštem slučaju, naredbe procedure mogu biti pozivi drugih procedura i funkcija. Kako se vremenom broj procedura i funkcija povećava, javlja se potreba da se one organizuju u logičke celine, kako bi se lakše koristile i održavale. Stoga je sledeći korak da se procedure i funkcije grupišu u module. Jedan modul obično predstavlja skup tesno povezanih procedura i funkcija koje zajedno omogućavaju obavljanje nekog zadatka.

Prema tome, VBA program može da se posmatra kao skup potprograma (procedura i funkcija), pri čemu je jedna procedura bez argumenata (makro) istaknuta (glavna). Rad programa se svodi na izvršavanje te glavne procedure koja poziva ostale potprograme iz skupa (procedure i funkcije), a koji opet mogu pozivati neke druge (ili čak iste) potprograme iz istog skupa. Potprogrami programa mogu ne moraju biti iz istog modula.

Projekti

Kada se pokrene MS Word i njegov VB Editor, u prozoru Project Explorer (Ctrl + R) za svaki otvoreni dokument u Word-u prikazuje se po jedan istoimeni projekat u VB Editor-u. Projekat se sastoji iz 0 ili više modula (eng. Modules), klasnih modula (eng. Class Modules) i formi/formulara (eng. Forms).

28

Page 29: VBA Programiranje

Klasni modul je posebna vrsta modula kojim se definiše jedna klasa (ime klase je isto kao i ime klasnog modula).

Forma/formular je prilagođeni dijalog koji korisnik sam kreira koristeći uobičajene kontrole (tekstuelna polja (eng. TextBox), oznake (eng. Label), komandna dugmad, (eng. CommandButton), opciona/radio dugmad (eng. OptionButton), polja za potvrdu (eng. CheckBox), padajući meniji (eng. ComboBox) itd).

Sem projekata koji odgovaraju konkretnim dokumentima, prikazuje se i jedan globalni projekat Normal.

Sada se može reći da VBA program u najopštijem slučaju predstavlja skup potprograma (procedura ili funkcija) iz istog ili različitih modula jednog ili više projekata, kao i definicija klasa (klasnih modula) i formi/formulara iz jednog ili više projekata. Jedna procedura bez argumenata (makro) je istaknuta (glavna) u tom skupu i ona poziva ostale potprograme iz skupa, a svi potprogrami mogu pozivati druge potprograme, kreirati objekte klasa i raditi sa njima, kao i vršiti interakciju sa korisnicima preko formi/formulara.

Opseg važenja promenljivih i potprograma

Izraz "opseg važenja" (eng. scope) se koristi za opis uslova pod kojim se može pristupiti promenljivoj, odnosno uslova pod kojim se može realizovati poziv potprograma. Kao sinonim za opseg važenja još se koristi izraz "vidljivost".

U zavisnosti od mesta i načina na koji je promenljiva deklarisana, njoj se može pristupiti:

samo u okviru jednog potprograma u kome je deklarisana (lokalna promenljiva). Da bi promenljiva bila lokalna, potrebno je deklarisati je u okviru nekog potprograma (procedure ili funkcije);

samo u okviru svih potprograma jednog modula u kome je deklarisana (promenljiva modula). Da bi promenljiva bila promenljiva modula, potrebno je deklarisati je na početku modula pre definicije prvog potprograma (dakle, deklaracija mora biti izvan bilo kog potprograma). Sem uobičajene deklaracije (Dim), da bi se naglasilo da se radi o promenljivoj modula, može se koristiti i ključna reč Private umesto Dim

samo u okviru svih potprograma svih modula jednog projekta u kome je deklarisana (promenljiva projekta). Da bi promenljiva bila promenljiva projekta, potrebno je deklarisati je na početku modula pre definicije prvog potprograma (dakle, deklaracija mora biti izvan bilo kog potprograma), ali se u deklaraciji umesto Dim mora koristiti Public. Da bi se sprečilo da tako deklarisana promenljiva bude globalna, neophodno je da se na početku modula u kome je deklarisana nalazi Option Private Module.

u okviru svih potprograma svih modula svih projekata (globalna promenljiva). Da bi promenljiva bila globalna promenljiva, potrebno je deklarisati je na početku modula pre definicije prvog potprograma (dakle, deklaracija mora biti izvan bilo kog potprograma), ali se u deklaraciji umesto Dim mora koristiti Public. Da bi se sprečilo da tako deklarisana promenljiva bude promenljiva modula, neophodno je da se na početku modula u kome je deklarisana NE nalazi Option Private Module.

29

Page 30: VBA Programiranje

U zavisnosti od mesta i načina na koji je potprogram definisan, on se može pozvati:

samo iz potprograma modula u kome je definisan pozvani potprogram (potprogram modula). Neophodno je da ispred definicije potprograma stoji ključna reč Private (Private Sub, odnosno Private Function).

samo iz potprograma projekta u kome je definisan pozvani potprogram (potprogram projekta). Neophodno je da ispred definicije potprograma ne stoji nijedna ključna reč, ili da stoji ključna reč Public. Da bi se sprečilo da tako definisani potprogram bude globalni potprogram, neophodno je da se na početku modula u kome je definisan nalazi Option Private Module.

iz svih potprograma ma kog projekta (globalni potprogram). Neophodno je da ispred definicije potprograma ne stoji nijedna ključna reč, ili da stoji ključna reč Public. Da bi se sprečilo da tako definisani potprogram bude potprogram modula, neophodno je da se na početku modula u kome je definisan NE nalazi Option Private Module.

Vidljivost promenljivih koje predstavljaju svojstva objekata, kao i potprograma koji predstavljaju metode objekata biće posebno obrađena u odeljku Pristup članovima klase.

Programske paradigme

Rešavanje nekog problema na računaru se zapravo svodi na modeliranje, tj. na nalaženje pogodne reprezentacije sa kojom računar može da radi i da eventualno proizvede neko rešenje. Sam problem može da se reprezentuje na razne načine, ali računar ne može da obradi svaku reprezentaciju. Najgore je što se ta nemogućnost odnosi i na prirodno-jezičku reprezentaciju koja ljudima deluje najjednostavnije (npr. "naći predmet sa najboljim prosekom u tekućoj školskoj godini").

S druge strane, računar razume mašinsku (fizičku) reprezentaciju problema koju mi obično zamišljamo kao konačne niske nula i jedinica (0110010010 itd), ali to je daleko od onoga što ljudi smatraju razumljivim i podesnim za rešavanje problema.

S obzirom na ogroman jaz između pomenutih reprezentacija ("modela problema" i " modela mašine") nastali su razni programski jezici koji omogućavaju da se zada nekakva "međureprezentacija" (program). Programski jezik (kao sredstvo za reprezentaciju problema programom) ima sledeće prednosti:

sintaksičke konstrukcije programskog jezika podsećaju na konstrukcije prirodnog jezika (npr If… Then… Else) i time su razumljivije ljudima u odnosu na mašinsku (fizičku) reprezentaciju;

rečenice programskog jezika (naredbe) su jednoznačne za razliku od konstrukcija prirodnog jezika;

naredbe programskog jezika se mogu automatski transformisati u mašinsku (fizičku) reprezentaciju koju računar razume.

Programski jezici se međusobno razlikuju po načinu na koji modeliraju razne realne probleme (programska paradigma). Tokom istorije programiranja pojavile su se 4 programske paradigme. Ovde će biti reči o dve:

30

Page 31: VBA Programiranje

imperativnoj (proceduralnoj) i objektno-orijentisanoj paradigmi.

Naime, VBA je jezik koji u osnovi podržava objektno-orijentisanu paradigmu. Pošto je objektno-orijentisana paradigma zapravo nadgradnja imperativne (proceduralne) paradigme, neophodno je u kratkim crtama opisati i jednu i drugu.

Imperativna (proceduralna) paradigma

Ova paradigma pri rešavanju problema koristi promenljive, strukture podataka i potprograme za modeliranje rešenja. Naziv proceduralni dolazi od toga što se program svodi na skup "procedura" od kojih svaka predstavlja jedan korak u rešavanju problema (pod "procedurama" se ovde podrazumevaju sve vrste potprograma, dakle i procedure i funkcije). Ovakav način razbijanja problema na manje potprobleme omogućava:

da se jasno sagledaju svi elementarni koraci koji su neophodni za rešavanje problema; da se u nekom drugom programu gde postoji potreba za istim elementarnim koracima ponovo

iskoriste već napisani potprogrami koji implementiraju te korake.

Nedostaci proceduralne paradigme:

kako se broj promenljivih, struktura podataka i potprograma povećava u programu, sve je teže uočiti njihove međusobne zavisnosti. Time se otežava ponovo korišćenje delova programa u nekom drugom programu, kao i održavanje programa, tj. pravljenje izmena u načinu na koji su pojedini koraci u programu realizovani;

postoji veća mogućnost greške usled pokušaja korišćenja neinicijalizovanih ili pogrešno inicijalizovanih struktura podataka;

postoji mogućnost neprimetnog "curenja memorije" ako se zaboravi na oslobađanje memorije koju zauzimaju dinamički kreirane strukture podataka.

Objektno-orijentisanog programiranje (skr. OOP)

Proceduralna paradigma je uvela nekoliko dobrih apstraktnih koncepata kao što su potprogrami (apstrakcija kontrole) i strukture podataka (apstrakcija podataka), ali se vremenom pokazalo da to nije dovoljno i da su neophodne dodatne apstrakcije. Ovde će biti spomenute samo neke osnovne ideje OOP-a koje su prisutne u programskom jeziku VBA.

Objekti i klase

Prvi zakon OOP-a glasi: "Sve je objekat". Pod objektom se podrazumeva bilo šta (predmet, živo biće, pojava, stanje, događaj i sl) što se može identifikovati na jedinstven način.

Svaki objekat je određen svojim osobinama (podacima o objektu) i svojim ponašanjem. Osobine objekta se realizuju kao promenljive (koje se u terminologiji OOP-a nazivaju svojstva objekta), dok

31

Page 32: VBA Programiranje

ponašanje objekta opisuju potprogrami, procedure i funkcije, koji se u terminologiji OOP-a nazivaju metodi objekta.

Svi objekti koji imaju istovetan skup svojstava i metoda (tj. istovetne osobine i ponašanje) pripadaju istoj klasi. Objekat je konkretni primerak (instanca) klase, dok je klasa opis zajedničkih osobina i ponašanja objekata koji joj pripadaju. Npr. svaki pojedinačni čovek ("Pera Perić") može da se predstavi u OOP-u kao jedan objekat, konkretan primerak klase Čovek. Klasa Čovek opisuje ono što je zajedničko za sve pojedinačne ljude, tj. apstrahuje njihove zajedničke osobine i ponašanje.

U programskom jeziku VBA svaka klasa se opisuje posebnim klasnim modulom u okviru projekta. Ime klase je istovetno sa imenom klasnog modula koji je opisuje. Opis klase je zapravo opis svojstava i metoda njenog proizvoljnog objekta. Na početku klasnog modula se deklarišu promenljive koje predstavljaju svojstva proizvoljnog objekta klase, a potom slede definicije procedura i funkcija koje predstavljaju metode ma kog objekta klase.

Svojstvima i metodama objekta se pristupa primenom sledeće notacije

imeObjekta.imeSvojstvaimeObjekta.imeMetoda

Kao primer navedeni su definicija klase (klasni modul) Student i primer rada sa konkretnim objektom te klase

Sub testStudent() Dim objStud As Student Const UKUPNO_ISPITA As Integer = 20 Set objStud = New Student 'kreiranje memorijskog prostora za objekat objStud.Init "Pera", "Pericx", #11/27/1990#, "091234" 'inicijalizacija objekta 'primeri poziva metoda objStud.CurriculumVitae 'ispisivanje kratke biografije objStud.dodajPolozxeniIspit "Matematika", 8 objStud.dodajPolozxeniIspit "Informatika", 9 objStud.dodajPolozxeniIspit "Bibliotekarstvo", 10 objStud.dodajPolozxeniIspit "Engleski jezik", 6 objStud.CurriculumVitae If objStud.JeDiplomirao(UKUPNO_ISPITA) Then MsgBox "Student je diplomirao. Cyestitamoooooo :))" Else MsgBox "Josx mora da se ucyi do diplome" End IfEnd Sub

Interfejs i implementacija

Kreiranje objekata nema uticaj na rešavanje problema ukoliko nema njihove uzajamne interakcije. U terminologiji OOP-a kaže se da objekti šalju jedni drugima poruke. Npr, objekat Čovek šalje poruku objektu Televizor da pojača svoj ton.

32

Page 33: VBA Programiranje

Jasno je da objekat Televizor ima mnogobrojne osobine i mogućnosti ponašanja, ali da li je objektu Čovek zaista neophodno da ih sve poznaje? Naravno, ne. Čovek uopšte ne mora (i ne želi) da zna kako Televizor zapravo radi, da li koristi katodne cevi ili tečni kristal, i kako kreira sliku i zvuk. Čoveka zapravo zanima način na koji može da pošalje poruku Televizoru (interfejs), npr. da pojača ton, a ne i kako to Televizor konkretno realizuje (implementacija).

Drugi zakon OOP-a glasi: "Razdvojiti interfejs od implementacije". Interfejs treba da bude javan (da bi objekat znao kako da pošalje poruku drugom objektu), a implementacija tajna. Nezanimanje ostalih objekata za implementaciju objekta Televizor nije jedini razlog za njeno skrivanje. Naime, time se omogućava da se u nekom trenutku implementacija promeni, da se učini boljom, a da objekat koji šalje poruku i dalje to čini na isti način, koristeći isti interfejs. Time se sprečava i opasnost da se onaj koji šalje poruku suviše oslanja na konkretnu implementaciju. To bi moglo da dovede do problema ako se jednog dana ta implementacija promeni, jer bi onda i ostali delovi programa (koji zavise od te implementacije) morali da se menjaju. Ideja je da promene u implementaciji objekta jedne klase ne utiču na promene u implementaciji objekata drugih klasa. Time se višestruko olakšava održavanje programa u odnosu na proceduralnu paradigmu.

U programskom jeziku VBA se koriste rezervisane reči Public i Private da bi se prilikom deklarisanja svojstava i definisanja metoda naznačilo da li će svojstvo/metod biti dostupan drugim objektima ili ne.

Svojstva se mogu deklarisati na tri načina:

Dim imeSvojstva As tipSvojstva 'privatno svojstvoPrivate imeSvojstva As tipSvojstva 'privatno svojstvoPublic imeSvojstva As tipSvojstva 'javno svojstvo

Dakle, ako se svojstvo ne deklariše eksplicitno pomoću Private/Public, već preko Dim, efekat je isti kao da je upotrebljena reč Private (dakle, svojstva su podrazumevano privatna, tj. sakrivena za druge objekte).

Metodi (procedure i funkcije) se takođe mogu definisati na tri načina. Ovde će biti ilustrovane samo procedure. Za funkcije je sve potpuno isto samo što svuda stoji Function umesto Sub, i, naravno, funkcije imaju vrednost čiji se tip mora navesti u definiciji.

Sub imeProcedure 'javna procedura naredbe…End Sub

Public Sub imeProcedure 'javna procedura naredbe…End Sub

Private Sub imeProcedure 'privatna procedura naredbe…End Sub

33

Page 34: VBA Programiranje

Dakle, ako se metod ne definiše eksplicitno pomoću Private/Public, efekat je isti kao da je upotrebljena reč Public (dakle, metodi su podrazumevano javni, tj. dostupni za druge objekte).

Objekti i klase u VBA

Reference na objekte

U pojedinim programskim jezicima (PASCAL, C/C++ i sl) postoji tzv. pokazivački tip podataka (eng. Pointer data type) čije su vrednosti adrese podataka u memoriji. Vrednost pokazivačkog tipa se naziva pokazivač zato što referiše ("pokazuje") na neku memorijsku lokaciju. Npr, neka je na memorijskoj adresi koja odgovara promenljivoj x smeštena neka vrednost (npr. realan broj 3.14), a p je pokazivač koji pokazuje na x (tj. vrednost od p je upravo adresa od x). PASCAL i C pružaju mehanizam da se na osnovu vrednosti pokazivača p (tj. adrese x) ustanovi vrednost u memorijskoj lokaciji na koju pokazuje p (tj. vrednost koju sadrži memorijska lokacija x). Taj proces se naziva dereferenciranje i u spomenutim jezicima se koristi različita notacija za pokazivač i dereferenciranu vrednost:

pokazivačdereferencirana vrednost("ono" na šta pokazivač "pokazuje")

p p^ (PASCAL notacija)

p *p (C/C++ notacija)

Dakle, naredba programskog jezika C/C++

*p = 5;ima isti efekat kao i naredba

x = 5;ako je p pokazivač čija je vrednost adresa memorijske lokacije x.

U drugim programskim jezicima (npr. VBA, C++, JAVA) umesto pokazivača (ili zajedno sa njima) se uvode reference na objekat. One su u osnovi isto što i pokazivači (tj. implementiraju se kao adrese objekata u memoriji), ali se prilikom korišćenja u programu tretiraju kao dereferencirane vrednosti, tj. nema nikakve razlike u označavanju reference i dereferencirane vrednosti.

Npr, neka je na memorijskoj adresi koja odgovara promenljivoj x smeštena neka vrednost (npr. realan broj 3.14), a r je referenca na x (tj. vrednost od r je upravo adresa od x). Tada bi naredba programskog jezika C/C++

34

Page 35: VBA Programiranje

r = 5;imala potpuno isti efekat kao i naredba

x = 5;

Koji je smisao pokazivača i referenci? Prilikom rada sa dinamički kreiranim podacima u programu (npr. objektima u VBA), često je zgodnije posredno operisati sa objektom preko njegove adrese umesto direktno. Naime, objekti mogu biti različite složenosti u pogledu svojstava i metoda koje sadrže i njihovo kopiranje (sa svim svojstvima koja takođe mogu biti složeni objekti) ponekad predstavlja izuzetno skupu i složenu operaciju koja zahteva i prostorne (memorijske) i vremenske resurse. To posebno dolazi do izražaja prilikom naredbe dodele ili prenosa argumenata potprograma po adresi, gde nije potrebno da se ceo objekat kopira , već je dovoljno samo omogućiti drugim delovima programa (promenljivama i potprogramima) da pristupe objektu ili da ga promene.

Deklaracija objektnih promenljivih (referenci na objekat) u VBA

Deklaracija objektnih promenljivih je ista kao i za promenljive prostog tipa

Dim imePromenljive As objektniTipTjKlasa

Ono što je važno napomenuti jeste da se deklaracijom objektne promenljive ne kreira sam objekat, već samo referenca na objekat (tj. promenljiva koja će sadržati adresu objekta i preko koje se radi sa objektom). Drugim rečima, ova deklaracija odvaja u memoriji SAMO lokaciju u kojoj će se čuvati adresa objekta, a ne i memorijski prostor za sam objekat.

Pošto tako deklarisana objektna promenljiva ne referiše ni na šta, tj. nije joj pridružena nijedna validna adresa u memoriji, ona automatski dobija specijalnu vrednost Nothing. Testiranjem da li objektna promenljiva ima vrednost Nothing se zapravo proverava da li objektna promenljiva referiše na neki objekat ili ne. Testiranje se obavlja posebnim operatorom Is.

If objektnaPromenljiva Is Nothing Then MsgBox 'Objektna promenljiva ne referisxe ni na sxta'End If

Operator Is se koristi za upoređivanje da li dve objektne promenljive referišu na isti objekat.

If objektnaPromenljiva1 Is objektnaPromenljiva2 Then MsgBox 'Objektne promenljive referisxu na isti objekatEnd If

Ako su objektnaPromenljiva1 i objektnaPromenljiva2 reference na objekte, tada je

objektnaPromenljiva1 Is objektnaPromenljiva2logički izraz čija je vrednost True ako i samo ako obe reference referišu na isti objekat.

35

Page 36: VBA Programiranje

Ako dva objekta, objektnaPromenljiva1 i objektnaPromenljiva2, pripadaju istoj klasi i imaju istovetne vrednosti odgovarajućih svojstava, a pritom zauzimaju različite memorijske lokacije, tada je

objektnaPromenljiva1 Is objektnaPromenljiva2 = False

Naime, tada je jedan od tih objekata kopija onog drugog i u tom smislu izgledaju istovetno, ali su njihove adrese u memoriji različite, a samim tim su i reference na te objekte različite, pa VBA tretira te objekte kao dva različita objekta.

Inicijalizacija objekata u VBA

Inicijalizacija objekta se obavlja u dve faze:

1. Odvajanje memorijskog prostora za objekat;2. Inicijalizacija svojstava objekta.

U mnogim programskim jezicima obe pomenute faze se obavljaju pozivom posebnog metoda u klasi koji se zove konstruktor. U programskom jeziku VBA ove dve faze su razdvojene.

Odvajanje memorijskog prostora za objekat se obavlja pomoću posebnog oblika naredbe dodele Set koji koristi ključnu reč New.

Set objektnaPromenljiva = New ImeKlase

Efekat ove naredbe je da se adresa kreiranog objekta u memoriji dodeljuje objektnoj promenljivoj koja se dalje koristi kao referenca na objekat.

Međutim, da bi se objekat koristio, neophodno je inicijalizovati njegova svojstva na odgovarajući način koji zavisi od klase kojoj objekat pripada.

36

Page 37: VBA Programiranje

Ugrađene klase

Kolekcije (dinamički nizovi)

Kolekcija je uređen skup elemenata na koje se može referisati kao na celinu. Elementi kolekcije su indeksirani i njima se može pristupiti preko notacije: imeKolekcije(indeks).

Rad sa kolekcijama u VBA se svodi na korišćenje objekata Collection i/ili Dictionary

Objekat CollectionMetode:

Add(objekat) Dodaje objekat kao poslednji element kolekcije.

Count Ukupan broj elemenata kolekcije

Remove(index)Uklanja iz kolekcije element sa indeksom index ako takav postoji; u protivnom javlja grešku.

Primer: Dodavanje i brisanje stavki iz menija

Objekat Dictionary

Objekat klase Dictionary je je kolekcija indeksirana niskama. Indeks elementa se još naziva ključ i on je tipa String (niska). Zato se još kaže da ova struktura podataka predstavlja skup parova (ključ, vrednost).

Različiti elementi kolekcije moraju imati različite indekse, odnosno ključeve, te se stoga svaki element može identifikovati preko jedinstvene vrednosti ključa.

Objekat tipa Dictionary je sličan objektu klase Collection, ali nudi i neke dodatne mogućnosti:

Metode:

Exists(key)Proverava da li zadati ključ key postoji u objektu Dictionary i u zavisnosti od toga vraća True

ili False. Objekat klase Collection nema ovu mogućnost pretraživanja.

RemoveAll

Uklanja iz objekta Dictionary sve elemente. Objekat tipa Collection nema takvu mogućnost već se elementi moraju uklanjati jedan po jedan metodom Remove, se to može izbeći naredbom

objekatTipaCollection=Nothing

37

Page 38: VBA Programiranje

Glavna prednost objekta tipa Dictionary nad objektom klase Collection je lakše pretraživanje. Međutim, postoje situacije kada je objekat klase Collection nezamenljiv (rad sa referencama).

S druge strane, Dictionary se ne može direktno koristiti u programu kao Collection, već se mora prethodno dodati referenca na Microsoft Scripting Runtime u meniju Tools/References (Visual Basic Editor), a prilikom deklarisanja objekta tipa Dictionary mora se koristiti naredba oblika

Dim imeObjekta as New Scripting.Dictionary

Naredbe za rad sa objektima Naredba dodele Set For Each … In naredba (petlja, ciklus)

With naredba

Naredba dodele Set

1. Set promenljiva = referencaNaObjekat2. Set promenljiva = New ImeKlase

Naredba oblika 1. dodeljuje adresu objekta na koji referiše referencaNaObjekat promenljivoj na levoj strani znaka jednakosti

Naredba oblika 2. kreira objekat klase ImeKlase i dodeljuje promenljivoj referencu na taj objekat (adresu objekta u memoriji). Npr.

38

Page 39: VBA Programiranje

Set lista = New Collectionkreira objekat Collection i referencu na taj objekat (adresu tog objekta u memoriji) dodeljuje promenljivoj lista.

For Each … In naredba (petlja, ciklus)

Koristi se za obilazak kolekcije, tj. za obavljanje određenih radnji nad svim elementima kolekcije.

For Each element In kolekcija naredba naredba … naredbaNext

Za svaki element kolekcije izvršava se niz naredbi između For Each i Next (telo petlje).

With naredba

S obzirom da svojstvo objekta može ponovo biti objekat, referenca na neko svojstvo često može da se pretvori u dugačak niz karaktera, npr:

ActiveDocument.Words(1).Font.Size = 14Ukoliko se niz naredbi odnosi na svojstva istog objekta sa dugom referencom, postaje neprijatno stalno ponavljati tu dugu referencu:

ActiveDocument.Words(1).Font.Size = 14ActiveDocument.Words(1).Font.Name = "Arial"ActiveDocument.Words(1).Font.Color = wdColorRedDa bi se to izbeglo, koristi se With naredba:

With ActiveDocument.Words(1).Font .Size = 14 .Name = "Arial" .Color = wdColorRedEnd With

Svojstva i metode kontrola Zajednička svojstva kontrola Label (oznaka, obeležje)

TextBox (tekstuelno polje, polje za unos teksta)

CommandButton (komandno dugme)

CheckBox (polje za potvrdu)

39

Page 40: VBA Programiranje

OptionButton (opciono dugme, radio dugme)

Frame (okvir)

ComboBox (padajući meni)

MultiPage (kartice)

Zajednička svojstva kontrola

NameIme promenljive (objekta) preko koje programer pristupa svojstvima i metodama kontrole. Imena promenljivih se obično daju korišćenjem tzv. mađarske notacije.

Enabled Logička vrednost True ili False koja označava da li korisnik može da koristi kontrolu ili ne.

VisibleLogička vrednost True ili False koja označava da li korisnik može da vidi kontrolu ili ne. Na ovaj način se pojedine kontrole na formi mogu sakriti od korisnika.

Label (oznaka, obeležje)

Namena:

Prikaz teksta bez mogućnosti izmene. Koristi se za oznaka ili objašnjenje namene drugih kontrola u formi (npr. za TextBox).

Preporuka:

Radi lakšeg prepoznavanja o kom tipu kontrole se radi, najbolje je da ime promenljive koja predstavlja kontrolu Label ima prefiks m_lb (npr. m_lbDinari).

Svojstva:

Caption tekst koji se prikazuje u okviru kontrole Label

TextAlignporavnanje teksta (moguće vrednosti su fmTextAlignLeft, fmTextAlignCenter, fmTextAlignRight).

Zajednička svojstva kontrola

Podrazumevani događaj:

Click

Primer:

40

Page 41: VBA Programiranje

Konverzija dinara u evre i obrnuto

TextBox (tekstuelno polje, polje za unos teksta)

Namena:

Unos teksta od strane korisnika. Uz ovu kontrolu se obično navodi kontrola Label da bi korisnik znao kakav unos se od njega očekuje.

Preporuka:

Radi lakšeg prepoznavanja o kom tipu kontrole se radi, najbolje je da ime promenljive koja predstavlja kontrolu TextBox ima prefiks m_txt (npr. m_txtDinari).

Svojstva:

Texttekst koji se prikazuje u okviru kontrole TextBox (unet od korisnika ili upisan od strane programa).

TextAlignporavnanje teksta (moguće vrednosti su fmTextAlignLeft, fmTextAlignCenter, fmTextAlignRight).

Valuekao i Text, ovo svojstvo predstavlja tekst koji se prikazuje u okviru kontrole TextBox (unet od korisnika ili upisan od strane programa).

Zajednička svojstva kontrola

Metode:

Cutpremešta tekst koji se prikazuje u okviru kontrole TextBox u Clipboard, tako da TextBox ostaje prazan.

Copykopira tekst koji se prikazuje u okviru kontrole TextBox (unet od korisnika ili upisan od strane programa) u Clipboard.

Pasteupisuje kopiju teksta iz Clipboard-a u svojstvo Text kontrole TextBox, tj. prikazuje tu kopiju teksta u okviru kontrole TextBox.

Primer:

Konverzija dinara u evre i obrnuto

CommandButton (komandno dugme)

41

Page 42: VBA Programiranje

Namena:

Zadavanje akcije od strane korisnika klikom na dugme. Ova kontrola obično ima natpis ili ikonicu koja sugeriše korisniku kakva akcija se od njega očekuje.

Preporuka:

Radi lakšeg prepoznavanja o kom tipu kontrole se radi, najbolje je da ime promenljive koja predstavlja kontrolu CommandButton ima prefiks m_btn (npr. m_btnDinareUEvre).

Svojstva:

Caption Natpis na dugmetu koji sugeriše korisniku kakva akcija se od njega očekuje.

Zajednička svojstva kontrola

Primer:

Konverzija dinara u evre i obrnuto

CheckBox (polje za potvrdu)

Namena:

Označava nekakvu opciju koja se nudi korisniku. Korisnik eventualnim klikom može da štriklira polje za potvrdu i da na taj način izabere opciju. Prazno polje za potvrdu znači da korisnik ne želi ponuđenu opciju. Različite opcije predstavljene ovim kontrolama se mogu birati nezavisno jedna od druge.

Preporuka:

Radi lakšeg prepoznavanja o kom tipu kontrole se radi, najbolje je da ime promenljive koja predstavlja kontrolu CheckBox ima prefiks m_chk (npr. m_chkWindows).

Svojstva:

Caption Natpis na dugmetu koji sugeriše ponuđenu opciju.

ValueLogička vrednost True ili False koja označava status kontrole, tj. da li je korisnik štriklirao dugme za potvrdu ili ne.

Zajednička svojstva kontrola

Podrazumevani događaj:

Click

42

Page 43: VBA Programiranje

OptionButton (opciono dugme, radio dugme)

Namena:

Ova kontrola se uvek pojavljuje u grupi, tj. nikad se ne koristi sama. Grupa kontrola tipa OptionButton omogućava da se iz ponuđene liste opcija izabere samo jedna klikom na odgovarajuće radio dugme. U jednom trenutku moguće je izabrati samo jedno radio dugme, tj. izborom jednog radio dugmeta automatski se poništava izbor ostale radio dugmadi iz grupe.Postoje dva načina da se radio dugme pridruži nekoj grupi. Prvi način se svodi na to da se svojstvu GroupName svakog radio dugmeta iz grupe dodeli isti tekst (naziv grupe). The advantage of using this method is that it requires less space and can make your program work faster. In addition, this method is transparent, so any background image you use on the form shows through.Drugi način podrazumeva da se prethodno na formi napravi kontrola tipa Frame i da se sva radio dugmad koja pripadaju istoj grupi pozicioniraju u okviru te kontrole. Ovaj metod je manje podložan greškama jer se lako uočava koja radio dugmad pripadaju istoj grupi, a i lakše se manipuliše sa samom grupom (promena pozicije grupe, sakrivanje grupe, deaktiviranje grupe itd).Kontrole tipa OptionButton se koriste za predstavljanje fiksne (statične) liste opcija, tj. liste od svega nekoliko opcija koje se tokom izvršavanja programa neće menjati. Za rad sa listama koje imaju ogroman broj opcija, kao i za rad sa dinamičkim listama (čiji se sadržaj menja tokom izvršavanja programa), preporučuje se korišćenje kontrole ComboBox.

Preporuka:

Radi lakšeg prepoznavanja o kom tipu kontrole se radi, najbolje je da ime promenljive koja predstavlja kontrolu OptionButton ima prefiks m_opt (npr. m_optProdajniKurs).

Svojstva:

Caption Natpis na dugmetu koji sugeriše ponuđenu opciju.

ValueLogička vrednost True ili False koja označava status kontrole, tj. da li je korisnik izabrao datu opciju ili ne.

Zajednička svojstva kontrola

Primer:

Konverzija dinara u evre i obrnuto

Frame (okvir)

Namena:

43

Page 44: VBA Programiranje

Ova kontrola omogućava grupisanje kontrola u celine, kako bi ih korisnik lakše uočio na formi. Posebno je korisna za grupisanje radio dugmadi u grupu tako da se od ponuđenih opcija može izabrati samo jedna (tj. može se izabrati samo jedno radio dugme). Na ovaj način se lako manipuliše grupom kontrola kao celinom (promena pozicije grupe, sakrivanje grupe, deaktiviranje grupe itd).

Preporuka:

Radi lakšeg prepoznavanja o kom tipu kontrole se radi, najbolje je da ime promenljive koja predstavlja kontrolu OptionButton ima prefiks m_opt (npr. m_optProdajniKurs).

Svojstva:

Caption Natpis na kontroli Frame koji sugeriše korisniku o nameni grupisanih kontrola.

Zajednička svojstva kontrola

Podrazumevani događaj:

Click

Primer:

Konverzija dinara u evre i obrnuto

ComboBox (padajući meni)

Namena:

Ova kontrola omogućava da se izabere samo jedna iz ponuđene liste opcija padajućeg menija njih klikom na tekst odgovarajuće opcije, pri čemu korisnik eventualno može da otkuca tekst opcije koje nema na spisku, ali ona neće biti automatski dodata. Ako je vrednost svojstva MatchRequired jednaka True, tada korisnik može da izabere samo ponuđene opcije, tj. prilikom pokušaja da otkuca svoju opciju dobiće poruku o grešci.Kontrole tipa ComboBox se koriste za predstavljanje listi sa velikim brojem opcija, kao i za rad sa dinamičkim listama (čiji se sadržaj menja tokom izvršavanja programa).

Preporuka:

Radi lakšeg prepoznavanja o kom tipu kontrole se radi, najbolje je da ime promenljive koja predstavlja kontrolu ComboBox ima prefiks m_cmb (npr. m_cmbMeni).

Svojstva:

ListCount Ukupan broj ponuđenih opcija

44

Page 45: VBA Programiranje

ListIndexIndeks trenutno izabrane opcije. Indeksi izabranih opcija počinju od nule, tj. nalaze se u opsegu od 0 do (ListCount - 1). Ako nijedna opcija nije izabrana, vrednost svojstva je -1.

Text Tekst izabrane opcije

TextAlignporavnanje teksta opcije (moguće vrednosti su fmTextAlignLeft, fmTextAlignCenter, fmTextAlignRight).

Value Tekst izabrane opcije

Zajednička svojstva kontrola

Podrazumevani događaj:

Click

Metode:

AddItem(niska)Ovaj metod dodaje u meni opciju opisanu tekstom niska koji predstavlja ili konstantnu nisku ili promenljivu tipa String.

Copy kopira tekst izabrane opcije kontrole ComboBox u Clipboard.

Paste upisuje kopiju teksta iz Clipboard-a u kontrolu ComboBox.

RemoveItem(index)Ovaj metod briše iz menija opciju sa indeksom index (indeksi se numerišu počev od nule).

Primer:

Ubacivanje i izbacivanje stavki iz menija

MultiPage (kartice)

Namena:

Ova kontrola omogućava da forma sadrži više dijaloga od kojih je u svakom trenutku vidljiv samo jedan. Svaki dijalog ima svoju stranu (eng. Page) na kojoj se nalaze kontrole dijaloga, a sama kontrola MultiPage sadrži kolekciju objekata tipa Page.

Zajednička svojstva kontrola

Podrazumevani događaj:

Click

45

Page 46: VBA Programiranje

Mađarska notacija za kontrole

Mađarska notacija je dogovor o imenovanju promenljivih u programiranju. Ovde ćemo ilustrovati jedan oblik te notacije kod kojeg prefiks imena promenljive ukazuje na njen tip, dok ostatak imena ukazuje na namenu promenljive. Prefiks je obično skraćenica (3-4 slova) koja se lako pamti i koja asocira na tip promenljive. Prefiks se piše malim slovima. Ostatak imena su spojene reči koje označavaju namenu promenljive, pri čemu je prvo slovo svake reči veliko, dok su ostala mala.

U narednoj tabeli su navedeni najčešće korišćeni prefiksi za imena kontrola u programskom jeziku VBA. Npr. optProdajniKurs je ime promenljive koja predstavlja opciono dugme (tip OptionButton, opt), a namena tog dugmeta je izbor opcije prodajni kurs.

Kontrola Prefiks nazivapromenljive

Primer

Form frm frmFileOpen

Label lbl lbHelpMessage

Text box txt txtGetText

Command button btn btnCancel

Check box chk chkReadOnly

Option button opt optFrench

Frame fra fraLanguage

Combo box cbo cmbEnglish

List box lst lstPolicyCodes

Image img imgIcon

Menu mnu mnuFileOpen

Picture box pic picDiskSpace

Data dat datBiblio

Line lin linVertical

Directory list box dir dirSource

Drive list box drv drvTarget

File list box fil filSource

Kreiranje formulara (UserForm)1. Microsoft Word > meni Tools > podmeni Macro> stavka Visual Basic Editor (isti efekat u Microsoft

Word-u ima prečica Alt+F11)2. VB editor > meni Insert > stavka UserForm.

46

Page 47: VBA Programiranje

Toolbox sadr�i listu kontrola koje se mogu preneti na formular. Pozicioniranjem miša na kontrolu pojavljuje se njeno ime.

3. Preneti dve kontrole CommandButton na formular (kliknuti i prevući). 4. Preneti kontrolu Label na formular (kliknuti i prevući).

5. Preneti kontrolu TextBox na formular (kliknuti i prevući).

6. Veličina i pozicija kontrola mo�e se regulisati mišem (VB editor > meni Format > podmeniji Align, Make Same Size itd).

Svojstva kontrola

7. Meni View > Properties Window (ili F4). Ovaj prozor prikazuje svojstva izabrane kontrole na formularu. Da bi se videla svojstva samog formulara potrebno je izabrati formular tako što se klikne na proizvoljan deo formulara na kome nije nijedna kontrola. Properties window prikazuje nazive svojstava (leva kolona) i njihove vrednosti (desna kolona). Na vrhu ovog prozora je padajući meni Object iz koga se mo�e izabrati ime kontrole čija se svojstva �ele videti.

8. Izabrati CommandButton1 iz padajućeg menija Object.

9. U levoj koloni izabrati svojstvo Name property. U desnoj koloni otkucati btnPodvuci i pritisnuti ENTER.

47

Page 48: VBA Programiranje

10.Ponoviti korake 8 i 9 za kontrolu CommandButton2. Pre toga je potrebno izabrati CommandButton2 iz padajućeg menija Object i otkucati btnOriginal za vrednost svojstva Name (pošto ne mogu postojati dve kontrole sa istim imenom).

11. Na isti način se definišu vrednosti ostalih svojstava za sve kontrole formulara (Tabela 1).

U padajućem meniju Object biće prikazana nova imena kontrola (btnPodvuci umesto CommandButton1, btnOriginal umesto CommandButton2 itd).

Kontrola Svojstvo

Vrednost

UserForm1 Name frmPodvlacenje

UserForm1 Caption

Podvlacenje

CommandButton1

Name btnPodvuci

CommandButton1

Caption

Podvuci

CommandButton2

Name btnOriginal

CommandButton2

Caption

Kobajagi Original

Label1 Name lbPrvaRec

Label1 Caption

Prva rec

TextBox1 Name txtUlaz

Napomena

Kada dodajete kontrole formularu, VB automatski dodeljuje jedinstveno ime kontroli. Podrazumevano ime kontrole za datu kontrolu je tip kontrole (npr. Label ili CommandButton) za kojim sledi broj (broj se automatski uvećava svaki put kada se doda kontrola istog tipa). Npr, posle

48

Page 49: VBA Programiranje

pozicioniranja prvog komandnog dugmeta, podrazumevano ime sledećeg je CommandButton2. Po�eljno je kontrole imenovati tako da se iz imena mo�e pretpostaviti njihova namena, a i da se ne bi dogodilo da se vrednosti svojstava zadaju za pogrešnu kontrolu.

Obrada događaja

Kada korisnik klikne stavku menija ili dugme pruge sa alatkama (eng. toolbar button) ili izabere stavku iz kontrole ComboBox (padajući meni), izvršavaju se određene akcije (koje zavise od vrste kontrole) kao reakcija na događaj. U slučaju menija ili dugmadi reaguje se na događaj Click (eng. Click event, klik mišem), dok se prilikom izbora stavke iz kontrole ComboBox (padajućeg menija) ili promene teksta u tekstuelnom polju reaguje na događaj Change (eng. Change event, promena). Da bi došlo do očekivane reakcije objekta (kontrole), potrebno je napisati odgovarajuće naredbe i povezati ih sa objektom koji reaguje.

Kada se na neku kontrolu forme primeni dvostruki klik, toj kontroli se automatski pridružuje procedura za obradu događaja (eng. event handler). Procedura je zapravo imenovani skup naredbi koje se izvršavaju kao celina, redosledom kojim su navedene, pravi mali program (potprogram). Opšti oblik procedure je:

Sub imeProcedure(argumenti) naredba naredba … naredbaEnd Sub

gde su argumenti ulazi potprograma. U slučaju procedure za obradu događaja, argumenata nema

Ime procedure je u opštem slučaju proizvoljno, ali u slučaju procedura za obradu događaja to nije slučaj. Procedura za obradu događaja automatski dobija tačno određeno ime koje ne sme da se menja; to ime se sastoji od imena kontrole na koju se događaj odnosi (svojstvo Name te kontrole), podvlake i naziva događaja (Click, DblClick, Change, KeyDown, KeyUp itd). Npr, ako je kontrola dugme sa imenom btnPodvuci, procedura koja obrađuje klik na to dugme MORA da se zove btnPodvuci_Click.

Sub btnPodvuci_Click() naredba naredba … naredbaEnd Sub

49

Page 50: VBA Programiranje

1. Dvostruki klik na dugme btnPodvuci (sa oznakom Podvuci) otvara prozor u kome se mogu kucati naredbe jezika VBA. U prozoru se pojavljuje "kostur" procedure btnPodvuci_Click.

2. Dopuniti proceduru btnPodvuci_Click sledećim naredbama (linije koje počinju apostrofom su komentari i VBA ih ignoriše):

3. Sub btnPodvuci_Click()4. 'deklaracija promenljive za obilazak kolekcije recenica5. Dim recenica As Range6. 'ActiveDocument.Sentences je kolekcija recenica u tekucem dokumentu7. For Each recenica In ActiveDocument.Sentences8. 'Funkcija Trim uklanja eventualne razmake iz prve reci tekuce recenice;9. If Trim(recenica.Words(1)) = txtUlaz.Text Then10. 'ako je prva rec u recenici ona koju je korisnik uneo, podvlacimo celu recenicu11. recenica.Underline = wdUnderlineSingle12. End If13. Next

End Sub14. Slično, dopuniti proceduru btnOriginal_Click sledećim naredbama: 15. Sub btnOriginal_Click()16. 'deklaracija promenljive za obilazak kolekcije recenica17. Dim recenica As Range18. 'ActiveDocument.Sentences je kolekcija recenica u tekucem dokumentu19. For Each recenica In ActiveDocument.Sentences20. 'Funkcija Trim uklanja eventualne razmake iz prve reci tekuce recenice;21. If Trim(recenica.Words(1)) = txtUlaz.Text Then22. 'ako je prva rec u recenici ona koju je korisnik uneo, podvlacimo celu recenicu23. recenica.Underline = wdUnderlineNone24. End If25. Next

End Sub

Primećujemo da se ove dve procedure (sem u imenu) razlikuju svega u načinu na koji se rečenica podvlači (wdUnderlineSingle i wdUnderlineNone).

Kreiranje makroa

Jedan način da se kreira makro je da se snimi neka akcija u Word-u (Microsoft Word > meni Tools > podmeni Macro > Record New Macro). Snimanje se završava klikom na dugme Stop. Potom se iz dijaloga Macros (Microsoft Word > meni Tools > podmeni Macro > Macros) izabere kreirani makro i klikom na dugme Edit otvara se prozor u kome se makro može dalje dorađivati.

Drugi način je da se u VB editoru u okviru prozora Project, među postojećim projektima pronađe projekat Normal. Svaki projekat (pa i Normal) se sastoji iz stavki (ne obavezno svih) Microsoft Word Objects, Forms, Modules, References. Ako u okviru stavke Modules ne postoji nijedan modul, potrebno je napraviti ga (meni Insert, stavka Module). Dvostrukim klikom na modul otvara se prozor u kome se mogu unositi procedure.

50

Page 51: VBA Programiranje

U ovom slučaju napravićemo kratku proceduru koja samo poziva formular koji smo napravili. Formular koji smo napravili zove se frmPodvlacenje, a metod Show ga prikazuje na ekranu.

Sub prikaziFormu() frmPodvlacenje.ShowEnd Sub

Dodavanje pruge sa alatkama (Toolbar)

Najbrži način je desni klik na postojeće alatke, i izbor stavke Customize. U dijalogu se bira kartica

Toolbars i klikne na dugme New.

Dodavanje dugmeta PP u prugu sa alatkama (Toolbar Button)

Najbrži način je desni klik na postojeće alatke, i izbor stavke Customize. U dijalogu se bira kartica Commands. Iz leve kolone (Categories) bira se stavka Macros, a u desnoj koloni (Commands) se pojavljuju potpuna imena svih makroa. Potpuno ime makroa ima za prefiks ime projekta i ime modula u kome se nalazi makro, a potom sledi samo ime makroa, tj. procedure (npr. potpuno ime makroa prikaziFormu koji se nalazi u modulu NewMacros projekta Normal glasi Normal.NewMacros.prikaziFormu).

Iz desne kolone (Commands) se bira potpuno ime makroa i prevlači se na željenu prugu sa alatkama (tj. onu koju smo upravo kreirali).

51

Page 52: VBA Programiranje

Dijalog Customize se nikako ne zatvara, već desni klik na novo dugme otvara meni u kome se dugmetu može prilagoditi izgled (ime na dugmetu, da li se prikazuju tekst i/ili slika na dugmetu i sl). Kada se završi dorada dugmeta, dijalog Customize se može zatvoriti. Dugme je spremno za korišćenje, a ispitni zadatak je rešen.

Objektni model Word-a Document

o Struktura dokumenta

Objekat Font

o Name

o Size

o Color

52

Page 53: VBA Programiranje

Objekat Range

o Formatiranje pomoću svojstva Range

Bold

Italic

Underline

o Velika i mala slova (konverzije)

o Promena fonta (boja, veličina)

o Manje strukturne jedinice

Text

Characters

Words

Sentences

Paragraphs

Objekat Selection

o Promena fonta (boja, veličina)

o Svojstva

Text

Characters

Words

Sentences

Paragraphs

o Metodi

Extend

MoveDown

MoveLeft

MoveRight

MoveUp

53

Page 54: VBA Programiranje

Objekat Paragraph

o Svojstva

Range

Alignment

DropCap

FirstLineIndent

LeftIndent

RightIndent

o Metodi

Indent

Outdent

Struktura dokumenta

Dokument kao kolekcija karaktera (Characters) Dokument kao kolekcija reči (Words)

Dokument kao kolekcija rečenica (Sentences)

Dokument kao kolekcija pasusa (Paragraphs)

Elementi prve tri kolekcije su objekti tipa Range, dok su elementi kolekcije Paragraphs objekti tipa Paragraph.

Objekat Font

Sadrži karakteristike fonta (ime fonta, veličina, boja i sl). Pojavljuje se kao svojstvo i kod objekta Range i kod objekta Selection.

Name Vrednost ovog svojstva je ime fonta (Arial, Courier, Courier New, Tahoma, Times New Roman i sl) pod navodnicima. Da bi se promenio font u Arial, dovoljna je sledeća naredba:

deoDokumenta.Range.Font.Name = "Arial"gde je deoDokumenta ceo dokument ili pasus.Ako formatiramo karakter, reč ili rečenicu, koristimo činjenicu da su elementi kolekcija Characters, Words

i Sentences upravo objekti klase Range. Npr, da bi se tako formatirala 2. reč 3. pasusa u aktivnom dokumentu, dovoljno je uraditi ovako nešto:

ActiveDocument.Paragraphs(3).Words(2).Font.Name = "Arial"

54

Page 55: VBA Programiranje

Slično važi i za objekat Selection:

Selection.Font.Name = "Arial"

Size

Vrednost ovog svojstva je veličina fonta u pointima (pt). Da bi se promenila veličina fonta u 14pt, dovoljna je sledeća naredba:

deoDokumenta.Range.Font.Size = 14gde je deoDokumenta ceo dokument ili pasus.Ako formatiramo karakter, reč ili rečenicu, koristimo činjenicu da su elementi kolekcija Characters, Words

i Sentences upravo objekti klase Range. Npr, da bi se tako formatirala 2. reč 3. pasusa u aktivnom dokumentu, dovoljno je uraditi ovako nešto:

ActiveDocument.Paragraphs(3).Words(2).Font.Size = 14Slično važi i za objekat Selection:

Selection.Font.Size = 14

Color

Vrednost ovog svojstva je konstanta koja predstavlja boju. Ime konstante počinje sa 'wdColor', a zatim sledi ime boje (npr. wdColorRed, wdColorGreen, wdColorBlue itd). Ove konstante se ne moraju pamtiti napamet, jer prilikom kucanja naredbe dodele, odmah nakon znaka jednakosti VB editor nudi meni sa svim konstantama.

Da bi se promenila boja fonta u crvenu, dovoljna je neka od sledećih naredbi:

deoDokumenta.Range.Font.Color = wdColorRedgde je deoDokumenta ceo dokument ili pasus.Ako formatiramo karakter, reč ili rečenicu, koristimo činjenicu da su elementi kolekcija Characters, Words

i Sentences upravo objekti klase Range. Npr, da bi se tako formatirala 2. reč 3. pasusa u aktivnom dokumentu, dovoljno je uraditi ovako nešto:

ActiveDocument.Paragraphs(3).Words(2).Font.Color = wdColorRedSlično važi i za objekat Selection:

Selection.Font.Color = wdColorRed

Objekat Range

55

Page 56: VBA Programiranje

Objekat Range ("opseg") predstavlja povezani deo dokumenta, tj. obuhvata sve karaktere između dve zadate pozicije (početne i završne). Svaki strukturni deo dokumenta (karakter, reč, rečenica, pasus, sekcija, ceo dokument) ima svoj opseg karaktera i to je predstavljeno upravo objektom Range.

Ovaj objekat je jedan od najvašnijih u objektnom modelu Word-a jer se bilo kakva obrada nekog dela dokumenta (karaktera, reči, rečenice, pasusa, sekcije, celog dokumenta) svodi na na rad sa objektom Range. Kada je u pitanju rad sa celim dokumentom ili sa pasusom, klase Document i Paragraph imaju svojstvo Range:

ActiveDocument.Range.Bold = True; 'formatiramo opseg celog dokumenta: sve je boldActiveDocument.Paragraphs(1).Range.Italic = True; 'formatiramo opseg prvog pasusa u dokumentu: prvi pasus je sada italicAko želimo da obradimo karakter, reč ili rečenicu, koristimo činjenicu da su elementi kolekcija Characters, Words i Sentences upravo objekti klase Range.

ActiveDocument.Paragraphs(3).Words(2).Bold = True; '2. reč 3. pasusa u aktivnom dokumentu je boldActiveDocument.Sentences(1).Italic = True; '1. rečenica aktivnog dokumenta je sada italic(Dakle, ActiveDocument.Paragraphs(3).Words(2) je tipa Range, ActiveDocument.Sentences(1) je tipa Range itd.)

Formatiranje pomoću svojstva Range

Bold

Da bi se formatirao dokument ili pasus tako da tekst bude naglašen, dovoljna je sledeća naredba:

deoDokumenta.Range.Bold = Truegde je deoDokumenta ceo dokument ili pasus.Ako formatiramo karakter, reč ili rečenicu, koristimo činjenicu da su elementi kolekcija Characters, Words i Sentences upravo objekti klase Range. Npr, da bi se tako formatirala 2. reč 3. pasusa u aktivnom dokumentu, dovoljno je uraditi ovako nešto:

ActiveDocument.Paragraphs(3).Words(2).Bold = True

Italic

Da bi se formatirao dokument ili pasus tako da bude u kurzivu, dovoljna je sledeća naredba:

deoDokumenta.Range.Italic = Truegde je deoDokumenta ceo dokument ili pasus.Ako formatiramo karakter, reč ili rečenicu, koristimo činjenicu da su elementi kolekcija Characters, Words i Sentences upravo objekti klase Range. Npr, da bi se tako formatirala 2. karakter 3. pasusa u aktivnom dokumentu, dovoljno je uraditi ovako nešto:

ActiveDocument.Paragraphs(3).Characters(2).Italic = True

Underline Da bi se formatirao dokument ili pasus tako da postane podvučen, dovoljna je sledeća naredba:

deoDokumenta.Range.Underline = tipPodvlačenjagde je deoDokumenta ceo dokument ili pasus, a tipPodvlačenja je neka od WdUnderline konstanti. Neke WdUnderline konstante su:

wdUnderlineNone (nema podvlačenja) wdUnderlineSingle (podvlačenje jednom linijom)

56

Page 57: VBA Programiranje

wdUnderlineDouble (podvlačenje dvostrukom linijom)

wdUnderlineDotted (podvlačenje tačkastom linijom)

wdUnderlineDash (podvlačenje isprekidanim crticama)

wdUnderlineDotDash (podvlačenje naizmeničnim tačkama i isprekidanim crticama)

Ako formatiramo karakter, reč ili rečenicu, koristimo činjenicu da su elementi kolekcija Characters, Words i Sentences upravo objekti klase Range. Npr, da bi se tako jednom linijom podvukla 2. reč 3. pasusa u aktivnom dokumentu, dovoljno je uraditi ovako nešto: ActiveDocument.Paragraphs(3).Words(2).Underline = wdUnderlineSingle

Velika i mala slova (konverzije)

Case Vrednost ovog svojstva je neka od wdCharacterCase konstanti i odnosi se na mala i velika slova u odgovarajućem delu dokumenta. Neke wdCharacterCase konstante su:

wdLowerCase (sva su slova mala) wdUpperCase (sva su slova velika)

wdToggleCase (zameni mala velikim i velika malim: Pera => pERA)

wdTitleWord (prvo slovo reči je veliko)

wdTitleSentence (prvo slovo rečenice je veliko)

Npr. ako je potrebno da 3. reč u 2. rečenici dokumenta ima veliko početno slovo, to postižemo komandom: ActiveDocument.Sentences(2).Words(3).Case = wdTitleWordOve konstante nije potrebno učiti napamet, jer onog trenutka kada se otkuca znak =, Visual Basic Editor nudi listu vrednosti iz kojih se lako bira ona prava (zahvaljujući sugestivnom imenu)

57

Page 58: VBA Programiranje

Promena fonta (boja, veličina)

Za detalje videti Objekat Font

Name Size

Color

Manje strukturne jedinice

Text Tekst zadatog opsega

Characters Kolekcija objekata tipa Range od kojih svakih predstavlja jedan karakter iz zadatog opsega.

Words Kolekcija objekata tipa Range od kojih svakih predstavlja jednu reč iz zadatog opsega.

Sentences Kolekcija objekata tipa Range od kojih svakih predstavlja jednu rečenicu iz zadatog opsega.

Paragraphs Kolekcija objekata tipa Paragraph od kojih svakih predstavlja jedan pasus iz zadatog opsega.

Objekat Selection

Prilikom rada sa Word dokumentom, deo dokumenta se može obeležiti (markirati, izabrati, eng. select). Unos teksta sa tastature zamenjuje markirani tekst (eng. selection). Ukoliko nijedan deo teksta nije obeležen, tekst se unosi na trenutnoj poziciji kursora.

Objekat Selection ima različito značenje upravo u zavisnosti od toga koja je od navedenih mogućnosti u pitanju: ako nijedan deo dokumenta nije obeležen, Selection predstavlja poziciju kursora u dokumentu na kojoj će biti umetnut tekst sa tastature; ako je neki deo dokumenta obeležen, Selection tada predstavlja taj deo dokumenta (eng. current selection). S obzirom da u jednom prozoru u svakom trenutku postoji samo jedan deo dokumenta koji je obeležen, to je i objekat Selection jedinstven za

58

Page 59: VBA Programiranje

svaki pojedinačni otvoreni dokument. Pritom, u svakom trenutku je aktivan samo jedan objekat Selection u programu Word jer je u svakom trenutku aktivan samo jedan prozor.

Promena fonta (boja, veličina)

Za detalje videti Objekat Font

Name Size

Color

Svojstva

Text Tekst obeleženog dela dokumenta

Characters Kolekcija objekata tipa Range od kojih svakih predstavlja jedan karakter.

Words Kolekcija objekata tipa Range od kojih svakih predstavlja jednu reč.

Sentences Kolekcija objekata tipa Range od kojih svakih predstavlja jednu rečenicu.

Paragraphs Kolekcija objekata tipa Paragraph od kojih svakih predstavlja jedan pasus.

Metodi

Extend

Prvi poziv ovog metoda uključuje režim EXTend. Ako je taj režim već uključen, naknadni pozivi metoda Extend obeležavaju različite delove dokumenta (reč, rečenicu, pasus, sekciju, ceo dokument) tako što svaki sledeći poziv proširuje selekciju:

Jedan poziv: uključuje režim EXTend; Dva poziva: obeležava rečenicu u kojoj se nalazi kursor;

Tri poziva: obeležava pasus u kom se nalazi kursor;

Četiri poziva: obeležava sekciju (odeljak) u kojoj se nalazi kursor;

Pet poziva: obeležava ceo dokument.

EscapeKey Služi za izlazak iz režima EXTend.

Collapse

Ako je deo dokumenta bio obeležen, pozivanjem ovog metoda se to poništava. Kursor se pomera na početak ili kraj prethodno obeleženog teksta u zavisnosti od vrednosti argumenta Direction (wdCollapseEnd ili wdCollapseStart; podrazumevana je vrednost wdCollapseStart, tj. pomeranje kursora na početak prethodno obeleženog teksta).

Cut premešta obeleženi deo dokumenta u Clipboard, tj. briše ga iz dokumenta

59

Page 60: VBA Programiranje

Copy kopira obeleženi deo dokumenta u Clipboard.

Paste zamenjuje obeleženi deo dokumenta sadržajem Clipboard-a.

MoveDownUkoliko nijedan deo teksta nije obeležen, ovim metodom se pomera kursor nadole za vrednost argumenta Unit (wdLine ili wdParagraph, podrazumevano je pomeranje za jednu liniju). Vrednost argumenta Count određuje za koliko jedinica se vrši pomeranje.

MoveLeftUkoliko nijedan deo teksta nije obeležen, ovim metodom se pomera kursor ulevo za vrednost argumenta Unit (wdCharacter, wdWord ili wdSentence, podrazumevano je pomeranje za jedan karakter). Vrednost argumenta Count određuje za koliko jedinica se vrši pomeranje.

MoveRightUkoliko nijedan deo teksta nije obeležen, ovim metodom se pomera kursor udesno za vrednost argumenta Unit (wdCharacter, wdWord ili wdSentence, podrazumevano je pomeranje za jedan karakter). Vrednost argumenta Count određuje za koliko jedinica se vrši pomeranje.

MoveUpUkoliko nijedan deo teksta nije obeležen, ovim metodom se pomera kursor nagore za vrednost argumenta Unit (wdLine ili wdParagraph, podrazumevano je pomeranje za jednu liniju). Vrednost argumenta Count određuje za koliko jedinica se vrši pomeranje.

Objekat Paragraph

Ovaj objekat predstavlja jedan pasus u dokumentu. Detaljnija dokumentacija Paragraph (MSDN)

Svojstva

Range

Opseg pasusa. Preko ovog svojstva može se pristupiti pojedinačnim karakterima, rečima i rečenicama pasusa. Npr:

ActiveDocument.Paragraphs(2).Range.Characters(5) je 5. karakter 2. pasusa aktivnog dokumenta.

ActiveDocument.Paragraphs(3).Range.Words(4) je 4. reč 3. pasusa aktivnog dokumenta.

ActiveDocument.Paragraphs(1).Range.Characters(3) je 3. rečenica 1. pasusa aktivnog dokumenta.

Alignment Poravnanje pasusa. Vrednost je neka od konstanti wdAlignParagraph(Left|Center|Right|

60

Page 61: VBA Programiranje

Justify|...)

DropCap

Isticanje prvog slova u pasusu. Primer:

With ActiveDocument.Paragraphs(1) .DropCap.Enable .DropCap.LinesToDrop = 2 'broj linija koje prvo slovo zauzima .DropCap.Position = wdDropNormal 'pozicija prvog slova u odnosu na pasus End With

FirstLineIndent

Vrednost u pt za koju je pasus uvučen udesno (pozitivna vrednost u pt) ili ulevo (negativna vrednost u pt). Ako programer želi da izrazi vrednost uvlake u centimetrima, mora da koristi funkciju CentimetersToPoints koja pretvara vrednost iz cm u pt.Prvi primer uvlači prvu liniju drugog pasusa u aktivnom dokumentu za 1.27cm.

ActiveDocument.Paragraphs(2).FirstLineIndent = CentimetersToPoints(1.27)Drugi primer kreira viseću uvlaku (hanging indent) u prvoj liniji drugog pasusa aktivnog dokumenta (tj. prva linija pasusa je pomerena ulevo za 0.5cm).

ActiveDocument.Paragraphs(2).FirstLineIndent = CentimetersToPoints(-0.5)

LeftIndent

Leva margina pasusa (izražena u pt). Ako programer želi da izrazi vrednost margine u centimetrima, mora da koristi funkciju CentimetersToPoints koja pretvara vrednost iz cm u pt. Primer:

ActiveDocument.Paragraphs(2).LeftIndent = CentimetersToPoints(3)

RightIndent

Desna margina pasusa (izražena u pt). Ako programer želi da izrazi vrednost margine u centimetrima, mora da koristi funkciju CentimetersToPoints koja pretvara vrednost iz cm u pt. Primer:

ActiveDocument.Paragraphs(2).RightIndent = CentimetersToPoints(3)

SpaceAfter Razmak izmedju tekućeg i narednog pasusa (izražen u pt). Primer:

61

Page 62: VBA Programiranje

ActiveDocument.Paragraphs(2).SpaceAfter = 6Ako programer želi da izrazi vrednost razmaka u centimetrima, mora da koristi funkciju CentimetersToPoints koja pretvara vrednost iz cm u pt.

SpaceBefore

Razmak izmedju tekućeg i prethodnog pasusa (izražen u pt). Primer:

ActiveDocument.Paragraphs(2).SpaceBefore = 6Ako programer želi da izrazi vrednost razmaka u centimetrima, mora da koristi funkciju CentimetersToPoints koja pretvara vrednost iz cm u pt.

Metodi

Indent Uvlačenje pasusa za 1 nivo. Primer:

ActiveDocument.Paragraphs(2).Indent

Outdent Poništenje uvlačenja pasusa za 1 nivo (suprotno od Indent). Primer:

ActiveDocument.Paragraphs(2).Outdent

62