[ celawi @ 25.12.2009. 14:29 ] @
Cao,

U excelu sam imao snimljen macro koji je u odredjenim kolonama (gde se nalaze imena i prezimena), menjao vic-vić, ic-ić, dj-đ, dz-dž itd. Tako da kad se makro završi na kraju svi su imali lepo ispisana imena i prezimena. Da li znate kako da ovo uradim u Calc-u (Open office 3.0)? Probao sam da snimim makro (kao sto sam to uradio u excelu), ali mi nije poslo za rukom. Postoji opcija Autocorrect options (Tools), ali ne znam da li sa njom mogu da uradim to što hoću...
[ Goran Rakić @ 25.12.2009. 18:06 ] @
Bez upotrebe makroa, može preko regularnog izraza i običnim funkcijama:
Code:
=REPLACE(A1;SEARCH("ic$";A1);2;"ić")

($ označava kraj, tako da Tickovic postaje Ticković, a ne Tićković)

Sa upotrebom makroa može da upotrebi XReplaceable interfejs, na primer:

Code:

Sub PopraviPrezime 

   oSheet = ThisComponent.getSheets().getByIndex(0)
   oRange = oSheet.getCellRangeByName("A1:A10")

   oReplaceDesc = oRange.createReplaceDescriptor() 
   oReplaceDesc.SearchString = "ic$" 
   oReplaceDesc.ReplaceString = "ić" 
   oReplaceDesc.SearchRegularExpression = TRUE

  oSheet.replaceAll( oReplaceDesc ) 

End Sub 


Dalje delovi za pretragu prezimena mogu da se ubace u niz pa da se sve odradi sa jednim deskriptorom u petlji koja prolazi kroz taj niz parova za pretragu i zamenu.

Kroz Autocorrect (automatsko ispravljanje) ovo ne može da se odradi. Prvo ovo ispravljanje se primenjuje samo u trenutku unosa, a drugo ne može da razlikuje kraj reči pa bi svako "ic" postajalo "ić".

Šta je bio problem pri snimanju makroa? Trebalo bi da se dobije makro koji sadrži .uno:ExecuteSearch poziv. Kod mene na 3.1.1 to propisno radi, mada kod nije toliko lep kao kada se ručno napiše.
[ celawi @ 28.12.2009. 07:53 ] @
Citat:
Goran Rakić: Bez upotrebe makroa, može preko regularnog izraza i običnim funkcijama:
Code:
=REPLACE(A1;SEARCH("ic$";A1);2;"ić")

($ označava kraj, tako da Tickovic postaje Ticković, a ne Tićković)

Sa upotrebom makroa može da upotrebi XReplaceable interfejs, na primer:

Code:

Sub PopraviPrezime 

   oSheet = ThisComponent.getSheets().getByIndex(0)
   oRange = oSheet.getCellRangeByName("A1:A10")

   oReplaceDesc = oRange.createReplaceDescriptor() 
   oReplaceDesc.SearchString = "ic$" 
   oReplaceDesc.ReplaceString = "ić" 
   oReplaceDesc.SearchRegularExpression = TRUE

  oSheet.replaceAll( oReplaceDesc ) 

End Sub 


Dalje delovi za pretragu prezimena mogu da se ubace u niz pa da se sve odradi sa jednim deskriptorom u petlji koja prolazi kroz taj niz parova za pretragu i zamenu.

Kroz Autocorrect (automatsko ispravljanje) ovo ne može da se odradi. Prvo ovo ispravljanje se primenjuje samo u trenutku unosa, a drugo ne može da razlikuje kraj reči pa bi svako "ic" postajalo "ić".

Šta je bio problem pri snimanju makroa? Trebalo bi da se dobije makro koji sadrži .uno:ExecuteSearch poziv. Kod mene na 3.1.1 to propisno radi, mada kod nije toliko lep kao kada se ručno napiše.


Koristim i ja 3.1.1 verziju.
Što se tiče makroa, jednostavno sam pokusao da ga snimim kao sto sam to uradio u excelu, ali mi nije poslo za rukom. Da li se na isti nacin to radi?
Kako bih mogao ovu formulu (=REPLACE(A1;SEARCH("ic$";A1);2;"ić")[/code]) da upotrebim na vise sheet-ova i vise stvari da mi menja (dj-đ; dz-dž; zivojin-živojin...) u isto vreme?
Imam preko 20 sheetova i u njima 500-600 redova sa imenima i prezimenima, pa bih hteo da to bude sto vise automatski, ako je moguće...
[ Goran Rakić @ 28.12.2009. 21:53 ] @
Formula je zgodna da od jedne kolone napravi drugu kolonu (kao i bilo koja druga formula, tipa =A1*1,18 za računanje cene sa PDV-om od polja A1). Za više mogućnosti mogu se samo nadovezati formule, što može ružno da izgleda ali lepo radi:


=REPLACE(REPLACE(A1;SEARCH("ic$";A1);2;"ić");SEARCH("dz";A1);2;"dž")



Za pretvaranje sadržaja celih listova, makro je bolje rešenje. Kao i u MS Excel-u za napisanu proceduru može da se postavi dugme u paletu alatki za najlakše pokretanje ili može da se procedura dodeli nekom događaju, na primer da se pokreće pri svakom čuvanju datoteke.

Da se promeni tekst u celom listu u priloženom makrou oReplaceDesc treba napraviti nad oSheet, umesto nad oRange (uzimamo celi list, a ne potez ćelija). Za zamenu u svim listovima, potrebna je petlja koja bi pozvala getByIndex(i) u intervalu 0..20. Na primer nešto ovako (kod nije testiran):

Code:

Sub PopraviPrezime 

   Dim SearchStrings() As String
   Dim ReplaceStrings() As String

   SearchStrings(0)   = "ic$"
   ReplaceStrings(0) = "ić"
   SearchStrings(1)   = "dz"
   ReplaceStrings(1)  = "dž"
   SearchStrings(2)   = "dj"
   ReplaceStrings(2)  = "đ"

   Dim i, j
   For i = 0 To 19     ' listovi 0,1,2,...19 (20 listova)

      oSheet = ThisComponent.getSheets().getByIndex(i)
      oReplaceDesc = oSheet.createReplaceDescriptor() 
      oReplaceDesc.SearchRegularExpression = TRUE

      For j = 0 To UBound(SearchStrings)
         oReplaceDesc.SearchString = SearchStrings(j) 
         oReplaceDesc.ReplaceString = ReplaceStrings(j) 
         oSheet.replaceAll( oReplaceDesc ) 
      Next j

   Next i

End Sub 


Više o sintaksi bejzik jezika se može pronaći u zvaničnoj dokumentaciji: http://wiki.services.openoffic...wiki/Documentation/BASIC_Guide
Ovaj kod treba prekopirati kao novu proceduru u makroima dokumenta nakon čega je moguće pokrenuti je. Više o makroima i snimanju makroa http://wiki.services.openoffic...tarted/Creating_a_simple_macro

Inače snimanje makroa bi trebalo da radi kao i u MS Excelu, pokrene se snimanje, odrade se komande, zaustavi snimanje. U prozorčetu se zada ime novog makroa. Makro se može pokrenuti kroz meni „Alatke > Makroi > Pokreni makro“ (engl. Tools > Macros > Run Macro). U kom koraku nastaju problemi?