You are on page 1of 14

Visual Basic for Applications za kemi

care
Franka Miriam Bruckler
1

Uvod

VBA (Visual Basic for Applications) spada u tzv. kompajlirane (prevodene)


programske jezike: napisani kod se prvo prevodi u izvrsni oblik te se program
izvodi pokretanjem izvrsnog programa. VBA se razvio iz starog programskog
jezika Basic. VBA nije isto sto i Visual Basic (VB): VB je pogodniji za
programere, a VBA za korisnike. VBA je najzgodniji za kreiranje tzv. macroa za Excel. Mnoge funkcije tu su pred-programirane. Programiranje Excela
pomocu VBA naravno je puno lakse ako dobro znate koristiti Excel.
Glavna literatura bit ce nam web-stranice http://www.excel-vba.com/excelvba-contents.htm i http://www.vbtutor.net/vbtutor.html te knjiga Excel 2007
VBA Programming for Dummies.
Radi lakseg sporazumijevanja, prvo cemo uvesti terminologiju.
Excel Macros (makro-naredbe) su nizovi instrukcija koje sam izvodi

Excel. Ono sto cemo mi programirati su VBA procedure: nizovi instrukcija


za koje zelimo da ih nase racunalo izvede. To su u biti programi. Ono sto
sami napisemo zove se programski kod; on se pise u VBE. Jedna ili vise
procedura grupiraju se u modul.
Unutar programskog koda koristimo pet tipova komponenti: objekte, svojstva, metode, funkcije i naredbe (statements).
Svi Excel projekti sastoje se od objekata. To je sama Excel aplikacija
(Application), svaki Workbook, svaki Worksheet, rasponi (Ranges), grafikoni
(Charts) idr. Objekti su organizirani hijerarhijski. Osnovni objekt je Application. Njegovi podobjekti su npr. Workbook, CommandBar, . . . Workbook
za podobjekte ima npr. Worksheet, Chart, . . . Worksheet za podobjekte ima
recimo Range, Name, . . . Oni su organizirani u kolekcije. Tako recimo kolekcija Worksheets sadrzi sve worksheets u nekom workbook.

Zelimo
li pristupiti nekom objektu i raditi s njim, puno ime mu se sastoji
od niza imena objekata (kolekcija) koji se nalaze nad njim u toj strukturi (i
1

1 Uvod

njega samog) povezanih tockama. Tako recimo

Application.Workbooks("Book1.xls").Worksheets("Sheet1").Range("A2")

opisuje celiju A2 u Sheet1 u Book1.xls. Ipak, Application se podrazumijeva pa ga ne moramo pisati, a u pravilu ne treba pisati ni Workbooks (ako
ne pise, podrazumijeva se rad s aktivnim workbook). Ukoliko izostavimo i
Worksheet, radit ce se s aktivnim worksheet-om (oprez, mogucnost gresaka!).
Svaki objekt ima svoja svojstva ( kakav je objekt?) koja mozemo pode
siti putem VBA. Recimo, workheet moze biti vidljiv ili ne (Sheets(SuchandSuch).Visible
= True), font moze biti bold (Selection.Font.Bold = True), celija moze sadrzavati
vrijednost ili formulu (Activecell.Value = 10, Activecell.Formula = =A1+B2),
itd. Metode su akcije s objektima; npr. mozemo htjeti zatvoriti aktivni workbook ili kopirati sadrzaj celije (ActiveWorkbook.Close, ActiveCell.Copy). I
metode, kao i svojstva, variraju za razlicite objekte. Pod funkcijama misli se
na Excelove funkcije poput NOW(). Naredbe su vise-manje standardni tipovi
instrukcija: IF...THEN, DO...LOOP, FOR...NEXT, WITH...END WITH,
EXIT FOR, EXIT DO, EXIT SUB
Da bi se pokrenula i izvela procedura, mora se desiti dogadaj (Event),
recimo pritisak na gumb.
Workbook je Excel file (ime.xls). Objekt
ThisWorkbook
je workbook unutar kojeg pisemo proceduru. Ako napisemo
ThisWorkbook.Close
zatvorit cemo ga. Svaki Workbook sastoji se od najvise 256 worksheets,
svaki sa 65536 redova i 256 stupaca (Excel 2007 dozvoljava 1000000 redova
u worksheetu).
Npr.
Worksheets("printanje3").Range("a1:e13").PrintOut
ispisuje pravokutni dio celija od A1 do E13 iz worksheet-a printanje3.
Uz sve ovo postoje i UserForms i Controls. UserForms su posebne vrste
sheet-ova koje omogucuju korisniku da unese neke vrijednosti (parametre).

