33
UNIVERZITET CRNE GORE ELEKTROTEHNIČKI FAKULTET- PODGORICA POSTDIPLOMSKE STUDIJE PRIMIJENJENOG RAČUNARSTVA Specijalistički rad Automatizovanje procedure izrade tenderske dokumentacije korišćenjem VBA MENTOR: KANDIDAT Doc. dr Miloš Daković Željko Pekić Br. ind. 1/08

UNIVERZITET CRNE GORE - Ivan Drakic | ivan drakic · 2011-07-20 · (VB.NET), dok je kompatibilan sa završnom verzijom Visual Basic 6. ... kreiramo modul i unesemo odgovarajući

Embed Size (px)

Citation preview

UNIVERZITET CRNE GORE

ELEKTROTEHNIČKI FAKULTET- PODGORICA

POSTDIPLOMSKE STUDIJE PRIMIJENJENOG RAČUNARSTVA

Specijalistički rad

Automatizovanje procedure izrade tenderske dokumentacije korišćenjem VBA

MENTOR: KANDIDAT

Doc. dr Miloš Daković Željko Pekić

Br. ind. 1/08

Studije Primijenjenog Računarstva

Broj __________

Podgorica, ________ 2009. godine

Kandidat: Željko PekićBroj indeksa: 1/08

Automatizovanje procedure izrade tenderske dokumentacije korišćenjem VBA

Datum izdavanja rada: Datum predaje rada:

_____________________ _____________________

Mentor: Kandidat:

_____________________ _____________________Doc. dr Miloš Daković Željko Pekić

2

IZJAVA O SAMOSTALNOM RADU

Izjavljujem da sam ovaj specijalistički rad uradio samostalno, uz pomoć literature i mentora.

_____________________Željko Pekić

Rad odbranjen dana ____________ 2009. godine pred Komisijom u sastavu:

______________________ (Predsjednik)

______________________ (Mentor)

______________________ (Član)

Sa ocjenom _______ ( ___________ )

3

1. Sadržaj

1. Sadržaj .................................................................................................................... 4

2. Uvod ....................................................................................................................... 5

3. VBA u MS Office aplikacijama ................................................................................. 6

4. Postavka problema ................................................................................................. 9

5. Opis rješenja ........................................................................................................... 9

6. Zaključak .............................................................................................................. 31

4

2. Uvod

Tema koju obrađujem u ovom projektu svog rada vezana je za olakšanje izrade tenderske dokumentacije, kao i njenoj automatizaciji u cilju rangiranja najbolje ponude.

Istraživajući za ovaj Specijalistički rad, naišao sam na raznu literaturu i teorije koje se bave mojom temom, kako u užoj, tako i u široj vezi sa njom. Internet je bogat pregrštom raznih sadržaja, koji su mi pomogli da se približim zadatku, obradim i temeljno objasnim proceduru automatizovanja izrade tenderske dokumentacije. Naime, prvenstveno moramo objasniti sta je to u stvari tender i kako se sprovodi.

Javni tender je metod nabavke robe ili usluga prikupljanjem ponuda od potencijalnih ponuđača javnim oglašavanjem u skladu sa definisanim uslovima.

Kada se formira tenderska komisija, ona priprema potrebnu dokumentaciju, nakon čega slijedi javni poziv i prikupljanje ponuda. Tenderska komisija uzima u obzir sve ponude, ali prihvata samo one koje zadovoljavaju neke već unaprijed utvrđene zahtjeve.

Kupac kada kupi tendersku dokumentaciju, potpisuje Ugovor o čuvanju povjerljivih informacija i daje određeni depozit. Ponuda za učešće na tenderu se podnosi direktno agenciji, a zatim agencija u roku od 30 dana razmatra ponude.

U radu prevashodni zadatak mi je da objasnim proceduru automatizovanja tenderske dokumentacije. Postupak sam realizovao pomoću VBA (Visual Basic for Applications), koji je implementacija Microsoft-ovog programskog jezika VISUAL BASIC i pridruženo je integrisano razvojno okruženje (IDE), koje je ugrađeno u većini programa iz Microsoft Office.

VBA je izuzetno fleksibilan i funkcionalno veoma bogat, ali ima nekih važnih ograničenja. VBA je vlasništvo Microsoft-a, i kao takav nije otvoren

5

standard. Nije potpuno kompatibilan sa novom verzijom Visual Basic-a, (VB.NET), dok je kompatibilan sa završnom verzijom Visual Basic 6. VBA programski jezik je zastupljen u gotovo svim MS Office aplikacijama, kao i u AutoCad-u, WordPerfect-u i Adobe Photoshop-u.1

Specijalistički rad se sastoji od: uvodnog, teorijskog dijela i praktičnog dijela, koji je baziran od početka do kraja na objašnjavanju realizacije ove, meni, izuzetno zanimljive i korisne teme.

3. VBA u MS Office aplikacijama

MS Word, MS Excel i slični programi smatraju se sredstvom za izvođenje standardnih kancelarijskih poslova i kao takvi široko su rasprostranjeni. Danas možda djeluje naivno, ali nekada je bilo značajno imati mogućnost da se, recimo, neki izveštaj poveže sa grafikom iz MS Excel-a koji prezentuje trenutne podatke koji se nalaze u Access bazi. Sve bi se to jednom pripremilo, a onda koristilo tako da od zahteva do rezultata na papiru prođe pet minuta. Danas neka slična rješenja vidimo čak i u javno publikovanim stranicama na internetu, a niko se ne čudi kako je to moguće da cijelo preduzeće ima na raspolaganju trenutne berzanske izvještaje ili kursnu listu. Nije bilo tako davno kada je takvo rješenje u malim informacionom sistemima bilo prosto nemoguće.

