SERVIS<>
012007<><>

Visual Basic for Applications makroi

Snaga makroa

Automatizacijom rada možemo da postignemo veću efikasnost, pa čak i da se program u kojem radimo ponaša pomalo „inteligentno”

Mnogi korisnički programi imaju mogućnost rada sa tzv. makroima, skriptovima, akcijama, ili kako već to različite softverske kuće nazivaju. U osnovi, radi se o sposobnosti aplikacije da memoriše skup nekih vaših poteza, te da zatim taj skup aktivnosti možete da ponovite proizvoljan broj puta, u svim sledećim situacijama na koje možete da naiđete u radu. Prvobitna ideja upotrebe makroa bila je da značajno olakšaju i skrate sve one zamorne i ponavljajuće radnje.

Počećemo sa primerom u Microsoft Wordu (koji, naravno, poseduje mogućnost snimanja makroa). Recimo da ste od nekoga dobili tekst sa više desetina tabela koje ne izgledaju jednako kroz ceo tekst ili jednostavno ne izgledaju kako želite. Otvorite tekst, označite prvu tabelu, izaberite opciju Tools: Macro: Record New Macro, dajte ime („SrediTabelu”) makrou koji upravo kreirate i krenite sa formatiranjem tabele po svim parametrima koji su vam od značaja (širina tabele, debljina linija, boja podloge, vrsta i veličina pisma, itd.). Nakon toga, sa Tools: Macro: Stop recording završite snimanje makroa. Nadalje, svaki put kada označite neku tabelu možete da joj zadate one iste zapamćene parametre pozivom ovog snimljenog makroa (Tools: Macro: Macros, izaberete makro i pokrenete ga sa Run). Ako makrou dodelite i skraćenicu preko tastature, jednim potezom možete da na isti način sredite svaku označenu tabelu.

Da biste videli kako je makro zapravo upisan, izaberite: Tools: Macro: „SrediTabelu”: Edit.

Sub SrediTabelu ()
  With Selection.Cells(1)
    .LeftPadding = MillimetersToPoints(1)
    .RightPadding = MillimetersToPoints(1)
    .VerticalAlignment = wdCellAlignVerticalCenter
    .WordWrap = True
    .FitText = False
  End With
  Selection.ParagraphFormat.Alignment = wdAlignParagraphCenter
  Selection.Tables(1).PreferredWidthType = wdPreferredWidthPoints
  Selection.Tables(1).PreferredWidth = MillimetersToPoints(112)
  Selection.Font.Name = "Arial"
  Selection.Font.Size = 8
  With Selection.Tables(1)
    With .Borders(wdBorderHorizontal)
      .LineStyle = wdLineStyleSingle
      .LineWidth = wdLineWidth075pt
      .Color = wdColorBlack
    End With
    With .Borders(wdBorderVertical)
      .LineStyle = wdLineStyleSingle
      .LineWidth = wdLineWidth075pt
      .Color = wdColorBlack
    End With
  End With
  Selection.Rows.AllowBreakAcrossPages = True
End Sub

Čak i ako se nikada niste susretali sa ičim sličnim, biće vam očigledno da su u makrou jednostavno popisane opcije i njihovi parametri, onako i onim redom kako ste ih izvodili tokom snimanja.

Na žalost, kod upotrebe makroa postoje i neka ograničenja. Pre svega, kada pozovete snimljeni makro, on će bukvalno ponoviti sve one radnje koje ste snimili prvi put. Ako su u međuvremenu promenjeni neki uslovi, makro koji pozivate se neće snaći, tj. neće uraditi šta treba ili će prijaviti grešku. Tako makro napravljen u našem primeru sa tabelama neće baš najbolje uraditi posao ako niste označili tabelu ili ako tabele uopšte nema, a naravno da neće raditi ako nije ni otvoren tekst. Ipak, i bez znanja programiranja, već samo upotrebom malo logičkog razmišljanja sa makroima, može mnogo toga da se postigne.

Još jedno ograničenje upotrebe makroa jeste to da programi često ne mogu da snime baš sve što može da se izvede „ručno”. Razlog može da bude to da je neka opcija suviše „opšteg tipa” da bi bila snimljena u okviru makroa, ili opcija jednostavno nije podržana.

Male modifikacije

Sledeći primer je „Čistač teksta” u Wordu, a to je jednostavno višestruka funkcija Replace, nešto što i mi u „Svetu kompjutera” koristimo za blago automatsko sređivanje kojekakvih „prljavih” tekstova. Videćemo da već laganom modifikacijom snimljenog makroa možemo jednostavno da dodamo nove mogućnosti i dobijemo na preglednosti makroa za dalje modifikacije. Uz to, skraćujemo i sam proces snimanja makroa sa čitavom serijom funkcija što ponekad može da bude zamorno.