2 Osnove programiranja: procedura, varijabla, pridruzivanje

Controls su komandni gumbi, labele, checkbox-ovi isl. elementi koje mozemo


rasporediti na userforms ili worksheets.
Slijedi prvi primjer procedure (makroa) s imenom proTest.

Sub proTest ()
Range("A2").Value= 2
ThisWorkbook.Save
ThisWorkbook.Close
Application.Quit
End Sub

Kad se ova procedura pokrene, u celiju A2 stavlja se iznos 2, sprema se i


zatvara datoteka te izlazi iz aplikacije.
Pokrenite program Excel na svom racunalu. Editor (VBE) za pisanje
programa u Visual Basicu otvorit cete naredbom
Alt+F11
U osnovi, VBE se sastoji od tri podprozora: gore lijevo je Project Window,
veliki prozor desno je Code Window, a dolje lijevo je Properties Window.
Code Window se otvara klikom na desnu tipku misa na bilo koji element
Project Window-a (naredba Insert Module). Ako u Project Window odaberemo neki objekt, onda se u Properties Window vide njegova svojstva s
trenutno pridruzenim vrijednostima.

Osnove programiranja: procedura, varijabla,


pridru
zivanje

Svaka procedura pocinje sa

Sub ime()

(u zagradama se mogu prenijeti varijable iz jedne procedure u drugu) i


zavrsava s

2 Osnove programiranja: procedura, varijabla, pridruzivanje

EndSub

Taj kraj se automatski dodaje ako nakon prve linije nekoliko puta stisnemo Enter. Procedure izvodimo pritiskom na F5. Ukoliko zelimo da se u
nekom trenutku prekine izvodenje procedure, odgovarajuca naredba je

Exit Sub

Svaka naredba u VBA mora biti u jednom redu. Ako se desi da moramo
koristiti prijelom reda, onda se prije prijelaza u novi red treba staviti
_
(space i underscore).
VBA ne razlikuje velika i mala slova tj. ime i Ime su jednaka imena

varijabli.
Komentari zapocinju znakom i protezu se na ostatak reda u kojem je to
znak:
Ovo je komentar.
Jedini slucaj kad se apostrof ne interpretira kao pocetak komentara je
ako se nalazi izmedu dvostrukih navodnika.
Osim procedura tipa Sub, VBA poznaje i one tipa Function. One primaju
neke parametre i vracaju tocno jednu vrijednost (usporedite s matematickim
pojmom funkcije).

2.1

Tipovi podataka

U svim programskih jezicima razlikuju se tipovi podataka, dakle strukture


koje se sastoje od skupova i dozvoljenih operacija s njihovim elementima.
Razlikuju se prvenstveno po nacinu spremanja svojih elemenata u memoriju
racunala. Neki od vaznijih tipova su Integer (cijeli brojevi spremani u po
2 byte; raspon od -32768 do 32767), Long (cijeli brojevi spremani u po 4
byte; raspon od 2,147,483,648 do 2,147,483,647), Single (decimalni brojevi

2 Osnove programiranja: procedura, varijabla, pridruzivanje

spremani u po 4 byte; raspon -3.402823e38 do -1.401298e-45 i 1.401298e-45


do 3.402823e38), Double (decimalni brojevi spremani u po 4 byte; raspon
-1.79769313486232e308 do -4.94065645841247e-324 i 4.94065645841247e-324
do 1.79769313486232e308), String (nizovi znakova; 1 byte po znaku), Date
(datumi u po 8 byte; od 1/1/100 do 12/31/9999; moze se koristiti i za vrijeme), . . . Defaultni tip varijable (ako nije deklarirana) je Variant; VB ju
automatski prebacuje iz tipa u tip po potrebi (sto trosi dosta vremena i
memorije).