Korišćenjem VBA, mogućnosti Office aplikacija se dodatno mogu proširiti tako da se i usko specijalizovani korisnički zahtjevi mogu automatizovati. Na primjer možete napraviti aplikaciju za pristup nekoj drugoj aplikaciji, tako da možete stvoriti, na primjer makro naredbu u MS Word-u koja pristupa MS Excel-u, Visio-u, AudoCAD-u, WordPerfect-u, ili drugim VBA- enable aplikacijama.

VBA je izuzetno efikasan, krajnje ekonomičan i lak za učenje. Ekonomičan je u smislu vremena koje se uštedi korisćenjem VBA rješenja, a i na lakoću korišćenja dobijenog proizvoda. Naime, koju god Office aplikaciju da koristimo, postoje zadaci koje ponavljamo desetinama puta, kao sto su 1 Word 2007, Macros & VBA- Made EASY, Guy Hart-Davis [1]

6

kucanje i oblikovanje teksta ili pokretanje niza komandi korišćenjem menija i toolbar-ova. VBA nam omogućuje da iste rezultate dobijemo pritiskom na dugme i time možemo reći da je VBA veoma koristan za automatizaciju ponavljajućih radnji. Sve što treba da uradimo je da uđemo u VBA Editor, kreiramo modul i unesemo odgovarajući kod. Interesantno je napomenuti da za pisanje VBA koda nije neophodno veliko iskustvo u programiranju.

Kao i kod svakog drugog programskog jezika, VBA makroi mogu biti kreirani sa nekom zlom namjerom. Korisnik koji pokreće bilo koji dokument koji sadrži VBA makro, može veoma lako doći u situaciju da makro izazove neželjene radnje. Krajnji korisnici se mogu zaštiti od napada i onemogućiti izvršavanje makroa, ako ne namjeravaju da koristie VBA programiranje. Interesantno je napomenuti da je zabrana izvršavanja makro-a standardno postavljena pri instalaciji paketa MS Office. Da bismo omogućili izvršavanje VBA makroa, prvo je potrebno da sigurnost aplikacije spustimo na najmanji nivo, i to sa tools/makro/security/low.

VBA makro moze biti startovan manuelno (tasterska kombinacija <ALT>+F8), možemo ga pridružiti nekog dugmetu, nekoj stavci menija, lijevom ili desnom kliku, ali postoji i način kada se makro startuje automatski, na primjer pokretanjem ili zatvaranjem toga fajla za koga je taj makro i napravljen. Makro počinje sa naredbom "sub ime_makroa()", a završava se "end sub". Sve ono sto je između se naziva tijelo makroa, tj. naredbe pisane u VBA programskom jeziku.

Do VBA koda nekoga makroa možemo doci na dva načina, Jedan od načina je korišćenjem menija Tools/Makro/Visual basic editor, a mozemo i pomoću prečice <ALT>+F11. Dobijamo prozor koji je prikazan na slici 1, i tu razlikujemo Project Explorer, Properties Window i Code Window.

7

Silka 1. VBA programsko okruženje

Nakon otvaranja Visual Basic Editora direktno, koristimo Project Explorer prozor za navigaciju kroz makroe i korisničke obrasce. Project Explorer prozor funkcioniše kao standardno Windows Explorer stablo. Zavisno od aplikacije koja se koristi, dobićemo različite projekte u stablu.2

U Properties prozoru Visual Basic Editor-a se mogu podgledati i izmijeniti svojstva nekog objekta u VBA, kao što je projekt, modul ili modul klase, korisnikov obrazac, ili kontrole (na primjer, dugme ili check box u dialog boxu). U padajućem meniju, na vrhu Properties prozora omogućen je izbor objekta čija svojstva želite pregledati ili izmijeniti.

U Visual Basic Editor-u većinu rada za stvaranje i uređivanje VBA makroa radimo baš u Code prozoru. Visual Basic Editor omogućava otvaranje vise makroa unutar jednog modula, i u Code prozoru se nalazi text naših makroa.

2 Mastering™, Microsoft® VBA 2nd Edition, Guy Hart-Davis [2]

8

4. Postavka problema

U poslednjem koraku procedure javnih nabavki potrebno je ispuniti propisane obrasce i zapisnike. Radi se o dokumentima sa velikim brojem tabela u koje se upisuju podaci, pri čemu se jedan podatak upisuje na više mjesta. Manuelno popunjavanje tabela je zamoran i dugotrajan posao, podložan greškama.

U ovom specijalističkom radu je opisano moguće rješenje automatskog popunjavanja obrazaca korišćenjem VBA programiranja.

Posmatran je tender koji je realizovan na ETF-u i na osnovu njega su izvedeni sledeći zaključci:

1. Tender se sastoji od pojedinačnih partija.

2. Za svaku partiju ponuđači mogu dostaviti ponudu sa detaljima ponude, cijenom i PDV-om.

3. Tenderska komisija razmatra pojedinačne ponude i konstatuje postojanje eventualnih većih ili manjih nedostataka.

4. Na kraju se svaka ponuda vrednije prema kriterijuma navedenim u tenderskoj dokumentaciji, pri čemu se najčešće koriste dva kriterijuma: ponuđena cijena i rok isporuke.

5. Na kraju se dobijenim podacima popunjavaju dokumenti: Obrazac1, Obrazac2 i Zapisnik o vrednovanju ponuda.

Cilj ovog specijalističkog rada je automatizovanje stavke broj 5.

5. Opis rješenja

Prvi korak je prikupljanje potrebnih podataka. Ovdje je iskorišćen MS Excel tako što je kreiran dokument Tender.xls sa svim potrebnim podacima za ispunjavanje obrazaca. Primjer sadržaja fajla Tender.xls je prikazan na slici 2. Fajl se sastoji iz dva radna lista. U radnom listu "Tender" upisana je

9

