Excel VBA Manual

Embed Size (px)

Citation preview

S A D R A J:

1. 2.

UVOD ...................................................................................................................................... 1 MICROSOFT EXCEL ............................................................................................................. 4 2.1 Openito o Microsoft Excelu............................................................................................ 4 2.1.1 Upotreba ugraenih funkcija .................................................................................... 4 2.1.2 Izrada grafikona ........................................................................................................ 5 2.2 Visual Basic za aplikacije (VBA) u Excelu...................................................................... 6 2.2.1 Snimanje makroa ...................................................................................................... 6 2.2.2 Izvoenje makroa ..................................................................................................... 9 2.2.3 Pridruivanje makroa objektu button ..................................................................... 10 2.2.4. Organizacija Visual Basic modula ......................................................................... 10 2.2.5. Tipovi podataka u Visual Basicu ............................................................................ 11 2.2.6. Deklaracija varijabli i konstanti .............................................................................. 12 2.2.7 Visual Basic procedure ........................................................................................... 14 2.2.8. Objekti, svojstva i metode ...................................................................................... 15 2.2.9. Kontrola izvoenja programa ................................................................................. 16 2.3 Komunikacija Excela sa eksternim aplikacijama ........................................................... 19 2.3.1 OLE aplikacije ........................................................................................................ 19 2.3.2 Dinamika razmjena podataka (DDE) .................................................................... 22 2.3.3 Funkcije za rad sa datotekama i direktorijima ........................................................ 23 2.3.4 Biblioteke za dinamiko povezivanje (DLL) ......................................................... 24 2.3.4.1 Upotreba Declare naredbe .................................................................................. 24 2.3.4.2 Predaja argumenata po vrijednosti i po referenci ............................................... 25 2.3.4.3 Koritenje tipa Variant........................................................................................ 26 2.3.4.4 Koritenje tipa String .......................................................................................... 27 2.3.4.5 Koritenje korisniki definiranih struktura ......................................................... 28 2.3.4.6 Koritenje polja (array) ....................................................................................... 29 2.3.5 Poziv funkcije iz Excel radne biljenice................................................................. 30

3.

PROGRAMSKI JEZIK C / C++ ............................................................................................ 32 3.1 Openito o C/C++ .......................................................................................................... 32 3.1.1 main( ) ili WinMain( ) funkcija .............................................................................. 32 3.1.2 Maarska notacija ................................................................................................... 34 3.1.3 C++ klase i objektno orijentirano programiranje ................................................... 34 3.1.3.1 Konstruktor ......................................................................................................... 35

1

3.1.3.2 Destruktor ........................................................................................................... 36 3.1.3.3 Pokaziva "this" .................................................................................................. 37 3.1.4 Kompajler i linker................................................................................................... 37 3.2 Biblioteke za dinamiko povezivanje (DLL) ................................................................. 38 3.2.1 Naini uitavanja DLL u memoriju ........................................................................ 38 3.2.2 Kreiranje DLL-a ..................................................................................................... 39 3.2.3 Eksportiranje iz DLL-a koritenjem modulski definirane datoteke (.DEF) ........... 40 3.2.4 Eksportiranje funkcija iz DLL-a koritenjem kljune rijei __declspec(dllexport) 41 3.2.5 Eksportiranje iz DLL-a koritenjem AFX_EXT_CLASS ...................................... 42 3.2.6 Eksportiranje C++ funkcija za upotrebu u C izvrnim programima i obratno ....... 42 3.2.7 Inicijalizacija DLL-a............................................................................................... 43 4. PRIMJER POVEZIVANJA EXCELA SA PROGRAMSKIM JEZIKOM C++ .................... 45 4.1 4.2 4.3 5. Rjeavanje problema u programskom jeziku C++ ......................................................... 45 Povezivanje Excela sa C++ pomou datoteka ................................................................ 47 Povezivanje Excela sa C++ pomou DLL-a................................................................... 53

ZAKLJUAK......................................................................................................................... 58

LITERATURA

2

1. UVOD

Microsoft Excel je zasigurno jedan od najkompleksnijih programskih paketa, koji se nalazi u irokoj upotrebi meu korisnicima. Excel sadri vie od 300 standardno ukljuenih tablinih funkcija razliitih tipova (matematikih, financijskih, statistikih i dr.) Osim toga u njemu je integriran programski jezik Visual Basic za aplikacije (VBA) koji omoguava programiranje specijalnih funkcija, koje nisu standardno ukljuene u Excel. Pored toga Excel omoguava komunikaciju sa drugim aplikacijama povezivanje sa programima i razliitim datotekama koje sadre tekst, sliku, grafove, tablice, itd. Tako se postie integriranje vie programa i datoteka u jednu cjelinu formiranu oko Excela kao sredinje aplikacije za unos i prikaz razliitih tipova podataka. Takoer, sposobnost Excela za povezivanje s drugim aplikacijama omoguava iskoritavanje ve postojeih skupova podataka iz drugih datoteka, te ih nije potrebno ponovno pisati u Excelu. Posebno je znaajna sposobnost Excela za povezivanje s izvrnim datotekama izraenim u razliitim programskim jezicima, kao npr. C, C++, Pascal, Fortran, itd. Takva komunikacija potrebna je kada ve postoji samostalan funkcionalan program napisan u nekom od programskih jezika. Umjesto dugotrajnog zahtjevnog prevoenja programskog koda u Visual Basic, jednostavnije je povezivati Excel s gotovim programom. Takoer, mogunosti samog VBA su znatno manje od mogunosti profesionalnih programskih paketa, pa je izrada kompleksnih programa bra i jednostavnija, a ponekad i jedino mogua s takvim naprednijim programerskim alatima. Postoji vie naina povezivanja Excela s drugim programima i datotekama, a u ovom radu su podrobnije objanjena dva oblika komunikacije i to sa programima izraenim programskim jezikom Visual C++ koji se trenutno najee primjenjuje za izradu novih aplikacija. Prvi, najjednostavniji nain predstavlja povezivanje Excela sa izvrnom datotekom preko tekstualnih datoteka. To je indirektni nain povezivanja u kojemu C++ program ne pristupa izravno podacima napisanim u Excelu, ve te iste podatke ita/pie u/iz tekstualne datoteke. Drugi esto koriteni nain povezivanja Excela sa C++ je direktnim putem primjenom biblioteka za dinamiko povezivanje (DLL Dynamic Link Library), pri emu se umjesto C++ izvrne datoteke izrauje DLL napisan u Visual C++. Cilj ovog rada je prikaz mogunosti i osnovnih principa rada navedenih naina povezivanja Excel dokumenta sa drugim programima i utvrivanje sloenosti izrade, te brzine i stabilnosti rada pri njihovoj komunikaciji.

3

2. MICROSOFT EXCELMicrosoft Excel je najrairenija i najee upotrebljavana aplikacija za tabline proraune. Vrlo je jednostavan za upotrebu i omoguava koritenje kalkulatora s brojnim ugraenim funkcijama, formiranje (programiranje) novih funkcija koritenjem VBA (Visual Basic for Application) alata, a takoer omoguava komunikaciju sa raznim eksternim aplikacijama.

2.1 Openito o Microsoft ExceluExcel ima vrlo raznoliku primjenu, ali najvie se upotrebljava kao tablini kalkulator, te za grafike prikaze tablinih prorauna. Excel podrava razne tipove podataka koji se nalaze u tablici, tj. razlikuje brojeve, tekst, datum, vrijeme, valutu, postotke i razlomke. Na osnovu toga o kojem se tipu radi, Excel dozvoljava upotrebu odreenih raunskih operacija i primjenu funkcija koje prihvaaju te tipove podataka. Excel prua jo mnogo mogunosti kao to je izrada scenarija, sumarne tablice, statistike analize podataka, itd.

2.1.1 Upotreba ugraenih funkcijaU izborniku Insert nalazi se naredba Function koja ispisuje rezultat izabrane funkcije u selektiranu tablinu eliju. Nakon to je odabrana kategorija funkcije, npr. matematika funkcija, odabire se podfunkcija iz te kategorije. Na Sl. 2.1.1 prikazan je odabir matematike funkcije (Math & Trig) koja daje apsolutnu vrijednost zadanog broja (ABS).

Sl. 2.1.1 Okvir za dijalog Paste Function

4

U prozor, koji je otvoren nakon odabira funkcije, unosi se vrijednost parametara funkcije (u ovom sluaju broj kojem se trai apsolutnu vrijednost). Unos vrijednosti parametara funkcije moe se napraviti na dva naina: direktnim unosom broja ili odabirom elije u Excelu gdje se taj broj nalazi.