2.2

Varijable

Varijabla u programskom jeziku je oznaka kojom pristupamo do nekog mjesta


u memoriji (imenovana memorijska lokacija). Imena varijabli su nizovi od
najvise 255 znakova. Prvi znak mora biti slovo, ostali mogu biti slova, brojke i
neki specijalni znakovi (primjerice underscore). Ako se za ime varijable uzme
rezervirana rijec, VBA compiler javlja gresku.
Vrijednost se varijabli pridruzuje operatorom pridruzivanja (=):
x = 1
iznos = 0.075
je_li = False
ime = "FMB"
datum = #3/14/2008#
vrijeme = #12:00:00#

Zelimo
li se prisiliti na deklaraciju varijabli (sto je vrlo preporucljivo,
npr. jer onda VBE otkrije greske u pisanju), prije prve procedure u modulu
stavljamo
Option Explicit
Varijable se deklariraju ovako:
Dim <ime_varijable> (As <tip>)

2 Osnove programiranja: procedura, varijabla, pridruzivanje

Ukoliko se ne navede As tip podrazumijeva se As Variant. Moguce

je nabrajanje, ali za svaku varijablu treba navesti As tip, npr. u

Dim x, y As Integer
Dim a As String, b As Date
rezultat je da ce x biti tipa Variant. Deklaracije varijabli mogu biti na
nivou procedure (u pravilu na pocetku iste) - tada varijable zive samo za

vrijeme izvodenja iste; na nivou modula (deklaracija prije prve procedure) ili
pak dostupna svim procedurama u workbook-u (deklaracija s Public).
Poseban slucaj su Static-varijable. One su varijable na nivou procedure,
ali im se vrijednost ne resetira (memorija se ne oslobada) po zavrsetku iste.
Deklariraju se ovako:
Static <ime_varijable> (As <tip>)
Konstante su isto sto i varijable s fiksiranom vrijednosti. Deklariraju se
sa
Const <ime_konstante> (As <tip>) = <vrijednost>
Ukoliko cemo puno puta koristiti istu konstantu, primjerice 3.14159, isplati ju se deklarirati kao konstantu jer ce kod biti citljiviji, a i lakse joj je
promijeniti vrijednost.
Stringovi se stavljaju pod dvostruke navodnike. Ukoliko zelimo da neki
znak stringa bude dvostruki navodnik, stavlja se dvaput:
MsgBox "My name is "" Peter"""
ce ispisati My name is Peter .
Pri deklaraciji, mozemo im fiksirati maksimalnu duljinu (max):
Dim <ime> As String * <max>
Deklaracija unutar Sub odnosi se samo na samu proceduru, tj. tako
deklarirane varijable i konstante postoje samo dok se procedura izvodi. Ako
varijablu ili konstantu deklariramo prije naredbe Sub, biti ce dostupna svim
procedurama u modulu. Ako pak zelimo da varijabla/konstanta bude dostupna svim procedurama u svim modulima vaseg workbook-a, deklaraciju
treba zapoceti kljucnom rijeci Public (i staviti je ispred naredbe Sub).

3 Unos i ispis podataka

Unos i ispis podataka

Programi nemaju smisla bez komunikacije s korisnicima. Najjednostavniji


nacin postise se koristenjem funkcija MsgBox i InputBox. O njima ce vise
rijeci biti kasnije, a ovdje cemo ih koristiti samo u najjednostavnijoj varijanti.
MsgBox <nesto>
proizvodi prozorcic u kojem je ispisano to nesto (ako je to varijabla,

onda njena vrijednost) i gumb OK. Moguce je kombiniranje vise kompo


nenti, npr. ako je u varijabli xxx neki rezultat, mozemo pristojno ispisati

isti naredbom
MsgBox "Rezultat je " & xxx
x = InputBox("Poruka")
rezultira prozorcicem s poljem za unos, iznad kojeg je ispisana Poruka.

Rezultat unosa se sprema u varijablu x.

Operacije

Osnovne operacije koje mozemo raditi s varijablama numerickog tipa su +,


, , / i . S cjelobrojnim podacima mozemo provesti i cjelobrojno dijelenje (\)
i odredivanje ostatka pri dijeljenju (Mod). Stringove mozemo konkatenirati
(&).