Ako snimite kao makro jednu zamenu teksta „aaa” u „bbb” upotrebom funkcije Edit: Replace, i pogledate kako to izgleda (Tools: Macro: Macros, izaberete makro, Edit), to će izgledati otprilike ovako:

Sub Macro1()
  Selection.Find.ClearFormatting
  Selection.Find.Replacement.ClearFormatting
  With Selection.Find
    .Text = "aaa"
    .Replacement.Text = "bbb"
    .Forward = True
    .Wrap = wdFindContinue
    .Format = False
    .MatchCase = False
    .MatchWholeWord = False
    .MatchWildcards = False
    .MatchSoundsLike = False
    .MatchAllWordForms = False
  End With
  Selection.Find.Execute Replace:=wdReplaceAll
End Sub

Izmenićemo makro tako da se poziv funkcije Replace odnosi na ceo sadržaj aktivnog dokumenta, a ne samo na selekciju, i umesto jednog Execute stavićemo čitavu seriju, sa različitim vrednostima za znake koje menjamo i znake sa kojim ih menjamo:

Sub CistacTeksta()
  With ActiveDocument.Content.Find
    .ClearFormatting
    .Replacement.ClearFormatting
    .Forward = True
    .Wrap = wdFindContinue
    .Format = False
    .MatchCase = False
    .MatchWholeWord = False
    .MatchWildcards = False
    .MatchSoundsLike = False
    .MatchAllWordForms = False
    .Execute Replace:=wdReplaceAll, Findtext:="«", Replacewith:=Chr(34)
    .Execute Replace:=wdReplaceAll, Findtext:="»", Replacewith:=Chr(34)
    .Execute Replace:=wdReplaceAll, Findtext:="„", Replacewith:=Chr(34)
    .Execute Replace:=wdReplaceAll, Findtext:="„", Replacewith:=Chr(34)
    .Execute Replace:=wdReplaceAll, Findtext:="”", Replacewith:=Chr(34)
    .Execute Replace:=wdReplaceAll, Findtext:="^p ", Replacewith:="^p"
    .Execute Replace:=wdReplaceAll, Findtext:=" ^p", Replacewith:="^p"
    .Execute Replace:=wdReplaceAll, Findtext:="^p^t", Replacewith:="^p"
    .Execute Replace:=wdReplaceAll, Findtext:="  ", Replacewith:=" "
  End With
End Sub

Ovaj makro je ekvivalent procesu u kojem smo sa više Replace komandi zamenili razne znake navoda u obične navodnike, skinuli razmake sa krajeva i početaka pasusa, tabove sa početaka pasusa i promenili dvostruke razmake u jedan razmak. Modifikacijom ovog makroa može se dodati i sređivanje razmaka pre i posle znakova interpunkcije, napraviti zamena slovnih rasporeda ili nešto drugo za šta je dovoljna višestruka zamena (delova) teksta.

Malo programiranja

Modifikacijom makroa, a tu već pomalo zalazimo u programiranje, postižemo dve važne stvari: mogućnost korišćenja velikog broja dodatnih funkcija koje uopšte ne postoje u menijima programa, i drugo, proveravanje uslova izvođenja funkcija, tj. dodavanje trunke „pameti” našim makroima, koji time već pomalo postaju program(čić)i.

Tako bismo, opet u našem primeru sa tabelama, mogli da dodamo nekoliko provera (da li je uopšte otvoren tekst, da li je tabela označena...) čime bismo se osigurali da se makro izvršava samo ako su ispunjeni odgovarajući preduslovi. Zatim, možemo da dodamo da sam makro označi tabelu ako nije označena (jer, da se podsetimo, pri snimanju onog prvog makroa nismo izabrali Table: Select: Table, već smo krenuli od unapred označene tabele).

Najvažnije, ima stvari koje jednostavno nije moguće izvesti „ručno”: daljom modifikacijom makroa možemo da postignemo da se sve one famozne promene parametara tabele izvrše odjednom za sve tabele u tekstu, pa čak i za sve tabele u svim otvorenim dokumentima! Moguće uštede u vremenu možete da naslutite, zavisno od toga šta ste konkretno naumili da uradite u svom programu.

Pomenuti Word, i uopšte paket Office, drugi Microsoftovi programi, kao i mnogi Windows programi drugih proizvođača za automatizaciju koriste VBA (Visual Basic for Applications), u Adobeovim programima uglavnom se koristi JavaScript (u poslednje vreme i VBA), a neki drugi programi koriste sopstvena, ali uglavnom manje moćna rešenja.

Dakle, koji god da je program u pitanju, za automatizaciju se koriste čitavi programski jezici, uz zamašan skup dodatnih funkcija koje se tiču matičnog programa. Zato bi zalaženje u detalje i konkretne stvari daleko, daleko prevazišlo ovde raspoloživi prostor. Mi ćemo se još malo pozabaviti samo mogućnostima i opštijim primerima.