2.1.2 Izrada grafikonaGrafiki prikaz podataka iz Excel tablice omoguen je bez obzira da li su podaci samo uneseni u tablicu ili su izraunati preko raznih formula i funkcija. Grafikon moe biti prikazan na osnovu podataka smjetenih po stupcima (columns) ili po redovima (rows).

Sl. 2.1.2 Radna tablica

Nakon to su podaci uneseni u tablicu, crtanje grafa zapoinje odabirom naredbe Chart iz izbornika Insert ili odabirom ikone sa trake sa alatima kao na Sl. 2.1.3:

Sl. 2.1.3 Ikona Chart (graf) Mogu je prikaz razliitih vrsta grafova kao to su linijski, stupani, kruni, horizontalni, trodimenzionalni, itd. Grafiki se prikaz moe odnositi na cijelu tablicu ili samo na selektirane dijelove. Jedna od mogunosti prikaza tablice je graf na Sl. 2.1.4.

50 40 30 20 10 0 1 2 3 4 5 6

stupac1 stupac2 stupac3

Sl. 2.1.4 Grafikon na osnovu radne tablice 5

U svakom trenutku pristup bilo kojem dijelu grafa omoguen je pritiskom na desnu tipku mia, i na taj nain mogue je promijeniti izgled grafa, njegovih osi, legende i niza drugih parametara za oblikovanje grafova.

2.2 Visual Basic za aplikacije (VBA) u ExceluVisual Basic je programski jezik koji se temelji na najpopularnijem programskom jeziku BASICu, ali ga svojim poboljanim i proirenim mogunostima, te novom koncepcijom s grafikim sueljem daleko nadilazi. Excel sadri posebnu verziju Visual Basica koju je Microsoft nazvao Visual Basic for Applications VBA (Visual Basic za aplikacije). VBA kod se u Excelu nalazi unutar tzv. VBA makroa. Za izradu makro programa nije potrebno predznanje o programiranju te se oni vrlo jednostavno kreiraju snimanjem niza aktivnosti korisnika u samom Excelu, pri emu Excel automatski generira Visual Basic kod. Za preureivanje koda makro programa potrebno je aktivirati Visual Basic editor, te u njemu napraviti eljene izmjene programa.

2.2.1 Snimanje makroaSnimanje makroa je najlake objasniti pomou primjera. Formatiranje odreenog raspona elija zapoinje unosom podataka u radnu tablicu (Sl. 2.2.1):

Sl. 2.2.1 Podaci za snimanje makroa

Nakon selektiranja jedne od elija iz radne tablice, kreiranje makroa zapoinje snimanjem operacija koritenjem Tools Record Macro Record New Macro naredbe ili Record Macro alata iz Visual Basic retka s alatima (Sl. 2.2.2).

Sl. 2.2.2 Visual Basic redak sa alatima

6

Nakon pokretanja operacije snimanja makroa, otvara se okvir za dijalog u kojem se unosi ime i opis makroa, te Shortcut Key (Ctrl+slovo), tj. definira se kombinacija tipki koje se mogu upotrijebiti za brzo pokretanje makroa. Brojevi nisu dozvoljeni u kombinaciji.

Sl. 2.2.3 Okvir za dijalog Record Macro

U sljedeem koraku na zaslonu se prikazuje ikona Stop Macro alata, kojim se moe u svakom trenutku zaustaviti snimanje makroa. Prije zaustavljanja snimanja makroa, snimaju se operacije koje e taj makro obavljati. Da bi se pri svakom ponovnom koritenju makro odnosio uvijek na cijelu tablicu, bez obzira na veliinu, odabrana je opcija Current Region smjetena u izborniku EditGo To Special. Formatiranje elija radi se u Format Cells okviru za dijalog, a tipovi rubnih i unutranjih linija postavljaju se u Border pretincu (Sl. 2.2.4).

Sl. 2.2.4 Format Cells okvir za dijalog

Iskljuivanje opcije Gridlines u View pretincu iz izbornika ToolsOptions omoguava prikaz selektirane tablice na istom radnom listu. Nakon snimanja svih potrebnih operacija, snimanje makroa zaustavljeno je pomou Stop Macro alata ili odabirom Stop Recording naredbe iz ToolsRecord Macro podizbornika.

7

Sl. 2.2.5 Stop Macro alat

Rezultat izvravanja makroa je prikaz kao na Sl. 2.2.6:

Sl. 2.2.6 Izgled radne tablice nakon izvoenja makroa

Prilikom snimanja, makro inicijalno koristi apsolutne reference. Koritenje relativnih referenci omogueno je odabirom naredbe ToolsRecord MacroUse Relative Reference ili odabirom Relative Reference sa alata Stop Macro. Prednost koritenja relativnih referenci je mogunost izvoenja makroa na bilo kojem mjestu u radnoj tablici, dok sa druge strane, upotreba apsolutnih referenci omoguava izvoenje makroa na istim elijama bez obzira na trenutni poloaj u radnoj tablici. Nakon to je makro snimljen njegov Visual Basic kod moe se u svakom trenutku pogledati odabirom naredbe ToolsMacroVisual Basic Editor ili odabirom tipki CTRL + F11. U Visual Basic modulu Module1 nalazi se makro koji izgleda ovako:Sub Format1() ' Format1 Macro ' Keyboard Shortcut: Ctrl+f Selection.CurrentRegion.Select Selection.Borders(xlDiagonalDown).LineStyle = xlNone Selection.Borders(xlDiagonalUp).LineStyle = xlNone With Selection.Borders(xlEdgeLeft) .LineStyle = xlContinuous .Weight = xlThick .ColorIndex = xlAutomatic End With With Selection.Borders(xlEdgeTop) .LineStyle = xlContinuous .Weight = xlThick .ColorIndex = xlAutomatic End With With Selection.Borders(xlEdgeBottom) .LineStyle = xlContinuous .Weight = xlThick

8

.ColorIndex = xlAutomatic End With With Selection.Borders(xlEdgeRight) .LineStyle = xlContinuous .Weight = xlThick .ColorIndex = xlAutomatic End With With Selection.Borders(xlInsideVertical) .LineStyle = xlContinuous .Weight = xlThin .ColorIndex = xlAutomatic End With With Selection.Borders(xlInsideHorizontal) .LineStyle = xlContinuous .Weight = xlThin .ColorIndex = xlAutomatic End With ActiveWindow.DisplayGridlines = False End Sub

U ovom kodu napisani su svi gore navedeni postupci, tj. selektirano je cijelo podruje tablice (Selection.CurrentRegion.Select), te su naznaene vrste linija tablice i to svih vanjskih (xlEdgeLeft, xlEdgeTop, xlEdgeBottom, xlEdgeRight) pa onda i svih unutranjih (xlInsideVertical, xlInsideHorizontal). Opcija Gridlines iskljuena je tako to joj je postavljena vrijednost False (ActiveWindow.DisplayGridlines = False).

2.2.2 Izvoenje makroaNakon to je makro snimljen, moe se pokrenuti u bilo kojem trenutku na vie naina: pokretanjem ToolsMacro naredbe, otvara se Macro Name/Reference okvir u kojem se odabire ime makroa, a makro se pokree pomou naredbe Run, pritiskom na kombinaciju tipki za pokretanje makroa (u ovom sluaju Ctrl+f), pokretanjem Run Macro alata iz Visual Basic retka sa alatima, pokretanjem alata, objekta button ili nekog drugog grafikog objekta kojem je pridruen makro.

Bilo koja tablica sada se moe formatirati kao u prethodnom primjeru, jednostavnim pokretanjem ve snimljenog makroa na jedan od gore navedenih naina.

9

2.2.3 Pridruivanje makroa objektu buttonButton je grafiki objekt koji sadri tekst koji se moe ureivati i formirati kao i svaki drugi. Kreira se pomou Create Button alata koji se nalazi u ToolbarForms retku sa alatima. Makro se vrlo jednostavno pridruuje button objektu. Nakon to je iz Forms retka sa alatima pokrenut Button alat, te je pomou mia selektirano mjesto i veliina objekta, na zaslonu se automatski nakon otputanja tipke mia pojavljuje Assign Macro okvir za dijalog.

Sl. 2.2.7 Forms redak sa alatima

Sl. 2.2.8 Kreiranje objekta

U Macro Name/Reference okviru odabere se ime makroa koji se pridruuje ili se moe snimiti i novi makro odabirom funkcije Record. Naziv kreiranog objekta se mijenja pritiskom na sliku objekta sa desnom tipkom mia te odabirom Edit text naredbe.

2.2.4. Organizacija Visual Basic modulaVeina Visual Basic modula sastoji se od dva dijela: podruje deklaracija podruje procedura i funkcija.