Zadaci
1. Napravite proceduru u varijablu x (nekog numerickog tipa) stavlja neku
vrijednost i ispisuje ju.
2. koja ispisuje poruku (npr. Hello, Vase ime!). Vase ime treba biti
uneseno od strane korisnika.
3. Napisite proceduru koja zbraja (mnozi, oduzima, . . . ) dva broja koja
unese korisnik i ispisuje rezultat.
4. Napravite proceduru koja ucitava radijus kruga i ispisuje njegov opseg
ili povrsinu.

6 Funkcije Date, Now i Time

Funkcije Date, Now i Time

S Now(), Date() odnosno Time() dobivamo trenutni sistemski datum i/ili


vrijeme.
Sub ShowDate()
MsgBox Date
End Sub

Range objekt

Range objekt sastoji se od jedne ili vise celija u tablici. Celije


se specificiraju
slovom i brojem (stupac i redak). Tako recimo celiji B4 pristupamo kao
Range("B4")
Trebalo bi biti ocito sto znace iduci zapisi:
Range("A1:C5")
Range("3:3")
Range("D:D")
Range("A1:B8,D9:G16")
Kao i svi objekti, Range-ovi imaju svojstva. Najvaznije medu njima je
Value - vrijednost u celiji.
Range("A1:C5").Value = 5
x = Range("A9").Value

8 Zadaci

Svojstvo Value je defaultno. Pri naredbi x = Range(A9).Value pridruzuje

se vrijednost celije, neovisno o formatiranju (recimo, ako u celiji A9 imamo

1,50%, u x se sprema 1.5). Zelimo


li uzeti formatirani oblik (string!) koristimo svojstvo Text: y = Range(A9).Text spremilo bi 1,50% u y.

Broj celija u nekom Range dobije se svojstvom Count, broj prvog od


stupaca u Range s Column, a broj prvog od redaka s Row:

koliko = Range("A1:C5").Count
prvi_stupac = Range("A1:C5").Column
prvi_redak = Range("A1:C5").Row

Zadaci
1. Napravite proceduru koja ispisuje neku poruku (npr. Hello, world!) u
celiju C7.
2. Napisite proceduru koja zbraja brojeve u celijama A1, A2, A3 i rezultat
upisujeu B1.
3. Napravite proceduru koja ucitava radijus kruga iz celije A1 i ispisuje
njegov opseg u A2 i povrsinu u A3.

Naredba granjanja

Cesto
je izvodenje neke naredbe (ili vise njih) ovisno o zadovoljenosti nekog
uvjeta. Svi programski jezici zbog toga poznaju naredbu grananja if-then.
Sintaksa je kako slijedi:
If <uvjet> Then <naredba>
Primjerice
If x = 0 Then MsgBox "Nula je."
Zapravo imamo opcenitije strukture:

10 Cells property

10

If <uvjet> Then
<naredbe 1>
Else
<naredbe 2>
End If
i
If <uvjet 1> Then
<naredbe 1>
ElseIf <uvjet 2> Then
<naredbe 2>
ElseIf <uvjet 3> Then
<naredbe 3>
...
Else
<naredbe>
End If
Za postavljanje uvjeta dobro dodu logicki operatori: And, Or, XoR
(ili-ili), Eqv (logicka ekvivalencija), Imp (logicka implikacija) i Not. Za
usporedivanje vrijednosti koriste se =, , , , =, =.
Za slucaj da imamo odabir izmedu vise od dvije opcije u ovisnosti o istom
tipu uvjeta korisna je naredbe
Select Case <uvjet>
Case <slucaj1>: <naredba 1>
...
End Select

10

Cells property

Cells prima dva argumenta: red i stupac. Tako recimo


Cells(2,3)

11 Clear i ClearContents metode

11

referira na celiju C2 u aktivnom worksheet-u. Cells je osobito koristan u


kombinaciji s Range objektom:
Range(Cells(1,1),Cells(10,10)).Value=5
postavlja vrijednost 5 u sve celije od A1 do J10. To smo dodus mogli
napraviti i s
Range(A1:J10).Value=5
no prednost Cells je sto moze primati varijable kao argumente:
Range(Cells(i,j),Cells(i,j)).Value=5
postavlja vrijednost 5 u celiju u i-tom redu i j-tom stupcu, pri cemu su i
i j mogli biti primjerice uneseni od strane korisnika.

