Július Pastierik / 21. 07. 2010, 00:00
Musíte v makre riešiť problematiku triedenia buniek v module Calc? V dnešnom dieli seriálu o programovaní makier si ukážeme príklad, ako to dokážete vyriešiť.
Pri programovaní makier pre modul Calc sa niekedy stretávate s problematikou triedenia buniek. Aby sme si ukázali, ako sa triedenie programuje, pripravíme si makro, pomocou ktorého dokážete utriediť riadky označenej oblasti buniek (pravdaže, v prípade potreby si v makre môžete toto ľahko zmeniť napríklad za vami definovanú oblasť buniek).
Pre zadanie triediacich kritérií použijeme jednoduché dialógové okno, v ktorom umožníme zadanie maximálne troch kritérií (poradové číslo stĺpca a vzostupný/zostupný spôsob triedenia). Toto obmedzenie vychádza z toho, že OpenOffice.org ponúka triedenie v module Calc podľa maximálne troch kritérií.
Pravdaže, v prípade, že označíte menej ako tri stĺpce buniek, umožníme zadať menej triediacich kritérií a tak isto obmedzíme rozsah zadávaných stĺpcov v triediacich kritériách na počet označených stĺpcov. Ako obvykle, dialógové okno makra umožníme jazykovo lokalizovať tak, ako keď sa pripravuje rozšírenie pre OpenOffice.org.
dim dlg as object
REM Funkcia pre zistenie jazyka OO.o
function Jazyk_OOo as string
dim ConfigProvider, MasterKey as object
dim NodePath(0) as new com.sun.star.beans.PropertyValue
NodePath(0).Name = "nodepath"
NodePath(0).Value = "org.openoffice.Setup/L10N/"
ConfigProvider = createUnoService("com.sun.star.configuration.ConfigurationProvider")
MasterKey = ConfigProvider.createInstanceWithArguments("com.sun.star.configuration.ConfigurationAccess", NodePath())
Jazyk_OOo = left(MasterKey.getByName("ooLocale"),2) '"sk", "cs", ...
end function
REM Procedúra pre nastavenie jazyka dialógu
Sub Set_jazyk_dialogu(oDlg, sNazov, sZahlavie)
dim riadok, premenna, definicia as string
dim rovna as integer
dim sf, inStream, inFile ' Pre čítanie z lokalizačného súboru
on error resume next
if fileexists(sNazov) then ' Ak lokalizačný súbor existuje, tak načítame definície do premenných
sf = createUnoService("com.sun.star.ucb.SimpleFileAccess")
inStream = sf.openFileRead(sNazov)
inFile = createUnoService("com.sun.star.io.TextInputStream")
inFile.InputStream = inStream
inFile.Encoding = "UTF-8" ' lokalizačný súbor musí byť v UTF-8, inak nebude dobrá diakritika
Do While not inFile.IsEOF
riadok = inFile.readLine ' namiesto Line Input #subor, riadok
rovna=instr(riadok,"=")
if rovna<>0 then
premenna=trim(left(riadok,rovna-1)) ' Budeme ignorovať medzery
definicia=trim(right(riadok,len(riadok)-rovna))
select case premenna
case sZahlavie
oDlg.Title=definicia
case "V", "Z" ' V1 až V3, Z1 až Z3
for i=1 to 3
oDlg.model.getByName(premenna+trim(str(i))).setpropertyvalue("Label",definicia)
next i
case else
oDlg.model.getByName(premenna).setpropertyvalue("Label",definicia)
end select
end if
loop
' Zatvorenie definičného súboru – namiesto close #subor
inStream.closeInput
inFile.closeInput
end if
end sub
REM Procedúra pre triedenie označených buniek v Calcu
Sub Tried_bunky
dim kolko, pocet as integer
dim nazov as string
Dim Bunky ' Bunky na triedenie
Bunky=ThisComponent.getCurrentSelection() ' Aktuálny výber buniek
pocet=Bunky.getcolumns().Count ' Počet stĺpcov výberu
kolko=pocet
if Kolko>3 then Kolko=3 ' Max. počet kritérií na triedenie môže byť v OO.o tri
if Kolko>0 then ' Ak je niečo vybrané
DialogLibraries.LoadLibrary("JP_tried_calc")
dlg=CreateUnoDialog(DialogLibraries.JP_tried_calc.Dialog_triedenie) ' Sprístupnenie dialógu
kde=basiclibraries.getLibraryLinkURL("JP_tried_calc") ' Adresár, kde je rozšírenie nainštalované
nazov=left(kde,len(kde)-10)+"JP_tried_calc_"+Jazyk_OOo+".txt" ' Súbor s jazykovou lokalizáciou
Set_jazyk_dialogu(dlg, nazov, "Dialog_triedenie") ' Nastavenie jazyka dialógu
dlg.model.V1.State=1 ' Prednastavené nastavenie vzostupné triedenie
dlg.model.Z1.State=0
dlg.model.T1.ValueMax=pocet ' Meximálne číslo stĺpca pre triedenie je rovné počtu vybraných stĺpcov
dlg.model.V2.State=1
dlg.model.Z2.State=0
dlg.model.T2.ValueMax=pocet
dlg.model.V3.State=1
dlg.model.Z3.State=0
dlg.model.T3.ValueMax=pocet
for i=kolko+1 to 3 ' Ak je počet vybraných stĺpcov menší ako 3, nastavenia týchto triedení nebudú viditeľné
dlg.getControl("V"+trim(str(i))).Visible = false
dlg.getControl("Z"+trim(str(i))).Visible = false
dlg.getControl("T"+trim(str(i))).Visible = false
next i
if dlg.execute() then ' Po stlačení "OK" v dialógu
' Zistenie skutočného počtu triediacich kritérií
kolko=0
for i=1 to 3
if dlg.getControl("T"+trim(str(i))).Value>0 then kolko=kolko+1 ' Počet zadaných nenulových čísiel stĺpcov ako triediachch kritérií
next i
if kolko>0 then
Dim TriedenieStlpce(kolko-1) As New com.sun.star.util.SortField ' Definícia premennej podľa skutočného počtu triediacich kritérií
Dim TriedenieDefinicia(0) As New com.sun.star.beans.PropertyValue
kolko=0 ' Zadané triedenie nemusí byť od T1...
for i=1 to 3
if dlg.getControl("T"+trim(str(i))).Value>0 then ' Ak je zadané toto triediace kritérium
TriedenieStlpce(kolko).Field=dlg.getControl("T"+trim(str(i))).Value-1 ' Číslo stĺpca
TriedenieStlpce(kolko).SortAscending=dlg.getControl("V"+trim(str(i))).State ' 1=True – Vzostupne (Ascending), 0=False – Zostupne (Descending)
kolko=kolko+1
end if
next i
TriedenieDefinicia(0).Name = "SortFields"
TriedenieDefinicia(0).Value = TriedenieStlpce()
REM oList=ThisComponent.Sheets.getByName("List1") ' Priame zadanie triedených buniek (list)
REM Bunky=oList.getCellRangeByName("E4:G10") ' Priame zadanie triedených buniek (vlastné bunky)
Bunky.Sort(TriedenieDefinicia()) ' Vlastné triedenie
end if
end if
dlg.dispose() ' Zatvorenie dialógu
end if
end sub
Copyright © 2002 - 2013 inet.sk, s. r. o. | Všetky práva vyhradené | Neprešlo jazykovou úpravou | ISSN 1336-1899
Využívame kvalitný webhosting za rozumnú cenu od Inet.sk