informacija o broju partija, dok su u radnom listu "Podaci" upisani podaci svakog ponuđača za svaku partiju (broj partije, naziv ponuđača, cijena bez PDV-a, PDV, ukupna cijena, veći i manji propusti, i na kraju kriterijum koji se odnosi na ponuđenu cijenu i rok isporuke).

Radni list "Podaci"

Radni list "Tender"Slika 2. Sadržaj fajla Tender.xls

Naredni korak je analiza tabela koje se popunjavaju i kreiranje MS Word dokumenta Sabloni.doc koji sadrži nepopunjene primjerke svih potrebnih tabela. Svaka tabela je obilježena Bookmark-om kako bi se na lak način mogla identifikovati. U nastavku je dat izgled dokumenta Sabloni.doc.

Tabela 1. Ova tabela mora imati Bookmark "Tab1S"Br

Ime ponuđača

Veći propusti čija je posljedica odbacivanje (opisati )

Valuta VrijednostUkupna vrijednost

većih propusta

Tabela 2. Ova tabela mora imati Bookmark "Tab2S"

10

Br Ime ponuđačaManji

propust( opisati)

Valuta Vrijednost Ukupna vrijednost manjih propusta

Tabela 3. Ova tabela mora imati Bookmark "Tab3S"

Br Ime ponuđača

A B C D =B±C

Valuta Cijena ugovoramanji

propusti(+ ili -)

Korigovana cijenaUgovora

Tabela 4. Ova tabela mora imati Bookmark "Tab4S"

Br

Ime ponuđača

A D E F G=D- F H I = G+H

ValutaKorigovana

cijena ugovora

KVANTIFIKACIJA

Prilagodjena cijena

bez popusta

Ponuđena stavka koja se

kvantifikuje

Korigovana cijena ugovora umanjena za stavke koje se kvantifikuju

Prosječna cijena

stavki iz ostalih ponuda

Stavka (opisati)

Iznosu

Ponudi

Tabela 5. Ova tabela mora imati Bookmark "Tab5S"

Br Ime ponuđača

A I J K= I +J

ValutaPrilagođena

cijena bez popustaPopusti

Ukupno prilagođenacijena

Tabela 6. Ova tabela mora imati Bookmark "Tab6S"

Br Imena ponuđača

K LUkupno prilagođena

cijena Rang

Tabela 7. Ova tabela mora imati Bookmark "Tab7S"

Rangiranje po silaznom redosljedu Naziv ponuđača

KUkupno prilagođena

cijena

11

Tabela 8. Ova tabela mora imati Bookmark "Tab8S"

PODKRITERIJUMI→podkriterijum

br.1 Ponuđena cijena

podkriterijum br.2Rok isporuke

UKUPNO

MAKSIMALAN BROJ BODOVA →

R.br

Ime ponuđača Dodijeljeni broj bodova

Dodijeljeni broj bodova

Tabela9. Ova tabela mora imati Bookmarks "Tab9S"

SILAZNI REDOSLJEDIME

PONUĐAČAPoeni dobijeni vrednovanjem

ponuda po kriterijumima i podkriterijumima

Tabela10. Ova tabela mora imati Bookmarks "Tab10S"

UKUPNA CIJENA(bez PDV-a)

UKUPAN PDV (7%)

UKUPNA CIJENA sa PDV-om

Tabela11. Ova tabela mora imati Bookmarks "Tab11S"

PONUĐAČ

1. PONUĐENA CIJENA

2. ROK ISPORUKE

UKUPAN BROJ BODOVA

U MS Word fajlu Sabloni.doc imamo tabelu, koju treba da iskopiramo u dokument Obrazac1. Uzećemo kao primjer Tabelu 4 koja se može iskopirati na dva načina, da uđemo u dokument i ukucamo table(1).copy, a možemo i na drugi način, sa kojim je upravo ovdje i rađeno, preko bookmark. Ovaj postupak moramo ponoviti za svaku tabelu pojedinačno.

12

Br

Ime ponuđača

A D E F G=D- F H I = G+H

ValutaKorigovana

cijena ugovora

KVANTIFIKACIJA

Prilagodjena cijena

bez popusta

Ponuđena stavka koja se

kvantifikuje

Korigovana cijena ugovora umanjena za stavke koje se kvantifikuju

Prosječna cijena

stavki iz ostalih ponuda

Stavka (opisati)

Iznosu

Ponudi

Tabela 4. Ova tabela mora imati Bookmark "Tab4S"

Datu tabelu je potrebno selektovati (Slika 3.) i pridružiti je bookmark-u Tab4S (Slika 4.). Za to su korišćene sledeće naredbe: Insert/ Bookmark/ Tab4S/ Add.

Slika 3. Selektovanje tabele

13

Slika 4. Dodavanje bookmark Tab4S prethodno selektovanoj tabeli

Sledeći korak je automatizacija pojedinačnih obrazaca. Ovdje počinjemo sa korišćenjem VBA programiranja. Počeću sa objašnjenjem makroa iz MS Word fajla Obrazac1.doc, baš kako sam ih i ja radio. On sadrži šest makroa. Ići ću redom i pokušati da pojasnim korake u rješavanju problema kroz obrazloženje VBA koda.

Prvi makro koji sam napravio, odnosi se na upis podataka iz MS Excel u MS Word, automatizovanje podataka iz MS Excel-a direktno u MS Word tabele. U ovom makrou se obrađuju manji i veći propusti navedeni u odgovarajućim kolonama fajla Tender.xls.

Prvi problem sa kojim sam se susreo jeste kako da postavim kursor na mjesto u dokumentu gdje želim da se upisuju podaci. To sam riješio uz pomoć Bookmark naredbe. Sa MS Word-ovim bookmark-om možemo označiti lokaciju unutar MS Word dokumenta ili čak dio teksta unutar dokumenta. Jednom označena, može se koristiti da označi lokaciju unutar dokumenta ili čak komad teksta unutar dokumenta. MS Word ima dvije vrste oznaka (bookmark) i svaki ima svoju vlastitu vrstu prikaza. Jedan izgleda kao oznaka velikog slova I, prikazan na slici ispod, vidjet ćete da je