11

Clear i ClearContents metode

Zelimo
li iz modula pobrisati sadrzaj nekih celija, to mozemo postici pomocu
metoda Clear i Delete.
Range("A1:J10").Clear
brise i sadrzaj i formatiranje celija od A1 do J10,
Range("A1:J10").ClearContents
brise samo sadrzaj (a cuva formatiranje).

12

Logi
cki operatori

Not, And, Or, XoR, Eqv, Imp

13 Select-Case

13

12

Select-Case

Select Case <izraz>


Case <uvjet1>
<naredba1>
Case <uvjet2>
<naredba2>
...
Case Else
<naredba>
End Select
Primjerice,
Select Case x
Case 0 To 24
p = 0.1
Case 25 To 49
p = 0.15
Case 50 To 74
p = 0.2
Case Is >= 75
p = 0.25
Case Else
MsgBox "Greska: nema smisla da narucujete manje od 0 komada."
End Select

14

Polja

Dim <ime polja>(<m> to <n>) As <tip>


generira polje elemenata zadanog tipa ciji prvi clan ima indeks m, a zadnji
n.
Elementu polja pristupamo preko indeksa:
Dim polinom(0 to n) As Single
polinom(0)=2

15 For-petlja

13

Visedimenzionalna polja generiraju se analogno, primjerice


Dim A(1 to 10, 1 to 10) As Integer
A(1,1)=1
A(1,2)=0

15

For-petlja

Cesto
je potrebno odredene naredbe izvrsiti vise puta. Za to programski
jezici poznaju posebne naredbe - petlje.
Prva od petlji u VBA je For-Next petlja.
For <brojac>=<pocetna vrijednost> To <konacna vrijednost> _
(Step <korak>)
<naredbe>
Next <brojac>
Eventualni prijevremeni izlaz postize se s
Exit For
.
Kao prvi zadatak iz petlji, generirajte nulmatricu velicine zadane od
strane korisnika pocevsi od celije A1. Zatim jedinicnu matricu.

16

Do-While i Do-Until-petlja

Do While/Until <uvjet>
<naredbe>
(Exit Do)

17 Reakcije na dogadaje

14

<naredbe>
Loop

17

Reakcije na dogadaje

VBA programe moze se pokrenuti i automatski, kad god se desi odredeni


dogadaj (event), primjerice pri svakom otvaranju workbook-a. Popis osnovnih
dogadaja koji se odnose na workbook je: Open, BeforeClose, BeforePrint,
BeforeSave, NewSheet. Popis osnovnih dogadaja koji se odnose na worksheet
je: Activate, BeforeDoubleClick, BeforeRightClick, Change.
Pisemo li program koji se treba aktivirati vezano za odredeni dogadaj,
treba VBE otvoriti na nivou odgovarajuceg objekta i u gornjem lijevom dijelu
odabrati objekt (Workbook, Worksheet) na koji se odnosi. Gore desno tad
dobijete i padajuci izbornik s popisom svih dogadaja vezanih za taj objekt.
Odaberite prikladni i napisite program koji se treba izvesti kad se taj dogadaj
pokrene.

18

Jos nesto zgodno. . .

U worksheet mozemo unijeti i objekt, primjerice kvadratic s upisanim tekstom. Desnom tipkom misa i odabirom Assign Macro mozemo odabrati koji
ce se modul pokrenuti pritiskom na taj gumb. Ako znate da Rnd vraca

slucajan decimalni broj izmedu 0 i 1, napisite modul koji iz worksheet-a


Sheet1 u kojem u A-stupcu imamo neke unose u celijama, ali ciji broj nije
unaprijed odreden, nego ga korisnik unosi u celiju B1 u Sheet2 odabire tri
slucajne celije i ispisuje ih na istom papiru. Pritom se pritiskom na gumb kojeg kreirate u Sheet2 taj modul mora aktivirati odredeni broj puta, koliko
pise u celiji B2 u Sheet2.

You might also like