Modul zapoinje deklaracijom niza varijabli i konstanti te se definiraju pojedine Visual Basic opcije. Deklaracije se mogu poredati u bilo kojem redoslijedu, ali preporuuje se pridravanje konvencije po kojoj se najprije navode opcije, zatim deklariraju varijable i na kraju konstante.

10

Option Explicit

Visual Basic opcije Deklaracija varijabli Deklaracija konstanti procedura

Podruje deklaracija

Dim x As Integer

Const Delta=10 Sub kreiraj() End Sub Function izraunaj(x) End Function

Visual procedure

Basic

funkcija

Sl. 2.2.9 Dijelovi Visual Basic modula

U bilo kojem dijelu koda smije se napisati komentar koji poveava razumljivost procedura, a posebno je bitan ako se procedura prilagoava nekim novim uvjetima. Komentar zapoinje s apostrofom ( ' ) i nastavlja se do kraja retka. Ako se kod nalazi iza apostrofa, on se smatra dijelom komentara i nee se izvoditi. Npr.:' Ovo je komentar

2.2.5. Tipovi podataka u Visual BasicuVisual Basic podrava nekoliko osnovnih tipova podataka. Boolean 2 bajta Integer 2 bajta Long 4 bajta Single 4 bajta Double 8 bajta Currency 8 bajta Date 8 bajta String 1bajt/znaku

Pored navedenih postoje i dva posebna tipa podataka: objektni tip Object koristi se za uvanje referenci objekata, a zauzima 4 bajta; varijantni tip Variant moe predstavljati razliite vrijednosti (do maksimalne vrijednosti kao za double tip, te datuma i vremena) ili tekst. Kod Variant tipa varijabli programer ne vodi rauna o tipu podataka koji sadri. Ipak, ako se izvode automatske operacije ili funkcije sa Variant podacima, onda oni moraju biti brojevi. Variant varijabla ne moe sadravati korisniki definirani tip. 11

Kombiniranjem osnovnih tipova definiraju se i dvije vrste sloenih tipova: korisniki definirani tipovi definiraju se pomou naredbe Type i polja Array

2.2.6. Deklaracija varijabli i konstantiNaredba za deklariranje varijabli ima sljedei oblik: Dim ime As tip Varijable u VBA nije potrebno eksplicitno deklarirati: automatski se podrazumijeva da se radi o varijabli Variant tipa. Ako je varijabla deklarirana, a nije naveden njen tip (npr. Dim x), takoer se podrazumijeva da je varijabla Variant tipa. Meutim, koritenje eksplicitne deklaracije omoguava otkrivanje pogreaka u vezi s imenima varijabli (npr. krivo utipkano ime). Eksplicitno deklariranje svake varijable obavezno je ako se na poetku VBA modula navede naredbaOption Eksplicit

ili ako je ukljuena opcija Require Variable Declaration u Module General pretincu Tools Options okvira za dijalog. Deklaracija korisniki definiranih tipova podataka vri se na vrhu VBA modula. Korisniki definirani tipovi podataka odgovaraju strukturama u programskom jeziku C. Radi se o tipu podataka ije varijable sadravaju nekoliko razliitih tipova podataka. Npr. deklaracijom:Type Student Ime As String Adresa As String Poloio As Currency Broj_prodanih As Integer End Type Dim St As Student

definira se tip Student, koji se sastoji od 4 osnovna tipa. Elementima varijable pristupa se pomou operatora toke, npr.St.Ime = ''Marin'' St.Poloio = 20

Polje (array) je skup koji slui za pohranjivanje niza istovrsnih podataka. Svako polje ima svoju gornju i donju granice, a veliina mu se moe mijenjati pomou ReDim naredbe. Primjer deklaracije polja:

12

Dim x(25) As Integer

Indeksi elemenata polja poinju od 0 (donja granica) i kreu se do N1 (gornja granica), tj. u ovom sluaju do 24. Meutim, donja i gornja granicu polja moe se i eksplicitno navesti, npr.Dim x(1 To 25) As Integer

U VBA dozvoljena je deklaracija polja do 60 dimenzija. Primjer deklaracije dvodimenzionalnog polja sa eksplicitno deklariranim granicama:Dim A (1 To 5, 2 To 10) As Double

Ako se tijekom izvoenja programa trebaju mijenjati dimenzije polja, tada se polje deklarira kao dinamiko polje:Dim Polje()

a alokacija memorijskog prostora za dinamiko polje, odnosno promjena dimenzije polja vri se ReDim naredbom unutar procedure:ReDim Polje (5,10)

Pri svakom izvoenju ReDim naredbe gube se vrijednosti spremljene u polju. Ako je potrebno pri promjeni dimenzije polja sauvati podatke, koristi se kljuna rije Preserve:ReDim Preserve Niz(Ubound(Niz)+10)

Kod viedimenzionalnih polja uz koritenje Preserve kljune rijei, smije se mijenjati samo veliina posljednje dimenzije i to njezina gornja granica. Vrijednost gornje granice daje funkcija Ubound.

Visual Basic za aplikacije sadri mnoge ugraene konstante. Npr. xlWorksheet je konstanta koja identificira radnu tablicu kao tip lista radne biljenice. Sve ugraene konstante koje se odnose na Excelove objekte poinju s xl, a sve ostale poinju sa vb. Definicija vlastitih konstanti omoguena je koritenjem naredbe Const sljedeeg oblika: Const IMEKONSTANTE= izraz Uobiajeno je da se imena konstanti piu velikim slovima, npr.:Const PI = 3.14159265 Const MAX_BROJ = 100

13

2.2.7 Visual Basic procedurePravila za imena procedura, varijabli, parametara i konstanti su: prvi znak mora biti slovo, VBA ne razlikuje velika i mala slova u imenima i ne smiju se koristiti kljune rijei i imena koja oznaavaju elijske reference kao imena funkcijskih procedura. Razlikuju se dva osnovna tipa procedure: Potprogrami ili obine procedure izvode operacije, ali ne vraaju vrijednosti. Poinju sa Sub i zavravaju s End Sub, npr.:Sub TablinaMrea (mrea) If mrea = True Then ActiveWindow.DisplayGridlines = True Else ActiveWindow.DisplayGridlines = False End If End Sub

Funkcije ili funkcijske procedure izvode operacije i vraaju vrijednost. Poinju sa Function, a zavravaju s End function, npr.:Function Faktorijel(n) If n = 0 Then Fakorijelt = 1 Else Faktorijel = n * Faktorijel(n-1) End If End Function

Osnovni dijelovi procedure su: kljune rijei (Sub End Sub ili Function End Function) koje oznaavaju poetak i zavretak procedure, ime (u primjerima TablinaMrea i Faktorijel) jednoznano identificira proceduru, argumenti (mrea i n) vrijednosti koje se prosljeuju proceduri, a predstavljaju poetnu toku za raunanje ili odreivanje operacija koje treba izvesti, tijelo procedure niz VBA naredbi, povratna vrijednost vrijednost koju vraa funkcijska procedura.

Procedure mogu meusobno pozivati jedne druge i to na nain da ako procedura ne prima argument navodi se samo ime procedure, a ako prima argument onda se poziva s imenom i s vrijednosti argumenta, npr.:

14

Sub Izvjetaj() Kreiraj Faktorijel (3) End Sub

Postoje dvije metode za prijenos podataka izmeu procedura po vrijednosti i po referenci. Inicijalno se u VBA koristi prijenos po referenci (prenosi se adresa varijable), dok se za prijenos po vrijednosti uz ime argumenta mora koristiti izraz ByVal, npr.:Function UitajStr (s As String, ByVal n As Integer) . End Function

Upotrebom izraza ByRef moe se naglasiti da se neka varijabla prenosi po referenci.

2.2.8. Objekti, svojstva i metodeObjekt je entitet kojim se moe upravljati iz Visual Basica. Svaki objekt ima karakteristike koje ga ine upotrebljivim svojstva (properties). Uz objekt se vezuje i pojam metode (method). Metode su akcije (operacije) koje objekti izvravaju. U Excelu, VBA razlikuje preko 100 razliitih objekata. Neki od najvanijih su: Application, Workbook, Worksheet, Module, Chart, Range, Window, Font, Style, Name, Toolbar, Menu... elija nije zaseban objekt u Visual Basicu, ve se za rad s njom koristi objekt raspona (Range) veliine jedne elije. Veliki dio VBA koda odnosi se na upravljanje objektima kojima se postavljaju ili oitavaju neka odreena svojstva. Naredba za postavljanje vrijednosti svojstva ima sljedeu sintaksu: objekt.svojstvo = izraz gdje je objekt referenca objekta, svojstvo ime svojstva objekta i izraz vrijednost koja se pridruuje svojstvu, npr.:Raspon1. ColumnWidth = 20

Stupcima u rasponu Raspon1 postavlja se irina od 20 znakova. Naredba za oitavanje vrijednosti svojstva: varijabla = objekt.svojstvo gdje je varijabla varijabla ili drugo svojstvo u koje se sprema oitana vrijednost svojstva, objekt referenca objekta i svojstvo ime svojstva, npr.x = Dohodak.Value

15

Razliiti tipovi objekta imaju razliita svojstva a najee se koriste: ActiveCell, ActiveSheet, ActiveWorkbook, Bold, Column, Row, Width, Value, Visible... Metode pripadaju objektima kao i svojstva, ali one predstavljaju operacije koje objekt izvrava. U VBA kodu mogua su dva oblika koritenja metoda, i to: Objekt.metoda u sluaju metode bez argumenata Objekt. metoda. argumenti u sluaju metode s argumentima.

Da bi se sauvala vrijednost koju vraa metoda, koristi se lista argumenata u zagradama, npr. za Cells metodu:Rn = Sheet1.Cells(1,1) ' varijabli Rn pridruuje se referenca elije A1

VBA razlikuje preko 100 razliitih metoda objekata, a najee se koriste: Activate, Add, Calculate, Cells, Clear, Close, Open, Range, Save, Undo, Run, Worksheets...

2.2.9. Kontrola izvoenja programaVisual Basic posjeduje skup naredbi kojima kontrolira odvijanje programa: naredbe za izvoenje skupa naredbi, grananje i realiziranje vieznanih odluka. If Then i If Then Else naredbe: If Then i If Then Else su naredbe za izvravanje odluka. Ovisno o ispunjenju ili neispunjenju uvjeta izvodi se odreeni skup naredbi. Sintaksa je sljedea:If izraz Then Blok naredbi End If

Ako je uvjet izraen izrazom ispunjen, izvodi se skup naredbi izmeu If i End If. Za definiranje bloka naredbi od kojih se uvijek jedan izvodi koristi se If Then Else naredba:If izraz1 Then Blok1 naredbi ElseIf izraz2 Then Blok2 naredbi ElseIf izraz3 Then Blok3 naredbi Else BlokN naredbi End If

16

Select Case naredba: Select Case je najpogodnija naredba za realiziranje vieznane odluke na temelju konstantnih vrijednosti. Sintaksa je:Select Case izraz Case vrijednost1 Blok1 Case vrijednost2 Blok2 Case Else BlokN End Select

U Select Case strukturi testira se samo jedan izraz. Ako vrijednost izraza odgovara jednoj od konstantnih vrijednosti, vri se grananje na pripadajui blok naredbi. Case Else je posljednji element naredbe i predstavlja sluaj koji se izvodi ako nijedan od prethodnih nije ispunjen. DoLoop petlja: U VBA moe se koristiti nekoliko tipova petlji za ponavljanje izvoenja skupa naredbi.Do While izraz Blok naredbi Loop

Skup naredbi se izvrava sve dok je izraz istinit. Ako je na samom poetku izraz u petlji neistinit, blok naredbi se uope nee izvriti. Drugi oblik Do Loop naredbe je takav da se uvjet testira na kraju petlje. Time se osigurava izvoenje petlje barem jedanput. Sintaksa je:Do Blok naredbi Loop While izraz

Osim ovih oblika koji izvode blok naredbi sve dok je izraz istinit, postoje i druga dva oblika koji izvode blok naredbi dok je izraz neistinit. Sintakse su sljedee.Do Until izraz Blok naredbi Loop Do blok naredbi Loop Until izraz

17

For petlja: Takoer omoguava ponavljanje dijelova programa, ali sada je tono odreeno koliko puta se petlja izvodi. For petlja se izvodi dok se ne dosegne konana ili granina vrijednost:For broja = poetni uvjet To zavrni uvjet [Step promjena] Blok naredbi Next [broja]

Dijelovi petlje u uglatoj zagradi nisu obavezni. Ako nije napisan koliki je korak promjena, VBA inicijalno uzima korak od 1 Primjer:Suma = 0 For i = 0 To 100 Step 5 Suma = Suma + i Next i

Postoji i petlja For Each Next koja je varijacija For petlje u kojoj se niz naredbi ponavlja za svaki element koji mora biti ili Variant ili Object tipa.For Each element In grupa Blok naredbi Next element

Izlaz iz kontrolnih struktura i procedura: Exit For i Exit Do: Ove naredbe osiguravaju prekid izvoenja i izlaz iz For, odnosno Do petlji. Primjer:For i = 0 to n If godina(i) = 1994 Then Izabrano = True Exit For End If Next i

GoTo naredba: Openito se izbjegava u programiranju, ali moe biti vrlo korisna.For i = 0 to m For j = 0 to n If A(i,j) = x GoTo Pronali Nextj Next i Pronali:

18

Izlaz iz procedure prije njenog regularnog kraja ostvaruje se s Exit Sub ili Exit Function.Sub Proc1() If Izlaz = True Then Exit Sub End If ... EndSub

2.3 Komunikacija Excela sa eksternim aplikacijamaPrimjenom Visual Basica za aplikacije mogue je automatizirati komunikaciju s drugim aplikacijama i ostvariti njihovo upravljanje iz Excela, te na taj nain kreirati korisnike aplikacije koje integriraju razliite programe i datoteke.

2.3.1 OLE aplikacijeOLE (Object Linking and Embendding) je tehnologija razvijena u Microsoftu, koja se sve vie prihvaa kao uobiajeni nain dijeljenja podataka razliitih aplikacija. Za pristup nekoj aplikaciji putem OLE-a, potrebno je da su zadovoljena dva uvjeta. Prvo, aplikacija mora biti napisana tako da zadovoljava OLE specifikaciju, i drugo, aplikacija mora biti instalirana i ispravno ubiljeena u OLE Registry na sustavu. OLE omoguava smjetanje ili ugradnju nekog objekta izraenog u jednoj aplikaciji u datoteku izraenu u drugoj aplikaciji. Npr. moe se ugraditi Word dokument u Excelovu radnu tablicu. Nakon to je postavljena toka umetanja u Excelu, odabere se naredba InsertObject, a zatim Create From File. Pojavljuje se okvir kao na Sl. 2.3.1 u kojem se pomou naredbe Browse odreuje pozicija dokumenta na disku.

Sl. 2.3.1 Object okvir za dijalog

19

Za povezivanje trenutno aktivnog Excel dokumenta s umetnutim Word dokumentom potrebno je ukljuiti opciju Link To File.

Sl. 2.3.2 Umetnuti Word dokument u Excelu

Najjednostavniji nain prijenosa manje koliine podataka ili grafike iz jedne aplikacije u drugu je koritenje Copy/Paste tehnike. U tom sluaju oba dokumenta moraju biti otvorena. Nakon selektiranja podruja sa miem u dokumentu iz kojeg se kopiraju podaci naredbom EditCopy (ili pomou tipaka CTRL+C). Podaci su sada kopirani na privremenu lokaciju (clipboard). Za kopiranje podataka u Excel definira se mjesto umetanja u tablici i pomou naredbe EditPaste podaci se upiu na izabrano mjesto (ili pomou tipaka CTRL+V). OLE automatizacija je jedno od najvanijih svojstava OLE-a. Ona omoguava pisanje makroa u jednoj aplikaciji za nadgledanje objekata u drugoj aplikaciji. Postoje dva razliita naina podrke za OLE automatizaciju: objektna ili kontrolna aplikacija. Objektna aplikacija izlae svoj model drugim aplikacijama i dozvoljava kontrolnim aplikacijama da je nadgledaju. U Microsoft Office paketu samo neke aplikacije mogu biti kontrolne. To su: Excel, Access, Project i Visual Basic. Za nadziranje OLE automatizacijskog objekta putem makroa, potrebno je: postaviti varijablu koja e predstavljati OLE objekt, koristiti tu varijablu za pristup objektnom modelu prilikom postavljanja ili dohvaanja svojstava objekta i pozivanja metoda, osloboditi OLE objekt kada vie nije potreban.

Primjer pristupanja Word objektu iz Excela: kreiran je makro koji otvara novu datoteku u Wordu, daje joj naslov Izvjetaj, a zatim formatira naslov masno otisnutim pismom, veliine 32 i centrira naslov vodoravno na stranici:Dim WordAplik As Object Sub Excelmakro( ) Set WordAplik = CreateObject(''Word.Basic'') With WordAplik If Ucase (Left(Application.OperatingSystem,3))< > ''MAC'' Then .AppRestore .AppMaximaze 1 Else AppActivate ''Microsoft Word'' End If .FileNewDefault .InsertPara

20

.Insert ''Izvjetaj'' .StartOfLine 1 .Bold .FontSize 32 .CenterPara End With End Sub

VBA podrava dinamiku razmjenu podataka izmeu dviju Windows aplikacija, koristei se OLE automatizacijom. Izmeu aplikacija kreiran je komunikacijski kanal preko kojeg se alju podaci nakon to je napravljena promjena u izvornoj aplikaciji. Podaci se alju automatski ili na zahtjev korisnika (manualno). Osnovne karakteristike ovakvog naina povezivanja su: mogue je uspostavljanje veze jednog izvornog dokumenta s vie razliitih prijemnih dokumenata, podaci se spremaju u dokumentu izvorne aplikacije, podaci i grafika nisu ukljueni u Excel dokument, ve se prikazuje samo njihov rezultat, pa su dokumenti manji od onih s ukljuenim objektima, mogue je koritenje samo dijela izvorne datoteke, auriranja su prilikom promjene izvornih podataka automatska ili na zahtjev korisnika.

Osim navedenih prednosti, moraju se uzeti u obzir i nedostaci: promjena imena ili premjetanje izvorne datoteke moe naruiti vezu, sve Windows aplikacije ne podravaju ovakav nain povezivanja podataka, automatsko auriranje usporava rad raunala.

Za kreiranje veze izvorni dokument treba biti snimljen i obje Windows aplikacije (npr. Word i Excel) moraju biti otvorene. U izvornom dokumentu se nakon selektiranja podataka koji se povezuju, naredbom EditCopy kopiraju podaci na privremenu lokaciju. Sada se u Excel dokumentu pokree EditPaste Special naredba koja otvara okvir za dijalog kao na Sl. 2.3.3:

Sl. 2.3.3 Paste Special okvir za dijalog

U okviru As odabran je tip podatka koji se dodaje u dokument i opcija Paste Link. Opcija Paste Link nije dostupna kada se u odlagalitu nalazi datoteka grafikog formata (slika). Za povezivanje 21

slike, upotrebljava se naredba Paste Picture Link iz izbornika Edit. Ova naredba zamjenjuje naredbu Paste Special kad se otvori izbornik Edit, a istovremeno je pritisnuta tipka SHIFT. Na ovaj nain se uspostavlja dinamika veza izmeu Word i Excel aplikacije. Ako se promijeni podatak u Wordu koji je dinamiki povezan sa Excelom, tada e se podaci aurirati automatski. Podaci se mogu mijenjati i manualno (na zahtjev korisnika) ako je u izbornik EditLinks odabrana opcija Manual.

2.3.2 Dinamika razmjena podataka (DDE)Neke aplikacije dostupne na tritu jo uvijek ne podravaju OLE komunikaciju. Za razmjenjivanje podataka sa tim aplikacijama ili za njihov nadzor, koristi se DDE (Dynamic Data Exchange) komunikacija. VBA u Excelu nudi sljedea svojstva i metode DDE komunikacije: DDEAppReturnCode: svojstvo objekta Application. Vraa DDE povratni kod koji se nalazio u zadnjoj DDE poruci potvrde koju je Excel primio, DDEExecute: metoda Application objekta. Pokree naredbu ili obavlja radnju u drugoj aplikaciji putem navedenog DDE kanala, DDEInitiate: metoda Application objekta. Otvara DDE kanal prema drugoj aplikaciji, DDEPoke: metoda Application objekta. alje podatke drugoj aplikaciji putem DDE kanala, DDERequest: metoda Application objekta. Trai informacije od aplikacije putem DDE kanala, DDETerminate: metoda Application objekta. Zatvara DDE kanal prema drugoj aplikaciji.

Ako se upotrebljava verzija Worda starija od Word 6.0, onda se mora koristiti DDE za nadzor Word datoteke. U novijim verzijama, bolje je koristiti OLE automatizaciju. Primjer DDE komunikacije koji radi potpuno isti postupak kao i primjer Excelmakro() napisan za OLE komunikaciju, tj. otvara novu datoteku u Wordu, daje joj naslov ''Izvjetaj'', a zatim formatira naslov masno otisnutim pismom, veliine 32 i centrira naslov vodoravno na stranici:Sub KomunikacijaDDE() Dim DDE1 As Integer With Application .ActivateMicrosoftApp xlMicrosoftWord DDE1 = .DDEInitiate(''WinWord'', ''Document1'') .DDEExecute DDE1, ''[AppMaximaze 1]'' .DDEExecute DDE1, ''[InsertPara]'' .DDEExecute DDE1, ''[InsertPara]'' .DDEExecute DDE1, ''[Insert '' '' Izvjetaj'' '']'' .DDEExecute DDE1, ''[StartOfLine]''

22

.DDEExecute DDE1, ''[EndOfLine 1]'' .DDEExecute DDE1, ''[CenterPara]'' .DDEExecute DDE1, ''[Bold]'' .DDEExecute DDE1, ''[FontSize 32]'' .DDEExecute DDE1, ''[EndOfLine]'' .DDEExecute DDE1, ''[InsertPara]'' .DDETerminate DDE1 End With End Sub

2.3.3 Funkcije za rad sa datotekama i direktorijimaVBA sadri nekoliko svojstava, metoda i funkcija koje se koriste za izradu i brisanje datoteka i direktorija, za izmjenu i odreivanje putanja te za upisivanje i itanje iz datoteka na tvrdom disku: AltStartupPath, ChDir, ChDrive, CurDir, DefaultFilePath, Dir, Kill, LibraryPath, MkDir, PathSeparator, RmDir, SetAttr, StartupPath Primjer zapisivanja podataka u tekstualnu datoteku pomou makro programa NapiiuDatoteku napisanog u VBA:Sub NapiiuDatoteku() Dim Broj As Integer Broj = FreeFile() Open ''C:\Test.txt'' For Output As #Broj Print # Broj, ''Ovo je primjer.'' &Chr(14) Write # Broj, 10*10 Close # Broj End Sub

Makro ProitajizDatoteke slui za uitavanje podataka iz tekstualne datoteke i njihov prikaz u okviru za dijalog:Sub ProitajizDatoteke() Dim x As String Dim St As String Dim Broj As Integer Broj = FreeFile() Open ''C:\Test.txt'' For Input Access Read As # Broj Do While Not EOF(Broj) Line Input # Broj, x St = St & x Loop Close # Broj MsgBox St EndSub

23

2.3.4 Biblioteke za dinamiko povezivanje (DLL)Biblioteke za dinamiko povezivanje (Dynamic Link Libraries DLL) su jedan od najvanijih strukturnih elemenata Windows operativnog sustava. DLL datoteke nisu izravno izvodive i ne primaju poruke. To su posebne datoteke s funkcijama koje se pozivaju iz programa ili drugih DLL-ova zbog obavljanja odreenog posla. Iako biblioteke za dinamiko povezivanje mogu imati bilo koji nastavak imena, kao to su .EXE ili .FON, njihov standardni nastavak je .DLL. Jedino se .DLL automatski ita od strane operativnog sustava. Ako datoteka ima drugaiji nastavak, uitavanje modula se mora eksplicitno navesti upotrebom funkcija LoadLibrary ili LoadLibraryEx. Biblioteke za dinamiko povezivanje se upotrebljavaju u toku izvoenja programa. Prilikom njihovog uitavanja, DLL se mora nalaziti u jednom od direktorija: direktoriju s .EXE programom, trenutno aktivnom direktoriju, sistemskom direktoriju Windowsa, Windows direktoriju, direktoriju koji se nalazi na navedenoj putanji.

2.3.4.1 Upotreba Declare naredbePrije pozivanja funkcija iz DLL-a u VBA, upotrebljava se naredba Declare koja identificira funkciju koja se koristiti, ime DLL-a u kojem se funkcija nalazi, i njene tipove argumenata. Nakon to se funkcija deklarira u VBA modulu, poziva se kao da je dio koda. Funkcija se deklarira na sljedei nain: [Public | Private] Declare Sub ime Lib "imebiblioteke" [Alias "drugoime"] ([lista_argumenata])] ili [Public | Private] Declare Function ime Lib "imebiblioteke" [Alias "drugoime"] ([lista_argumenata])] [As tip] Dijelovi koji su navedeni u uglatim zagradama smiju se izostaviti. Funkcija ili procedura moe biti Public (moe se pozvati iz bilo kojeg VBA modula) ili Private (moe se pozvati samo iz VBA modula gdje je deklarirana). 'ime' je ime procedure ili funkcije iz DLL-a. Mada VBA ne radi razliku izmeu velikih i malih slova, kod deklariranja DLL-a ih razlikuje, jer poziva DLL napisan u programskom jeziku (C++) koji razlikuje velika i mala slova. 'imebiblioteke'' je ime DLL-a u kojem se nalazi procedura ili funkcija. Alias 'drugoime' upotrebljava se ako se ime procedure ili funkcije poklapa sa imenom neke varijable, konstante ili neke druge procedure u istom VBA modulu. Upotrebljava se takoer i ako ime procedure sadri neki znak koji ne zadovoljava DLL konvenciju pisanja imena.