14

umetnuta jedna oznaka unutar prvih linija uzorka teksta. Drugi tip double ili “obavijena” oznaka. Ova oznaka izgleda kao dve zagrade oko teksta koji je označen. Kada je tekst “obavijen” u bookmark-u, sve između početka i završetka zagrada bilježi se kao sadržaj bookmark-a. Na slici ispod možete vidjeti ovu drugu oznaku oko nekoliko riječi u trećem redu.

Da biste umetnuli jednu oznaku, vaš kursor ili selekcija treba biti na poziciji na kojoj želite umetnuti bookmark. Da ga pokrenete potrebno je da korišćenjem menija otvorite dijaloški prozor za bookmark(Insert/Bookmark) ili moguća je i tasterska kombinacija <ALT>+ I, K. Oznaka mora biti jedna, samo jedna riječ. Ako želite dodati opisno ime, možete koristiti “miješana” slova, kao što su: MojePrvoBookmarkIme. Oznake imena mogu biti najviše do 40 znakova. U dijaloškom prozoru, potrebno je samo da upišete naziv koji želite za taj bookmark i kliknete na dugme Add. Unutar jednog dokumenta možete dodati više od 16.000 bookmark, tako da ne morate brinuti o tome koliko ste ih stavili.

Kada imate bookmark u dokumentu, možete stvoriti hiperlink do neke informacije. Ispisano je ukratko samo par redova o bookmark-u, on svakako zaslužuje mnogo više, ali kao i za svaku MS Word-ovu naredbu, imamo help (tastersko dugme <F1>), pa u njemu možemo otkriti detaljno uz ponuđene primjere kako se koristi i vidjeti njegove oznake.

U prvom primjeru bookmark Tab1S je tabela koju je potrebno iskopirati, dok je Tab1 pozicija gdje treba da se ovaj prvi makro izvrši. Isto važi i za sve ostale primjere, samo se mijenja redni broj tabele. Kod većih propusta karakteristično je da se makro realizuje na taj nacin što ako je u ćeliji opisa propusta upisana neka zamjerka, u koloni Vrijednost se upisuje “NEMA”, dok se u koloni ukupnih vrijednosti većih propusta upisuje “ODBACUJE SE”. Drugi slučaj je ako u ćeliji opisa većih propusta nemamo ništa upisano. Tada se u koloni vrijednost upisuje “0”, kao i u koloni za ukupnu vrijednost većih propusta. Ovu proceduru treba ponoviti za svaku

15

partiju. Ukoliko za neku partiju nije bilo ponuđača umjesto tabele sa podacima potrebno je upisati tekst “NEMA PONUDA”. Obrada manjih propusta funkcioniše na sličan način s tim što se ponuda ne odbacuje ukoliko postoje manji propusti. U nastavku se nalazi kod sa rednim brojevima i opis svake linija tog koda.

1. Sub m1_Veci_i_manji_propusti()2. Propusti "Tab1S", "Tab1", 63. Propusti "Tab2S", "Tab2", 74. End Sub5. Sub Propusti(b1, b2, k1)6. Dim sablon As Document, d As Document7. Dim xd As Excel.Workbook8. Dim ws As Excel.Worksheet9. Dim tb As Table10. Dim s As String 11. Set d = ActiveDocument12. Set xd = Workbooks.Open(d.Path & "\Tender.xls", 0, True)13. Set ws = xd.Worksheets("Podaci")14. BP = xd.Worksheets("Tender").Cells(1, 2)15. Set sablon = Documents.Open(d.Path & "\Sabloni.doc")16. sablon.Bookmarks(b1).Select17. Selection.Copy18. d.Activate19. d.Bookmarks(b2).Range.Select20. For partija = 1 To BP21. Selection.Collapse wdCollapseEnd22. Selection.InsertParagraphAfter23. Selection.InsertAfter "PARTIJA " & partija & ":"24. Selection.Collapse wdCollapseEnd25. Selection.Paste26. Set tb = Selection.Tables(1)27. k = 228. br = 029. Do While ws.Cells(k, 1) > 030. If ws.Cells(k, 1) = partija Then31. br = br + 132. If br > 1 Then tb.Rows.Add33. tb.Cell(br + 1, 1).Range = br34. tb.Cell(br + 1, 2).Range = ws.Cells(k, 2)35. s = ws.Cells(k, k1)

16

36. tb.Cell(br + 1, 3).Range = s37. tb.Cell(br + 1, 4).Range = "€"38. If Len(s) > 1 And k1 = 6 Then39. tb.Cell(br + 1, 5).Range = "Nema"40. tb.Cell(br + 1, 6).Range = "Odbacuje se"41. Else42. tb.Cell(br + 1, 5).Range = "0"43. tb.Cell(br + 1, 6).Range = "0"44. End If45. End If46. k = k + 147. Loop48. tb.Select49. If br = 0 Then50. tb.Delete51. Selection.InsertAfter vbTab & "Nema ponuda."52. Selection.InsertParagraphAfter53. End If54. Selection.Collapse wdCollapseEnd55. Next56. xd.Close57. sablon.Close58. End Sub

Linija1. Deklariše se makro sa imenom m1_Veci_i_manji_propusti, a linija4 je kraj makra.

Linija2 . Pokreće makro "Propusti", iskopira dio dokumenta Sabloni.doc obilježen bookmark-om "Tab1S", i nalijepi na mjesto obilježeno bookmark-om "Tab1" u dokumentu Obrazac1.doc. Broj 6 je broj kolone MS Excel dokumenta u kojoj su navedeni VEĆI PROPUSTI. Procedura se ponavlja onoliko puta koliko imamo partija u tenderu.