Može i za crtanje

Da se ne ograničimo samo na Word, CorelDRAW takođe može da snima akcije korisnika kao makroe, i takođe može da se kontroliše preko VBA. Upotrebom snimljenih makroa možete da ponovite seriju istih transformacija za više grafičkih objekata, zavisno od potreba, i znatno efikasnije završite posao.

Prava snaga makroa, ipak, leži u direktnom programiranju. Evo jednostavnog primera od svega nekoliko linija:

Sub Sarenilo()
  Dim s(10, 10) As Shape
  ActiveDocument.Unit = cdrMillimeter
  ActiveDocument.ReferencePoint = cdrBottomLeft
  With ActiveLayer
    For i = 1 To 10
      For j = 1 To 10
        Set s(i, j) = .CreateRectangle2(i * 10, j * 10, 10, 10)
        s(i, j).Fill.UniformColor.CMYKAssign i * 10, j * 10, 0, 0
        s(i, j).Outline.Type = cdrNoOutline
      Next j
    Next i
  End With
End Sub

U levom donjem uglu CorelDRAW dokumenta ovaj makro iscrtava mrežu od 10 x 10 kvadrata dimenzija 10 x 10 mm i popunjava ih aritmetički dobijenim vrednostima boje, u zavisnosti od pozicije. Evo i rezultata da malo razveseli izgled ove stranice.

Iz programa u program

Ako biste poželeli da iscrtate nešto konkretnije i upotrebljivije, verovatno ćete moći da iskoristite neke svoje postojeće podatke i na osnovu njih stvorite objekte određenih osobina. Podaci o objektima mogu da se unesu u sam kôd makroa, ili pak da se čitaju iz spoljnog tekstualnog fajla. Ipak, najinteresantnija mogućnost jeste prenos podataka direktno iz drugog programa. U sledećem primeru, imamo deo podataka u samom makrou (konstante za boje), ali najvažniji deo podataka preuzimamo iz označenog dela fajla otvorenog u Excelu.

Nakon definisanja boja, makro se povezuje sa Excelom i uzima prvih šest podataka iz označenog dela tabele. Zatim iscrtava pravougaonike sa širinama koje zavise od prosleđenih vrednosti. Ovaj primer je osnova postupka kojim nastaju dijagrami i tabele kojima u našem časopisu prikazujemo rezultate testova hardvera.

Sub Dijagramcic()
  Dim podatak(6) As Single, boja(6) As String
  Dim stangla(6) As Shape, xldata As Object
  boja(1) = "60,0,0,0": boja(2) = "0,60,0,0": boja(3) = "0,0,80,0"
  boja(4) = "40,40,0,0": boja(5) = "40,0,50,0": boja(6) = "0,40,50,0"
  ActiveDocument.Unit = cdrMillimeter
  ActiveDocument.ReferencePoint = cdrBottomLeft
  Set xldata = GetObject(, "Excel.Application")
  For i = 1 To 6
    podatak(i) = xldata.Selection.Cells(1, i)
  Next i
  With ActiveLayer
    For i = 1 To 6
      Set stangla(i) = .CreateRectangle2(0, i * 3, podatak(i), 3)
      stangla(i).Fill.UniformColor.StringAssign "CMYK,CMYK," + boja(i)
      stangla(i).Outline.Type = cdrNoOutline
    Next
  End With
End Sub

• • •

Kao što rekosmo, namera nam je bila da ovim tekstom samo ilustrujemo mogućnosti makroa. Ne treba se ograničiti niti na pomenuta dva-tri programa niti na VBA već iskoristiti mogućnosti automatizacije programa koje koristite u svom radu. Ne samo da možete da poboljšate efikasnost, već ćete moći da, naoružani strpljenjem i znanjem, stvarate vrlo ozbiljne dopune mogućnosti programa u pogledu upravo onih stvari koje su vam potrebne.

Tihomir STANČEVIĆ

 
 PRIMENA
Audio DSP hardver (i softver)

 NA LICU MESTA
nVidia konferencija, Zagreb
ArtTech 2006, Pančevo
Algotech, NICE System i Altitude Software

 SERVIS
Visual Basic for Applications makroi
Šta mislite o ovom tekstu?
Home / Novi brojArhiva • Opšte temeInternetTest driveTest runPD kutakCeDetekaWWW vodič • Svet igara
Svet kompjutera Copyright © 1984-2018. Politika a.d. • RedakcijaKontaktSaradnjaOglasiPretplata • Help • English
SKWeb 3.22
Opšte teme
Internet
Test Drive
Test Run
PD kutak
CeDeteka
WWW vodič
Svet igara



Naslovna stranaPrethodni brojeviOpšte informacijeKontaktOglašavanjePomoćInfo in English

Svet kompjutera