Odgovori 
Zbirni makro za Open office Calc


Poruka je preuzeta sa elitesecurity.org Office foruma. Izvornu diskusiju možete pronaći na ovoj stranici.

Imam snimljene makroe Macro1, Macro2, Macro3... Želim da kliknem na button i da se svi oni izvrše redom. Znači to bi trebalo da izgleda ovako.

run Macro1
pređi na sledeći sheet
run Macro2 and run Macro3
pređi na sledeći sheet
pređi na sledeći sheet
run Macro2 and run Macro3
pređi na sledeći sheet
run Macro1
pređi na sledeći sheet
pređi na sledeći sheet
pređi na sledeći sheet
run Macro 3
vrati se na prethodni sheet
vrati se na prethodni sheet
run Macro 2


Očigledno mi trebaju tri podprograma:
1) pokreni dati makro
2) pređi na sledeći sheet
3) vrati se na prethodni sheet

U Excelu znam da snimim makro koji pokreće druge makroe. To nisam uspeo da postignem u Caclu. Ne mogu da pronađem odgovarajući kod na netu pa mi treba pomoć.
Citiraj ovu poruku u odgovoru

1) Ako ste drugi makro snimili kao proceduru "Macro2" u istoj biblioteci, da je izvršite dovoljno je da u drugoj navedete njeno ime u redu gde želite da se izvrši:
...
Macro2
...


2) i 3) Sledeća procedura bira list po rednom broju:
Sub selectSheetByIndex(doc, index)
  doc.getCurrentController.select(doc.getSheets().getByIndex(index))
End Sub


Prvi list je 0, drugi 1 i tako redom. Ukupan broj listova dobijate sa doc.getSheets.Count, pa to možete da koristite kao gornju granicu u for petlji: http://wiki.services.openoffice.org/wiki...uide/Loops

U snimljenom makrou poziv bi bio selectSheetByIndex(ThisComponent, 1) da odaberete drugi list. Nad kolekcijom listova pored .getByIndex(index) postoji i metod .getByName("List2") pa to možete iskoristi da napravite novu proceduru koja listu pristupa po imenu.

Zakačio sam uz poruku primer u kome su dva snimljena makroa i ova funkcija. Macro1 nakon što upiše u A1 vrednost "1111" prebacuje na drugi list i poziva Macro2 koji upisuje vrednost "2222".


Inače savetujem vam da ako makro koji pravite nije neko kratkoročno rešenje koje više nikada neće trebati ne koristite snimanje makroa. Kod koji se tako dobija je nečitljiv i preterano opširan pa su fina prilagođavanja veoma teška. OpenOffice.org Basic dijalekat nije težak za savladavanje, a pored literature na vikiju preporučujem i knjigu koju je napisao Andrew Pitonyak i besplatan vodič koji možete preuzeti sa njegovog sajta http://www.pitonyak.org/book/


Ako se ne koriste snimljeni makroi, isti ovaj primer iz priloga izgleda znatno čitljivije:
Sub Macro1
  dim sheet as object, cell as object
 
  sheet = ThisComponent.Sheets(0)      ' sheet index
  cell = sheet.getCellByPosition(0, 0) ' column, row
 
  cell.Value = 2222                    ' .String = "2222"
                                       ' .Formula = "=SUM(...)"
  Macro2
End Sub
 
Sub Macro2
  dim sheet as object, cell as object
 
  ' referenciranje može i ovako, postoji i .getByName('List2')
  ' moguće je odjednom povući opseg ćelija ili navesti i list u referencu
  sheet = ThisComponent.getSheets.getByIndex(1)
  cell = sheet.getCellRangeByName("A1")
 
  cell.Value = 1111
End Sub



Odlična kolekcija primera postoji ovde: http://wiki.services.openoffice.org/wiki...eet_common

Prilozi uz poruku .txt  primer_dispatcher_sheet.bas.txt (Veličina: 1.93 kb)
Poseti veb stranicu korisnika
Citiraj ovu poruku u odgovoru

Hvala care!

Skapirao sam sve što piše ali ne mogu sada da isprobavam, probaću večeras.
Mnogo mi se više sviđa .getByName("List2") verzija jer mi dozvoljava da naknadno menjam raspored šitova a da makro ostane i dalje validan. Nju ću i da koristim.

Primetio sam i ja da su snimljeni makroi u Calcu jako čudni i nečitljivi. Ono što mi se sviđa kod njih je što nakon njihove upotrebe mogu da koristim undo. Npr. imam neke makroe što brišu podatke i ne bih voleo da nakon pogrešne upotrebe takvog makroa ne mogu da uradim undo.