Linija3 . Pokreće makro "Propusti", koristi se bookmark "Tab2S" (Sabloni.doc), i bookmark "Tab2" (Obrazac1.doc) da bi se formirale tabele manjih propusta za svaku partiju. Broj 7 je broj kolone MS Excel dokumenta u kojoj su navedeni MANJI PROPUSTI

Lini ja5. Deklariše se makro Propusti, koji ima 3 ulazne promjenljive. Makro se završava linijom58.

Linija6 . Deklarišemo dve promjenljive sablon i d, tipa dokument

17

Linija7 . Deklarišemo promjenljivu xd, tipa Excel.Workbook

Linija8 . Deklarišemo promjenljivu ws, tipa Excel.Worksheet

Linija9 . Deklarišemo promjenljivu tb, tipa Table

Linija10 . Deklarišemo promjenljivu s, tipa String

Linija11 . Setujemo promjenljivu d, da predstavlja aktivni dokument (Obrazac1)

Linija12 . Otvaramo MS Excel fajl Tender.xls iz koga treba da izvlačimo podatke (postavili smo Read-Only nad fajlom). Njega pridružujemo promjenljivoj xd.

Linija13 . Setujemo promjenljjivu ws, radni list "Podaci" iz Tender.xls

Linija14 . BP izjednačimo sa brojem partija koji očitavamo sa radnog lista "Tender", iz ćelije B1 (1. red,2. kolona)

Linija15 . Otvaramo MS Word fajl Sabloni.doc iz koga treba da izvlačimo šablone tabela i pridružujemo ga promjenljivoj sablon

Linija16 . Selektujemo bookmarks naveden kao prvi ulazni argument makroa (b1) iz MS Word dokumenta Salboni.doc

Linija17 . Iskopiramo ono što smo u prethodnom koraku selektovali

Linija18 . Aktiviramo dokument Obrazac1 (vratimo se na njega)

Linija1 9. Selektujemo bookmark naveden kao drugi ulazni argument makroa (b2) u dokumentu Obrazac1

Linija20 . For petlja koja broj partija mijenja od 1 do BP, a linija55 sa naredbom NEXT prelazi na sledeću partiju

Linija21 . Postavljamo kursor na kraj selekcije

Linija22 . Prelazimo na sledeći paragraf

Linija23 . Unesemo text “PARTIJA” i zatim broj partije (brojačka promjenljiva For petlje)

Linija24 . Postavljamo kursor na kraj selekcije

Linija25 . Nalijepimo iskopiranu tabelu (kopiranu linijom17 iz dokumenta Sabloni.doc)

18

Linija26 . Setujemo promjenljjivu tb, tako da pokazuje na prethodno nalijepljenu tabelu

Linija27 . K izjednačimo sa 2, jer se u MS Excel fajlu Tender.xls podaci nalaze od drugog reda (prvi red je zaglavlje MS Excel tabele)

Linija28 . Promjenljiva br je brojač, kojom određujemo broj ponuđaca iz neke partije

Linija29 . Sve dokle je iz radnog lista "Podaci" vrijednost ćelije (k,1) veca od 0 idi dalje, a linija47 vraća naredbom LOOP ponovo na ovu provjeru iz linije29.

Linija30 . Ako je vrijednost ćelije (k,1) iz radnog lista "Podaci" jednaka promjenljivoj "partija", onda izvršavaj sledeće redove, a ako nije, pređi odmah iza linije45.

Linija 31. Promjenljivu br koja je brojač, odmah povećavamo za jedan, jer smo našli ponuđaca u partiji

Linija32 . Ako je vrijednost brojača veća od jedinice, onda dodajemo novi red u tabeli (uočite da sve tabele u dokumentu Sabloni.doc imaju jedan prazan red)

Linija33, 34 , 35, 36, 37 su linije koje služe da sa tačno odabranim vrijednostima iz Tender.xls ispunimo ćelije u tabeli

Linija38 . Ako je dužina promjenljive S veća od 1 i k1 jednako 6, onda izvršavaj sledeće redove, a ako nije, pređi odmah iza linije44. Ovim provjeravamo da li je bilo većih propusta.

Linija39 i linija40 su linije koje služe da se tačno odabranim vrijednostima ispunimo celije u tabeli, ako je uslov iz linije63 tačan, odnosno ukoliko je bilo većih propusta (tada se ponuda odbacuje)

Linija41 . Sa ovom linijom i naredbom ELSE postižemo sledeće. Ako uslov iz linije38 nije tačan, onda će se izvršiti sve ispod ove linije.

Linija42 i linija43 . Ako uslov iz linije38 nije tačan, onda će se izvršiti dvije linije ispod, i tabela ispuniti tačno određenim vrijednostima, odnosno ukoliko nije bilo većih propusta (tada će ponuda biti prihvaćena)

Linija46 . Povećavamo vrijednost promjenljive k za jedan, tj. nastavljamo potragu za sledećim ponuđačem.

Linija4 8. Sa ovom linijom smo selektovali tabelu

19

Linija49 . Kada je promjenljiva br=0 (imena ponuda za posmatranu partiju), onda izvrši sledeće redove (obrisati tabelu i uneti da nemamo ponuđača), a ako nije odmah prelazimo iza linije53.

Linija50 . Brišemo selektovanu tabelu

Linija51 . Pređemo za jedan tab i ispišemo "Nema ponuda."

Linija52 . Prelazimo na sledeći paragraf

Linija54 . Postavljamo kursor na kraju selekcije

Linija56 . Zatvaramo MS Excel fajl Tender.xls

Linija57 . Zatvaramo MS Word fajl Sabloni.doc