24

'lista_argumenata' je lista argumenata koja se predaje proceduri ili funkciji i mora se navesti toan tip varijable koja se predaje. Ako se poziva funkcija, poeljno je navesti i tip koji funkcija vraa - As tip kako bi se vidjelo je li ispravno pridruena varijabli. VBA uitava DLL pri prvom pozivu funkcije iz DLL-a i on ostaje u memoriji dok se ne zatvori radna biljenica u kojoj se nalazi taj VBA modul.

2.3.4.2 Predaja argumenata po vrijednosti i po referenciVBA kod inicijalno predaje argumente preko referenci, a ne preko njihovih vrijednosti. Ako funkcija oekuje pokaziva tada se argument predaje po referenci (ByRef), inae se predaje po vrijednosti (ByVal). a) Primjer predaje argumenta ByVal sljedea funkcija je samo dio DLL-a i napisana je u programskom jeziku C++, a rauna opseg kruga za zadani radijus:double WINAPI opseg(double dRadius) { return dRadius * 2 * 3.14159; }

U Windowsima, DLL funkcije koriste __stdcall konvenciju pozivanja funkcije. U ovom primjeru je upotrijebljena konstanta WINAPI koja u sebi ve sadri konvenciju __stdcall. Visual Basic kod koji koristi funkciju opseg za ispis u Excel tablici vrijednosti radijusa i njegovog odgovarajueg opsega:Declare Function opseg Lib "primjer" _ (ByVal radius As Double) As Double Sub TablicaOpsega( ) Dim x As Double Worksheets(1).Activate Range("a1:c11").Clear Cells(1, 1).Value = "Radius" Cells(1, 2).Value = "Opseg Kruga" For i = 1 To 10 Cells(i + 1, 1).Value = i Cells(i + 1, 2).Value = opseg(i) Next Columns("a:b").AutoFit End Sub