Kod Excela nije moguće uraditi undo nakon izvršenja makroa. Ono što me zanima je - ako ja napišem ručno makro za Calc, da li mogu i tada da koristim undo?

Što se tiče učenja Star basica, nisam neki entuzijasta. Ipak je to jezik sa vrlo malom primenom. VB se sa druge strane koristi svuda. Jednog dana će VB biti uveden čak i u Open Office. Držaću se ja snimljenih makroa, a kod ću učiti samo kad moram. Hvala na predloženoj literaturi, nadam se da je "čitljiva" i za početnika kao što sam ja.
Citiraj ovu poruku u odgovoru

Da, opozivanje radi isto kod ručno pisanih i snimljenih makroa. U oba slučaja svaka mala promena u makrou je posebna akcija za opozivanje. Izvršavanjem makroa Macro1 treba dva puta kliknuti, prvi put za tekst 1111 i drugi za 2222 u drugom listu. Ako makro pravi veliki broj izmena može se dogoditi da prekorači broj koraka opoziva (podešava se u Alatke > Podešavanje > Memorija).

Veća je šansa da VBA postane zastareo. U izdanju MS Office 2008 za Mac su ga već izbacili. Sada pričaju da će ga vratiti u Office 2011, ali šta da rade ljudi sa svojim makroima, to niko ne pominje. OOoBasic koristi isti programski jezik kao i VBA, ali se razlikuje objektni model dokumenta, tablice,... tj. nazivi objekata i funkcija koje program poziva iz makroa.

OpenOffice.org dozvoljava pisanje makroa i u Pythonu, JavaScriptu i u Java BeanShell skriptu. Razvojno okruženje je najviše razvijeno za OOoBasic, dok JavaScript i BeanShell imaju neku podršku. Za pisanje Python koda se mora koristiti neko nezavisno okruženje. Dokumentaciju za OOoBasic je najlakše pronaći, ipak programeri koji već imaju iskustva sa Python/JavaScript i poznaju biblioteke za ove jezike mogu da iskoriste njihovu punu snagu za pisanje makroa.
Poseti veb stranicu korisnika
Citiraj ovu poruku u odgovoru

Evo uspeo sam da uradim ono što sam hteo:

sub main  
doc=thiscomponent
selectSheetByName(doc, "Specifikacija")
Specifikacija.SazimanjeVelSpecifikacije
doc=thiscomponent
selectSheetByName(doc, "1")
doc=thiscomponent
selectSheetByName(doc, "2")
Odeljenja.SazimanjeOdeljenja
end sub
 
Sub selectSheetByName(doc, sheetName)
doc.getCurrentController.select(doc.getSheets().getByName(sheetName))
End Sub


Nešto mi ipak ne štima. Potrebna mi je još jedna komanda koja bi sprečavala izvršavanje makroa na datom šitu ukoliko je tačno određena ćelija tog sheet-a prazna. Znači ovako:

if A1=blank then
Odeljenja.SazimanjeOdeljenja
else
do nothing
endif

Citiraj ovu poruku u odgovoru

U prethodnoj poruci tu je primer kako se pristupa ćeliji na dva načina. Jedno je numerički getCellByPosition, a drugo preko reference getCellRangeByName. Dakle, biramo ćeliju:

sheet = doc.getCurrentController.getActiveSheet
  cell = sheet.getCellRangeByName("A1")


Ovde se koristimo time da je list već izabran preko selectSheetByName(), a moglo je i direktno ovde
sheet = ThisComponent.getSheets.getByName("List2").

Sada treba grananjem proveriti da li je ćelija prazna. Mogli bismo da koristimo trik da će kada je ćelija prazna njena tekstualna vrednost biti prazna niska ("").

If cell.String = '' Then        ' imamo još .Value i .Formula
  Odeljenja.SazimanjeOdeljenja
End If


Još bolje je zaista proveriti da li je ćelija prazna, tj. da li je njena vrsta EMPTY:

If cell.Type = com.sun.star.table.CellContentType.EMPTY Then
  Odeljenja.SazimanjeOdeljenja
End If


Else grana nam ne treba jer nema ništa u njoj.

Svi ovi primeri su sa http://wiki.services.openoffice.org/wiki...eet_common
Poseti veb stranicu korisnika
Citiraj ovu poruku u odgovoru
Odgovori 




Kontakt | otvorenidokument.com | Povratak na vrh | Povratak na sadržaj | RSS