Zbog sličnosti između makroa, neću navoditi kompletan kod i za ostale makroe, već samo njihovu razliku u odnosu na prvi makro, za koga sam izveo linijsko objašnjenje.

20

Drugi makro se odnosi na vrednovanje manjih propusta, tabela je malo različita, i na to svakako trebamo obratiti pažnju kada pišemo kod, i tu se jedino i razlikuje ovaj kod u odnosu na prvi makro. Obratimo pažnju na linije od 33 do 44 iz prvoga makroa. Taj dio koda služi za upis vrednosti iz određenih ćelija iz MS Excel-a u određene ćelije u tabeli u MS Word-u. U ovom makrou taj dio je zamijenjen sa:

tb.Cell(br + 2, 1).Range = br tb.Cell(br + 2, 2).Range = ws.Cells(k, 2) tb.Cell(br + 2, 3).Range = "€" tb.Cell(br + 2, 4).Range = ws.Cells(k, 5) tb.Cell(br + 2, 5).Range = "0" tb.Cell(br + 2, 6).Range = ws.Cells(k, 5)

Potrebno je naglasiti da zaglavlje tabele u prvom makrou ima samo jedan red tako da se podatak sa rednim brojem br upisuje u br+1. red tabele, dok u drugom slučaju zaglavlje tabele ima dva reda, pa se podatak sa rednim brojem br upisuje u br+2. red tabele. U ovom makrou za kopiranje tabele je korišćen je bookmark Tab3S, a za poziciju gdje se treba umetnuti tabele (za svaku partiju po jednu) je iskorišćen Tab3.

Treći makro se odnosi na kvantifikaciju. Ponovo malo drugačija tabela, ali isti zadatak i u istom opsegu se razlikuje kod makroa u odnosu na prvi i drugi makro (linija33- linija44):

tb.Cell(br + 4, 1).Range = br tb.Cell(br + 4, 2).Range = ws.Cells(k, 2) tb.Cell(br + 4, 3).Range = "€" tb.Cell(br + 4, 4).Range = ws.Cells(k, 5) tb.Cell(br + 4, 5).Range = "--" tb.Cell(br + 4, 6).Range = "--" tb.Cell(br + 4, 7).Range = ws.Cells(k, 5) tb.Cell(br + 4, 8).Range = "--" tb.Cell(br + 4, 9).Range = ws.Cells(k, 5)

21

Kao što odmah možemo primjetiti, ovde unos u tabeli počinje od petoga reda (br=1, br+4=5). U trećem makrou za kopiranje tabele je korišćen je bookmark Tab4S, a za poziciju gdje se treba izvršiti makro je iskorišćen Tab4.

Funkcionisanje ovog makroa će biti objašnjeno na primjeru:

Izgled fajla Tender.xls

U MS Word fajlu Obrazac1.doc bi trebalo prvo da odredimo poziciju gdje će se dati makro izvršiti (Slika 5.). To određujemo sa bookmar-om, na primjer bookmark dodijelimo naziv Tab4, prikazano na slici 6. Komande za dodavanje bookmark-a su: Insert/ Bookmark/ Tab4/ Add.

22

Slika 5. Postavimo kursor na poziciju gdje želimo da počne izvršavanje makroa

Slika 6. Zatim toj poziciji u dokumentu dodijelimo bookmark Tab4

Kada je određena pozicija gdje dati makro treba da se izvrši, preostalo je još samo da ga izvršimo. To možemo trenutno na dva načina. Prvi je pomoću dugmeta u toolbaru, otvara se forma, čiji je izgled prikazan na slici 7. Drugi način je startovanje tasterskom prečicom <ALT>+F8.

23

Slika 7. Na slici je dat izgled Forme

Nakon izvršenja datog makroa, MS Word dokument Obrazac1 se popunjava sledećim tabelama:

PARTIJA1:

Br

Ime ponuđača

A D E F G=D- F H I = G+H

ValutaKorigovana

cijena ugovora

KVANTIFIKACIJA

Prilagodjena cijena

bez popusta

Ponuđena stavka koja se

kvantifikuje

Korigovana cijena ugovora umanjena za stavke koje se kvantifikuju

Prosječna cijena

stavki iz ostalih ponuda

Stavka (opisati)

Iznosu

Ponudi1 Kliford doo € 1284 -- -- 1284 -- 12842 Elite doo € 1230.5 -- -- 1230.5 -- 1230.53 Acme doo € 1177 -- -- 1177 -- 11774 Ajax doo € 1070 -- -- 1070 -- 1070

24

PARTIJA2:

Br

Ime ponuđača

A D E F G=D- F H I = G+H

ValutaKorigovana

cijena ugovora

KVANTIFIKACIJA

Prilagodjena cijena

bez popusta

Ponuđena stavka koja se

kvantifikuje

Korigovana cijena ugovora umanjena za stavke koje se kvantifikuju

Prosječna cijena

stavki iz ostalih ponuda

Stavka (opisati)

Iznosu

Ponudi1 Elite doo € 1413.47 -- -- 1413.47 -- 1413.472 Ajax doo € 1326.8 -- -- 1326.8 -- 1326.83 Kliford doo € 1188.77 -- -- 1188.77 -- 1188.77

PARTIJA3:

Br

Ime ponuđača

A D E F G=D- F H I = G+H

ValutaKorigovana

cijena ugovora

KVANTIFIKACIJA

Prilagodjena cijena

bez popusta

Ponuđena stavka koja se

kvantifikuje

Korigovana cijena ugovora umanjena za stavke koje se kvantifikuju

Prosječna cijena

stavki iz ostalih ponuda

Stavka (opisati)

Iznosu

Ponudi1 Kliford doo € 1412.4 -- -- 1412.4 -- 1412.42 Acme doo € 1214.45 -- -- 1214.45 -- 1214.453 Ajax doo € 1214.45 -- -- 1214.45 -- 1214.454 Elite doo € 1214.45 -- -- 1214.45 -- 1214.45