Declare naredba koristi ByVal kljunu rije, jer se argument prenosi po vrijednosti.

25

b) Primjer prenoenja argumenata po referenci: Funkcija Pomnoi je dio DLL-a i mijenja argument koji primi tako da ga pomnoi s brojem 2 ako je argument>0. Funkcija vraa vrijednost False ako je argument manji od nule, inae vraa vrijednost True:bool WINAPI Pomnoi(short *pn) { if (*pn < 0) return 0; // FALSE u Visual Basic *pn *= 2; return -1; }

// TRUE u Visual Basic

VBA deklaracija funkcije sada vie ne ukljuuje ByVal kljunu rije nego ByRef. VBA inicijalno predaje argumente po referenci, pa kljunu rije ByRef nije ni potrebno navesti.Declare Function Pomnoi Lib "primjer" _ (d As Integer) As Boolean Sub PomnoiBroj() Dim n As Integer n = CInt(InputBox("Unesite broj?")) r = Pomnoi(n) MsgBox n & ":" & r End Sub

2.3.4.3 Koritenje tipa VariantPrilikom predaje Variant tipa argumenta postupak je vrlo slian predaji argumenta bilo kojeg drugog tipa. Ipak ovaj postupak naglaen je prije svega zbog specifinog koritenja Variant tipa u DLL-u (programski jezik C++). U DLL-u se koristi struktura podataka VARIANT pomou koje je omoguen pristup podacima koji su sadrani u argumentu. Npr., sljedea funkcija odreuje o kojem se tipu argumenta radi (sadranom u Variant strukturi):short WINAPI VariantPrimjer(VARIANT vt) { if (vt.vt == VT_DISPATCH) return -1; else if (vt.vt == VT_BSTR) return _wtoi(vt.bstrVal); else if (vt.vt == VT_I2) return vt.iVal; else

// variant je objekt // variant je string // variant je integer

26

// variant je neto drugo return -3; }

U VBA kodu deklarirana je i kasnije pozvana VariantPrimjer funkcija:Declare Function VariantPrimjer Lib "primjer" _ (ByVal v As Variant) As Integer Sub VariantTest() MsgBox VariantPrimjer (Worksheets(1)) MsgBox VariantPrimjer ("25") MsgBox VariantPrimjer (5) MsgBox VariantPrimjer (3.2) End Sub

'-1 (objekt) '25 (vrijednost) '5 (vrijednost) '-3 (neto drugo)

Oznake variant konstanti za odreeni Variant tip argumenta koje podrava VBA kod. Boolean VT_BOOL Currency(scaled integer) VT_CY Date VT_DATE Double(double floating-point) VT_R8 Integer VT_I2 Long Integer VT_I4 Object VT_DISPATCH Single(floating-point) VT_R4 String VT_BSTR

2.3.4.4 Koritenje tipa StringKada VBA predaje string po referenci u DLL, tada upotrebljava poseban OLE tip podataka nazvan BSTR. U veini sluajeva BSTR se moe tretirati kao pokaziva na string koji zavrava s nul - bajtom (\0). Funkcija u C-u treba deklarirati argument kao pokaziva na BSTR. Pokaziva nee nikada biti NULL. Ako VBA stringu nije nita pridrueno, BSTR na koji pokazuje pokaziva e biti nula. Ako je pridruen prazan string, prvi karakter e biti 0 i duina stringa e biti 0.short WINAPI STip(BSTR *pbstr) { if (pbstr == NULL) // pokaziva je nula, nee se dogoditi return 1; if (*pbstr == NULL) // string je alociran u VB sa Dim naredbom,ali mu return 2; //jo nije pridruena vrijednost if (*pbstr[0] == 0) // string je alociran i pridruen mu je prazan string (" ") return 3; return 4; // string ima vrijednost }

27

Primjer VBA koda koji deklarira i poziva STip funkciju:Declare Function STip Lib "primjer" _ (s As String) As Integer Sub STipTest() Dim s As String MsgBox STip(s) s = "" MsgBox STip(s) s = "primjer" MsgBox STip(s) End Sub

'ispisuje 2 ' ispisuje 3 ' ispisuje 4

2.3.4.5 Koritenje korisniki definiranih strukturaNaredba Type koristi se u VBA kodu za kreiranje korisniki definiranih struktura. Na primjer, sljedei VBA tip podatka i struktura u C-u su identini. U VBA:Type ARG i As Integer str As String End Type

U C-u:typedef struct { short i; BSTR bstr; } ARG;

Korisniki tipovi podataka na smiju biti predani po vrijednosti, nego po referenci. Primjer funkcije u C-u koja deklarira argument kao pokaziva na strukturu:short WINAPI ArgStruktura(ARG *parg, char *szArg) { BSTR bstr; if (parg == NULL) return -1; if ((bstr = SysAllocString((BSTR)szArg)) == NULL) return -1; // alocira lokalni string if (parg->bstr != NULL) // stringu je ve pridruena vrijednost SysFreeString(parg->bstr); parg->i = SysStringByteLen(bstr); //duina stringa parg->bstr = bstr; return parg->i; }

28

Deklaracija i poziv iz VBA:Declare Function ArgStruktura Lib "primjer" _ (a As ARG, ByVal s As String) As Integer Sub ArgStrukturaTest( ) Dim x As ARG MsgBox ArgStruktura (x, "abracadabra") MsgBox x.str & ":" &str&( x.i) End Sub

'ispisuje string i duinu

2.3.4.6 Koritenje polja (array)OLE automatizacija osigurava poseban tip podataka polja koji se prenosi iz VBA u DLL. Ovaj tip podataka naziva se SAFEARRAY. Kada OLE automatizacija predaje SAFEARRAY u DLL, tada DLL prima pokaziva na pokaziva polja. Kao i BSTR pokazivai, i SAFEARRAY pokazivai mogu pokazivati na nulto polje, ako je polje alocirano, ali jo nije dimenzionirano. Pomou SAFEARRAY tipa podataka predaje se polje DLL-u, koji onda koristei OLE funkcije za rad sa SAFEARRAYom oita dimenziju polja, njegovu gornju i donju granicu, te elemente tog polja. Primjer funkcije SumaPolja koja je dio DLL-a i prima dva parametra. Prvi parametar je pokaziva na SAFEARRAY, a drugi parametar je pokaziva na long. Funkcija provjerava broj dimenzija polja, oitava gornju i donju granicu polja, te zbraja elemente polja:typedef SAFEARRAY * FPSAFEARRAY; short WINAPI SumaPolja(FPSAFEARRAY *ppsa, long *plResult) { short Elem; long donjagr, gornjagr, l, rezultat; if (*ppsa == NULL) // polje jo nije inicijalizirano return -4; if ((*ppsa)->cDims != 1) // provjeri broj dimenzija return -5; // oitavanje gornje i donje granice polja if (FAILED(SafeArrayGetLBound(*ppsa, 1, &donjagr)) || FAILED(SafeArrayGetUBound(*ppsa, 1, &gornjagr))) return -1; //zbrajanje elemenata for (l =donjagr, rezultat = 0; l mjesec = mj; (*this).mjesec = mj; }

Ova tri izraza su ekvivalentna. Zabranjeno je mijenjati vrijednost pokazivaa this, on uvijek treba pokazivati na instancu klase, tj. na objekt.

3.1.4 Kompajler i linkerNakon to je napisan izvorni (source) kod i zaglavlje (header file), taj kod se treba prevesti, povezati i izvriti. Naredba Compile pokree preprocesor koji kreira ulazne podatke za kompajler, koji prevodi izvorni kod u objektni oblik i dodjeljuje mu ekstenziju .OBJ. Taj oblik sadri mainski kod, upute za linker, te imena funkcija i varijabli kreiranih iz izvornog koda. U sljedeem koraku linker povezuje .OBJ file sa statikim bibliotekama (ukljuene u kod pomou #include) i drugim objektnim modulima, i kreira izvrnu verziju programa (.EXE). Opcije preprocesora, kompajlera i linkera mogu se promijeniti u izborniku ProjectSettings u Visual C++.

37

Error! Not a valid link.

Sl. 3.1.1 Kreiranje .EXE programa

3.2 Biblioteke za dinamiko povezivanje (DLL)Biblioteka za dinamiko povezivanje (Dynamic Link Library DLL) je kod smjeten u datoteci sa .DLL ekstenzijom. DLL nije izravno izvodiv pa se poziva ili iz izvrnog programa ili iz drugog DLL-a. Postoje dva tipa DLL-a: DLL koji sadri kod DLL koji sadri samo resurse.

Kod koji se nalazi u DLL-u napisan je ili u obliku funkcija ili u obliku C++ klasa. Prije pozivanja funkcija i koritenja klasa koje su dio DLL-a iz neke aplikacije, DLL treba biti uitan u memoriju. Tada se te funkcije i klase ponaaju kao da su dio same aplikacije.

3.2.1 Naini uitavanja DLL u memorijuDLL se moe uitati u memoriju na dva naina: statiki i dinamiki. Statiko uitavanje: prilikom pokretanja aplikacije koja poziva DLL, DLL se automatski uita u memoriju. Prednost ovakvo naina pozivanja DLL-a je njegova jednostavnost, a nedostatak je u tome da ako program ne uspije ispravno pozvati DLL, program se nee moi ni pokrenuti. Dinamiko uitavanje: DLL se uitava u memoriju tek kad aplikacija zatreba neku njegovu klasu ili funkciju, a kada prestane njegova uporaba DLL se brie iz memorije. Prednost ovakvog naina je bolje iskoritenje memorijskog prostora, pa se zbog toga aplikacija bre pokree, a glavni nedostatak ovakvog postupka je dodatan posao za programera (uitavanje DLL-a sa LoadLibrary i oslobaanje memorije nakon njegove upotrebe sa FreeLibrary).

38

3.2.2 Kreiranje DLL-aPostoji nekoliko vrsta DLL-ova, tzv. regular DLL , extension DLL, non-MFC (Microsoft Foundation Class) DLL i resource DLL. Ovisno o tome na koji nain i gdje e se DLL koristiti kreira se jedan od njih. Regular DLL moe biti statiki i dinamiki povezan s MFC (Microsoft Foundation Class). MFC koristi interno, a funkcije koje se eksportiraju mogu se pozvati ili sa MFC izvrnim programima, ili sa izvrnim programima koji ne koriste MFC. Izvrni program koji poziva DLL moe biti napisan u bilo kojem programskom jeziku koji podrava koritenje DLL-a (C, C++, Pascal, Visual Basic...). MFC extension DLL je DLL koji implementira klase nastale od postojeih MFC klasa. Izvrna aplikacija mora biti MFC aplikacija ili regular DLL dinamiki povezan sa MFC. Extension DLL mora imati DllMain funkciju i sva potrebna inicijalizacija se mora nalaziti u njoj. Non-MFC DLL je DLL koji ne koristi interno MFC, a funkcije koje se eksportiraju mogu se pozivati od MFC i ne-MFC izvrnih programa. Funkcije se obino eksportiraju iz DLL-a koristei standardno C suelje. Resource DLL je DLL koji sadri samo resurse, kao to su ikone, bitmape, stringove i okvire za dijalog. U Visual C++ kreiranje DLL-a zapoinje odabirom opcije MFC AppWizard (kreira regular DLL i extension DLL), ili Win32DynamicLinkLibrary (kreira non-MFC DLL i resource DLL) koje se nalaze u izborniku File New.

Sl. 3.2.1 Okvir za dijalog New Projects

MFC AppWizard u sljedeem koraku prua mogunost izbora DLL-a (prikazano na Sl. 3.2.2). Na osnovu odabranog DLL-a, AppWizard kreira tipine datoteke sa osnovnim inicijalizacijskim postupkom.

39

Sl. 3.2.2 MFC AppWizard

Izborom Win32 Dynamic Link Library kreira se ili non-MFC DLL ili resource DLL. Ovisno o odabiru u sljedeem koraku (Sl. 3.2.3), DLL projekt kojeg kreira Win32 Dynamic Link Library moe biti prazan DLL (bez ikakvog napisanog koda) ili DLL koji sadrava potreban kod za njegovu inicijalizaciju.

Sl. 3.2.3 Win32 DLL Resource DLL se kreira tako da se u izborniku Project, opciji Add To Project kreira novi Resource Script za DLL snimljen kao datoteka s ekstenzijom .RC. Da bi DLL sadravao samo resurse, potrebno je u izborniku ProjectSettings, u podizborniku Link dodati /NOENTRY opciju.

3.2.3 Eksportiranje iz DLL-a koritenjem modulski definirane datoteke (.DEF)Modulski definirana datoteka (.DEF) je tekstualna datoteka koja sadri jednu ili vie naredbi koje opisuju razliite atribute DLL-a. Prva naredba mora biti LIBRARY naredba. Ona identificira pripadanje DEF datoteke DLL-u i linker smjeta njegovo ime u DLL-ovu ulaznu biblioteku. Naredba EXPORTS ispisuje imena funkcija i njihove ordinalne vrijednosti koje eksportira DLL tako da iza imena funkcije pie znak @ i njen ordinalni broj. Ordinalne vrijednosti moraju biti u rasponu od 1 do N, gdje je N ukupan broj funkcija koje DLL eksportira. Mada nije nuno, .DEF datoteka esto sadri i naredbu opisa DESCRIPTION, koja opisuje svrhu DLL-a.

40

Na primjer jedna datoteka sa ekstenzijom .DEF izgleda ovako:LIBRARY BINSTABLO DESCRIPTION '' Kreira binarno stablo'' EXPORTS Unesi @1 Izbrii @2 lan @3 Min @4

AppWizard kreira osnovnu DEF datoteku i automatski je dodaje DLL projektu. U tako kreiranu datoteku dodaju se samo imena funkcija s njihovim ordinalnim brojevima. Za razliku od AppWizarda, opcija Win32 DLL ne kreira DEF datoteku, ali se datoteka moe naknadno kreirati i dodati projektu (Add To Project). Prilikom eksportiranja funkcija iz DLL-a u izvrne datoteke napisane u Visual C++, C++ kompajler automatski kreira tzv. dekorativna imena funkcija koja se moraju navesti u .DEF datoteci umjesto stvarnih imena funkcija, ili se funkcije moraju eksportirati sa standardnom C vezom (naredba extern ''C''). Dekorativna imena funkcija mogu se proitati upotrebom naredbe DUMPIN ili koritenjem linker naredbe /MAP (naredbe se navode u izborniku ProjectSettings). Aplikacija koja poziva DLL (C++ kod) mora biti kreirana sa istom verzijom Visual C++ da bi mogla proitati dekorativna imena. Ako extension DLL sadrava klase koje se moraju eksportirati, tada se na poetku i na kraju zaglavlja mora nalaziti sljedei kod:#undef AFX_DATA #define AFX_DATA AFX_EXT_DATA // tijelo zaglavlja #undef AFX_DATA #define AFX_DATA

Ove linije koda osiguravaju da su MFC varijable, koje DLL koristi interno, dodane klasama i eksportirane sa DLL-om.

3.2.4 Eksportiranje funkcija __declspec(dllexport)

iz

DLL-a

koritenjem

kljune

rijei

Pomou kljune rijei __declspec(dllexport) moe se eksportirati podatke, funkcije i klase iz DLL-a. Ako se upotrebljava naredba __declspec(dllexport) tada nije potrebna .DEF datoteka. Da bi eksportirali funkcije, __declspec(dllexport) se postavlja lijevo od kljune rijei koja predstavlja konvenciju poziva DLL-a (__stdcall ili WINAPI), ako je kljuna rije navedena:

41

void __declspec(dllexport) __stdcall Funkcija1 (void);

Da bi eksportirali sve public podatke i funkcije klase, kljuna rije mora se napisati lijevo od imena klase:Class __declspec(dllexport) CPrimjer :public CObjekt { definicija klase };

Da bi DLL bio itljiviji i pregledniji, ponekad se definira makro za naredbu __declspec(dllexport) i tada se taj makro koristi sa svakim simbolom koji se eksportira:#define DllExport __declspec(dllexport)

3.2.5 Eksportiranje iz DLL-a koritenjem AFX_EXT_CLASSExtension DLL koristi makro AFX_EXT_CLASS za eksportiranje klasa, a izvrni programi koji pozivaju taj DLL koriste taj isti makro za importiranje klasa. U zaglavlju DLL-a dodaje se AFX_EXT_CLASS kljuna rije u deklaraciji klase na slijedei nain:class AFX_EXT_CLASS CmojaKlasa: public Cdokument { tijelo klase };

Ovaj makro je definiran od MFC kao __declspec(dllexport) kada su definirani preprocesorski simboli _AFXDLL i _AFXEXT, a definiran je kao __declspec(dllimport) kada je _AFXDLL definirano, a _AFXEXT nije definirano. Poto je AFX_EXT_CLASS definirano kao __declspec(dllexport) tada se moe eksportirati klasu iz DLL-a bez koritenja .DEF datoteke, i na taj nain se ne moraju pisati dekorativna imena za sve simbole klase. Mada .DEF datoteka nije nuna, ta metoda je ponekad efikasnija jer se imena simbola mogu eksportirati po njihovim ordinalnim brojevima.

3.2.6 Eksportiranje C++ funkcija za upotrebu u C izvrnim programima i obratnoFunkcije iz DLL-a napisane u programskom jeziku C++, kojima se pristupa iz C programskog modula, moraju se deklarirati sa C vezom, npr.:extern "C" __declspec (dllexport) int MojaFunkcija (long parametar1);

42

Na slian nain, za funkcije DLL-a napisane u programskom jeziku C, kojima se pristupa iz C ili C++ programskog modula, koristi se __cplusplus preprocesorski makro na nain da se prvo odredi koji se programski jezik kompajlira i tada se koristi C vezu ako se funkcije pozivaju iz C++ modula:#ifdef __cdplusplus extern "C" { //samo za eksportiranje C suelja //ako ga koristi C++ kod __declspec(dllimport) void MojaFunkcija(); __declspec (dllimport) void DrugaFunkcija(); #ifdef __cplusplus } #endif

3.2.7 Inicijalizacija DLL-aDLL sadrava inicijalizacijski kod koji se izvrava prilikom pozivanja DLL-a iz nekog izvrnog programa ili iz drugog DLL-a. Mjesto u kodu gdje se dodaje inicijalizacijski kod ovisi o vrsti DLL-a. U Win32 DLL ulazna toka funkcije je najee DllMain koja slui i za inicijalizaciju i za terminaciju DLL-a. Prilikom kreiranja DLL-a AppWizard ili Win32 DLL u nekim sluajevima (ovisno o odabranim opcijama) napiu sav potreban kod za inicijalizaciju i terminaciju DLL-a. Ako kod nije naveden, treba se dodati, jer mada e se DLL uspjeno kreirati, nee se moi ispravno pozvati iz druge aplikacije. Mjesto dodavanja koda inicijalizaciju i terminaciju DLL-a za

Vrste DLL-a Regular DLL Extension DLL Non MFC DLL

U CwinApp objektu upotrebom InitInstance i ExitInstance U DllMain funkciji koju generira AppWizard U funkciji DllMain koji smo sami kreirali

Tablica 3.2.1 Mjesto dodavanja koda za inicijalizaciju i terminaciju DLL-a

Primjer inicijalizacije i terminacije DLL-a koja se obavlja u funkciji DllMain:extern "C" int APIENTRY DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved) {

43

UNREFERENCED_PARAMETER(lpReserved); if (dwReason == DLL_PROCESS_ATTACH) { TRACE0("BB.DLL Initializing!\n"); // Extension DLL inicijalizacija if (!AfxInitExtensionModule(BbDLL, hInstance)) return 0; new CDynLinkLibrary(BbDLL); } else if (dwReason == DLL_PROCESS_DETACH) { TRACE0("BB.DLL Terminating!\n"); // Terminacija biblioteka prije poziva destruktora AfxTermExtensionModule(BbDLL); } return 1; }

44

4. PRIMJER POVEZIVANJA EXCELA SA PROGRAMSKIM JEZIKOM C++

U programskom jeziku C/C++ programira se dosta novih programa kod kojih ponekad predstavlja vei problem napraviti suelje za unos podataka i ispis rjeenja, nego rijeiti sam problem. Ako cilj programiranja nije kreiranje odreenog suelja, tada je mogue upotrijebiti neku od gotovih aplikacija za rad sa podacima. Microsoft Excel je jedna od aplikacija koja se moe koristiti kao suelje za unos podataka i ispis rezultata prorauna, tj. za tabelarni i grafiki prikaz rezultata i odgovarajuih izvjetaja. Jedna od najeih varijanti koritenja kombinacije Excela i C/C++ ili nekog drugog programskog jezika je sluaj da odreena aplikacija zahtijeva sloeni i obimni proraunski dio, a ulazni i izlazni parametri su dani u tabelarnoj i grafikoj formi. U tom sluaju takva kombinacija ima za prednost praktiki gotovo korisniko suelje (poznato velikom broju korisnika), uz mogunost efikasnog razvoja proraunskog dijela aplikacije i njeno brzo izvravanje. Meu specifinim primjerima ovakve kombinacije moe se navesti upravo primjer starijih numerikih aplikacija u elektronici (i openito tehnici) koje su dobre sa stanovita brzine i tonosti prorauna, ali im nedostaje odgovarajue korisniko suelje. U tom je sluaju opisana kombinacija sa Excelom jedno od najee koritenih rjeenja. Kao ilustracija naina povezivanja Excela i C++ (pomou datoteka i pomou DLL-a) napravljen je jednostavan primjer sortiranja podataka u matrici.

4.1 Rjeavanje problema u programskom jeziku C++Potrebno je rijeiti problem sortiranja brojeva od najveeg broja prema najmanjem i obrnuto. Problem sortiranja rijeen je pomou metode ljusaka (Shells Method). Openito, ideja sortiranja pomou metode ljusaka izgleda sljedee. Npr. za sortiranje 16 brojeva, n1 do n16, potrebno je prvo grupirati brojeve u 8 grupa po 2 broja koje treba sortirati (n1, n9), (n2, n10), ..., (n8, n16). Zatim se sortira svaka od 4 grupe sa 4 elementa (n1, n5, n9, n13), ..., (n4, n8, n12, n16), pa 2 grupe od 8 elemenata (n1, n3, n5, n7, n9, n11, n13, n15) i (n2, n4, n6, n8, n10, n12, n14, n16), i na kraju se sortira cijeli niz od svih 16 brojeva. Za sortiranje elemenata nuno je samo posljednje sortiranje, ali parcijalna sortiranja omoguavaju puno bre i efikasnije sortiranje brojeva, zbog toga to se pomou njih brojevi efikasno pomiu na poziciju koja je blia njihovoj krajnjoj poziciji. Odnos izmeu brojeva koji se sortiraju u svakoj sljedeoj ljusci (8, 4, 2, 1 u ovom primjeru) naziva se inkrement, a metoda ljusaka se ponekad naziva metoda opadajueg inkrementa.

45

Provedena su mnoga istraivanja na koji nain treba izabrati dobar skup inkremenata. Skup 8, 4, 2, 1 nije ba najbolji izbor. Mnogo bolji skup inkremenata je (3k 1)/2 koji se generira pomou formula: i1= 1 ik+1 = 3ik +1 ik= 1, 2, ... ..., 40, 13, 4, 1

Funkcija koja sortira niz elemenata a[1...n] od manjeg prema veem brojuvoid metljusakam(long n, int a[]) { inc=1; do { inc *= 3; inc++; } while (inc