PARTIJA 4:

Nema ponuda.

PARTIJA5:

Br

Ime ponuđača

A D E F G=D- F H I = G+H

ValutaKorigovana

cijena ugovora

KVANTIFIKACIJA

Prilagodjena cijena

bez popusta

Ponuđena stavka koja se

kvantifikuje

Korigovana cijena ugovora umanjena za stavke koje se kvantifikuju

Prosječna cijena

stavki iz ostalih ponuda

Stavka (opisati)

Iznosu

Ponudi1 Ajax doo € 1380.3 -- -- 1380.3 -- 1380.32 Kliford doo € 1070 -- -- 1070 -- 1070

25

Popunjavanje počinje od petoga reda, i to naravno, ako imamo ponuđača. U prvoj ćeliji petoga reda ćemo upisati broj partije, ćelija A u MS Excel-u. U drugoj ćeliji ćemo upisati naziv ponuđača, odnosno u MS Excel ćelija B. U trećoj ćeliji ćemo upisati oznaku za euro. U četvrtoj, sedmoj i devetoj ćeliji ćemo unijeti ukupnu cijenu sa pdv-om, ćelija E u MS Excel-u .U petoj, šestoj i osmoj ćeliji ćemo upisati crtice "--".

Četvrti makro se odnosi na primjenu propusta. Tabela je kao i u svakom makrou drugačija. U ovom slučaju upis u tabelu počinje od trećeg reda, što znači da je za red korišćen br+2. Za kopiranje tabele je korišćen bookmark Tab5S, a za pozicioniranje izvršavanja datog makroa korišćen bookmars Tab5. Upis u tabelu je opisan sledećim kodom:

tb.Cell(br + 2, 1).Range = br tb.Cell(br + 2, 2).Range = ws.Cells(k, 2) tb.Cell(br + 2, 3).Range = "€" tb.Cell(br + 2, 4).Range = ws.Cells(k, 5) tb.Cell(br + 2, 5).Range = "Nema" tb.Cell(br + 2, 6).Range = ws.Cells(k, 5)

Peti makro se odnosi na određivanje najniže obračunske cijene, i to rangiranjem. Kao bookmarks je za tabelu iz Sabloni.doc korišćen Tab6S, a za poziciju gdje treba peti makro izvršiti bookmarks Tab6. Za ovaj makro sam izdvojio baš dosta vremena, i nisam mogao doći do konkretnog rješenja kako bih izvršio rangiranje.

Ali sam zato odradio ostalu popunu ove tabele. Kod se takođe, kao i u prethodnom primjeru, razlikuje u istom dijelu:

tb.Cell(br + 2, 1).Range = br tb.Cell(br + 2, 2).Range = ws.Cells(k, 2) tb.Cell(br + 2, 3).Range = ws.Cells(k, 5) tb.Cell(br + 2, 4).Range = " "

26

Šesti makro se odnosi na rangiranje cijena po silaznom redosljedu, odnosno sortiranje. Taj problem sam riješio tako što sam izvršio sortiranje direktno u MS Excel-u i poređao ih po rednim brojevima, što je i bio cilj ovoga makroa. Za kopiranje tabele je korišćen Tab7S, a za pozicioniranje mjesta izvršenja ovoga makroa bookmar Tab7. Kod za upis u tabelu je:

tb.Cell(br + 2, 1).Range = br tb.Cell(br + 2, 2).Range = ws.Cells(k, 2) tb.Cell(br + 2, 3).Range = ws.Cells(k, 5)

Sortiranje makroa sam izvršio tako što sam prije uzimanja podataka iz MS Excel-a ušao u njega i izvršio sortiranje, i to u rastućem redosljedu po partijama i po cijenama. Kod koji sam iskoristio za sortiranje je:

ws.Cells.Sort Key1:=Range("A2"), Order1:=xlAscending, Key2:=Range( _

E2"), Order2:=xlAscending, Header:=xlGuess, OrderCustom:=1, MatchCase _

:=False, Orientation:=xlTopToBottom, DataOption1:=xlSortNormal, _

DataOption2:=xlSortNormal

xd.Save

Takođe sam morao da skinem zaštitu (read only) nad ovim MS Excel fajlom, linija15.

Set xd = Workbooks.Open(d.Path & "\Tender.xls")

27

Slijedi drugi work fajl Obrazac2.doc i u njemu se nalaze sedmi i osmi makro, čije ću kodove takođe pokušati da pojasnim.

Sedmi makro se odnosi na ekonomski najpovoljniju ponudu. Za kopiranje tabele iz sablona koriščen je bookmarks Tab8S, dok je za pozicioniranje mjesta izvršenja ovoga makroa korišćen bookmark Tab8. Imamo odnos ponuđenih cijena i izdvajanje maximalnog broja bodova. Kod za odnos ponuđenih cijena se takođe nalazi gdje i kod za unos u tabelama iz prethodnih zadataka:

tb.Cell(br + 3, 1).Range = br tb.Cell(br + 3, 2).Range = ws.Cells(k, 2) tb.Cell(br + 3, 3).Range = ws.Cells(k, 8) tb.Cell(br + 3, 4).Range = ws.Cells(k, 9) tb.Cell(br + 3, 5).Range = ws.Cells(k, 10)

Za izdvajanje maksimalnog broja bodova trebamo ispitati da li je broj bodova prethodnog ponuđača manji od broja bodova trenutnog ponuđača, i ako jeste, stavi da maximalnan broj bude baš taj trenutni:

If ws.Cells(k - 1, 8) < ws.Cells(k, 8) Then tb.Cell(2, 3).Range = ws.Cells(k, 8) tb.Cell(2, 4).Range = ws.Cells(k, 9) tb.Cell(2, 5).Range = ws.Cells(k, 10) End If

28

Osmi makro se odnosi na silazni redosljed ponuda po kriterijumima i podkriterijumima. Za kopiranje tabele iz sablona koriščen je bookmarks Tab9S, dok je za pozicioniranje mjesta izvršenja ovoga makroa korišćen bookmark Tab9. Sortiranje makroa sam izvršio tako što sam prije uzimanja podataka iz MS Excel-a ušao u njega i izvršio sortiranje, i to u rastućem redosljedu po partijama, a u opadajućem redosljedu kada su ukupni bodovi u pitanju.

Kod koji sam iskoristio za sortiranje je:3

ws.Cells.Sort Key1:=Range("A2"), Order1:=xlAscending, Key2:=Range( _

"J2"), Order2:=xlDescending, Header:=xlGuess, OrderCustom:=1, MatchCase _

:=False, Orientation:=xlTopToBottom, DataOption1:=xlSortNormal, _

DataOption2:=xlSortNormal

xd.Save

Kod za unos silaznog redosljeda ponuda po kriterijumima u MS Word tabelama se nalazi na istim pozicijama kao i u svakom makrou, a kod izgleda ovako:

tb.Cell(br + 1, 1).Range = br

tb.Cell(br + 1, 2).Range = ws.Cells(k, 2)

tb.Cell(br + 3, 3).Range = ws.Cells(k, 10)

U trećem MS Word fajlu Zapisnik o vrednovanju ponuda.doc se nalaze deveti i deseti makro, čije ću kodove takođe pokušati da vam pojasnim.

3 Excel 2007, Power Programming with VBA, John Walkenbach & Sons [3]

29

Deveti makro se odnosi na cijene ponuda, za svakog ponuđača odvojeno. Za kopiranje tabele iz sablona koriščen je bookmarks Tab10S, dok je za pozicioniranje mjesta izvršenja ovoga makroa korišćen bookmark Tab10. Ovaj kod se razlikuje od prethoduh osam u tome što je u ovome tabela trebala da se nalijepi za svakoga ponuđača posebno, naravno, ako tog ponuđača ima. To sam postigao tako što sam samu tabelu nalijepio zajedno sa vrijednostima u tabelama. Uklonio sam liniju50 iz koda, jer nema dodavanja redova tabela i od linije33 do linije55 unet je dati kod:

Selection.Collapse wdCollapseEnd Selection.InsertParagraphAfter Selection.InsertAfter "Cijena ponude je pod rednim brojem " & br & ",

ponudac: " & ws.Cells(k, 2) Selection.Collapse wdCollapseEnd Selection.Paste Set tb = Selection.Tables(1) tb.Cell(2, 1).Range = ws.Cells(k, 3) tb.Cell(2, 2).Range = ws.Cells(k, 4) tb.Cell(2, 3).Range = ws.Cells(k, 5)

Isto tako, kasnije u kodu, kada je br=1, nemamo brisanje tabele, jer tabelu unosimo u samom kodu ako je uslov zadovoljen, i liniju82 ćemo morati da uklonimo ili stavimo kao komentar na nju.

Deseti makro se odnosi na komparativni prikaz ocjene i analiza ponuda. Tabela je data u malo drugačijem obliku, nije kao u prvih osam slučajeva. Razlika je u tome što se u ovoj tabeli unos ne vrši po redovima, već po kolonama, i samim tim za više od jednog ponuđača dodajemo kolonu, a ne red. Sve ostalo je isto. Za kopiranje tabele iz sablona korišćen je bookmarks Tab11S, dok je za pozicioniranje mjesta izvršenja ovoga makroa

30

korišćen bookmark Tab11. Kao što sam i rekao, liniju55, koja je služila za dodavanje reda, ako imamo više od jednog ponuđača u opticaju, sada trebamo prilagoditi da služi za dodavanje kolona i to ćemo postići tako što ćemo liniju55 zamijeniti sa sledećim kodom:

If br > 1 Then tb.Columns.Add

Kod za unos ocjena i analiza ponuda u MS Word tabelama se nalazi na istim pozicijama kao i u svakom makrou, a kod izgleda ovako:

tb.Cell(1, br + 1).Range = ws.Cells(k, 2)

tb.Cell(2, br + 1).Range = ws.Cells(k, 8)

tb.Cell(3, br + 1).Range = ws.Cells(k, 9)

tb.Cell(4, br + 1).Range = ws.Cells(k, 10)

6. Zaključak

31

U ovom radu posmatran je tender koji je realizovan na ETF-u i na osnovu njega su izvedeni zaključci koji predstavljaju srž ovog fenomena. Tender se sastoji od pojedinačnih partija; za svaku partiju ponuđači mogu dostaviti ponudu sa detaljima ponude; tenderska komisija razmatra ponude; svaka ponuda se na kraju vrednuje po ponuđenoj cijeni i roku isporuke isporuke, i na kraju se dobijenim podacima popunjavaju dokumenti. Dokumenti su Obrazac1, Obrazac2 i Zapisnik o vrednovanju ponuda. Cilj ovog specijalističkog rada jeste automatizovanje popunjavanja navedenih dokumenata. VBA programiranje je veoma korisno za automatizovanje tenderske dokumentacije, olakšava posao i u hodu ga obavljamo sa minimalnim trudom i ulaganjem , a greške gotovo da ne postoje ili su svedene na prihvatljiv minimum. Nadam se da sam uspio da vam približim moju temu i ovaj rad učinim razumljivim, kao i kodove donekle objasnim. Na vama je izbor, a moj izbor je svakako VBA programiranje!!!!

32

Literatura

[1] Word 2007, Macros & VBA- Made EASY, Guy Hart-Davis

[2] Mastering™, Microsoft® VBA 2nd Edition, Guy Hart-Davis

[3] Excel 2007, Power Programming with VBA, John Walkenbach & Sons

33