Sú to makrá, ktoré nie sú napísané, aby fungovali priamo (niektoré áno), ale sú volané väčšinou vždy iným makrom, ktoré predáva týmto makrám nejakú premennú (parameter) – napríklad názov súboru alebo číslo, poprípade inú premennú.
Prípravy makier
Najskôr si otvorite znova dokument faktúra.ots, ak ho program otvorí ako bez_názvu1, je to v poriadku. Teraz by som vašu nasledujúcu prácu zhrnul do troch bodov. Tieto body sú prípravou pred samotným vkladaním a editovaním makier.
-
Vloženie knižnice. Otvorte si Nástroje | Makrá Usporiadať makrá | OpenOffice.org Basic...
Tu vyberte tlačidlo Organizátor, kartu Knižnice a zvoľte Nový.
Dopíšte názov novej knižnice, napríklad firma, v ktorej budete mať uložené všetky makrá súvisiace so systémom, ktorý tvoríte.
-
Vloženie modulu. Teraz si otvorte kartu Moduly a označte knižnicu firma, ktorú ste práve vytvorili, a zvoľte Nový. Modulu dajte meno ovladanie.
Takto vložte ďalšie moduly s nasledovnými názvami: „ceny“, „faktura“, „fakturanti“, „faktury“, „kalkulacia“, „kontakty“, „material“, „mzdy“, „objednavka“. Zámerne som použil malé písmo bez diakritiky, nakoľko v názvoch makier ani v moduloch nie sú povolené medzery ani diakritika, a to malé písmo mám z Linuxu – nakoľko je citlivý na veľkosť písmen (veľké písmená však môžete použiť). :-)
Ak máte hotovo, zavrite organizátor, na obrazovke vám ostalo otvorené okno Makrá.
-
Otvorenie editora makier. Prejdite na Moje makrá | Firma | Ovládanie, je tam makro Main, označte ho a vyberte Upraviť. Otvorí sa editor makier OpenOffice.org.
Tento modul, ako napovedá jeho názov, slúži na ovládacie úkony a ostatné moduly väčšinou volajú makrá z neho s rôznymi premennými. Tak napríklad vo všetkých moduloch sú použité makrá, ktoré otvoria nejaký súbor. Nie sú ale v každom module písané viac krát len s iným názvom súboru, ale je len jedno makro v module ovladanie, ktoré je volané vždy s inou premennou. Tak sú tu aj iné univerzálne makrá. V ostatných moduloch sú makrá už špecifické len pre konkrétny dokument.
Editovanie makier
Ak už ste v editore, môžete začať písať prvé makro. Budem vám sem písať len samotné makrá s komentárom, nakoľko tvorbe makier by musel byť venovaný určite celý seriál a my máme za cieľ sfunkčniť tento systém. Komentáre sú v samotnom makre buď za REM
alebo za apostrofom '
.
Prvé makro v module ovladanie bude mať názov otvor a slúži na otvorenie dokumentu, do ktorého budete vo vašom prípade chcieť vložiť nejaké dáta.
Makro Main, ktoré je v editore ako prvé, môžete kľudne vymazať a nahradiť ho nasledovným, alebo aj iným makrom.
sub otvor (optional cesta as string)'otvor súbor pre calc
dim oDoc as object,sURL as string, tlacidlo as integer 'deklarácia premenných
on error goto chyba 'ošetrenie chyby
oDoc = StarDesktop.loadComponentFromURL( ConvertToURL(cesta), "_blank", _0, Array() )
uloz_novy_zosit(cesta) 'toto je volané ďalšie makro v module ovladanie
exit sub
chyba:'ak nastane z nejakého dôvodu chyba
tlacidlo=msgbox ("neexistuje súbor: " +cesta+ Chr$(13)+ "bude vytvorený nový súbor na adrese: "+cesta+Chr$(13)+"Pokračovať?",52,"chyba")
if tlacidlo=6 then 'tak ak budete chcieť
sURL = "private:factory/scalc" 'vytvoríte nový čistý zošit
oDoc = StarDesktop.loadComponentFromURL(sURL, " ", 0, Array())
oDoc.StoreAsURL(ConvertToURL(cesta), Array()) 'a uložíte ho pod vami volaným názvom
elseif tlacidlo=7 then 'ak nechcete vytvoriť tento súbor
stop 'koniec behu makra
endif
msgbox("Chyba odstránená súbor: "+cesta+" bol vytvorený",0,"Chyba otvor") 'toto sa vám zobrazí v prípade chyby ak neexistuje súbor ktorý ste chceli otvoriť a povolili ste ho vytvoriť
end sub 'koniec makra
Toto makro volá počas behu ďalšie makro s názvom uloz_novy_zosit, ktorému ďalej predáva premennú cesta. Uložte si ho za predošlé makro samozrejme v module ovladanie.
Všetky tu popísané makrá z modulu ovladanie (a ešte aj niečo navyše) sú vám k dispozícii na stiahnutie a úpravu na konci tohto dielu. Stačí si ich otvoriť v nejakom textovom editore (notepad, pspad, kate, kwrite) alebo napríklad aj v OpenOffice.org.
sub uloz_novy_zosit (optional cesta as string)
dim oDoc as object
on error goto chyba
oDoc=ThisComponent
with oDoc
if (not .hasLocation) or .isReadOnly then ' pokiaľ ešte nebol uložený, alebo je len na čítanie
.storeAsURL(ConvertToURL(cesta), Array()) ' uložiť ho ako s premennou cesta
else 'inak ak už bol uložený
.store() ' uložiť
end if
end with
exit sub
chyba:
msgbox("chyba!!!",0,"Chyba uloz_novy_zosit") 'hláška pri chybe
stop 'a zastaví beh makra
end sub
Ak makrom otvoríte dokument, budete potrebovať vybrať list, bunku, alebo oboje a na to vám bude slúžiť nasledovné makro:
sub vyberlb(optional list as string,optional bunka as string)
'volanie makra- vyberlb("názov listu","A2")označí vybratú bunku v určenom liste
'makro sa dá volať aj- vyberlb("názov listu")prejde na vybratý list
'makro sa dá volať aj- vyberlb("","A2")označí vybratú bunku v aktívnom liste (ten ktorý práve vidíme)
znova: 'návestie sem sa vráti beh makra pokiaľ vytvorí samo volaný list ktorý tu nebol
dim oSheet,oCell,octl,oDoc as object ,tlacidlo as integer' deklarácia premenných
oDoc=ThisComponent
if IsMissing(list) or list = "" then'pokiaľ neexistuje list alebo nebol v premennej zadaný
oSheet = oDoc.getCurrentController.getActiveSheet 'tak pracuj v aktívnom liste
else
on error goto chyba ' pokiaľ nastane chyba
with ThisComponent
.CurrentController.setActiveSheet(.Sheets.GetByName(list()) 'tak vytvor volaný list
end with
set oSheet = ThisComponent.Sheets.GetByName(list)
end if
if IsMissing(bunka) or bunka = "" then 'pokiaľ neexistuje bunka alebo nebola v premennej zadaná tak nič
else 'inak
set oCell=oSheet.getCellRangeByName(bunka)
octl =ThisComponent.getCurrentController()
octl.Select(oCell) 'vyber volanú bunku
end if
exit sub
chyba: 'ošetrenie chyby
tlacidlo=msgbox ("neexistuje list: " +list+ Chr$(13)+ "bude vytvorený nový list s názvom: "+list+Chr$(13)+"Pokračovať?",52,"chyba")
if tlacidlo=6 then
oSheet = oDoc.createInstance( "com.sun.star.sheet.Spreadsheet" )
oDoc.Sheets.insertByName( list, oSheet )'vlož list s volaným menom
oDoc.store("",Array())'ulož dokument
elseif tlacidlo=7 then
stop
endif
msgbox("Chyba odstránená list: "+list+" bol vytvorený",0,"Chyba vyberlb")
goto znova
end sub
Ďalšie makro, ktoré budete potrebovať, je uloz_zosit.
sub uloz_zosit(optional cesta as string)
dim oDoc as object, eDocs as object 'deklarácia premenných
set eDocs = StarDesktop.Components.CreateEnumeration' vytvor kolekciu otvorených dokumentov
on error goto DALSI 'pokiaľ nastane chyba
do while eDocs.hasMoreElements ' prejdi kolekciu dokumentov
set oDoc = eDocs.NextElement
if oDoc.ImplementationName="ScModelObj" then ' pokial je to zosit
if(ConvertFromURL(oDoc.URL))=cesta then ' a je to hladany zosit
oDoc.Store() ' tak ho uloz
oDoc.Close(true) ' a zavri
exit sub ' urobili sme čo sme chceli, končíme
end if
end if
DALSI:
loop ' pokial nie tak prejdi na ďalší (slučka)
end sub
Nasledujúce makro vyhľadá v dokumente riadok, v ktorom sa nachádza bunka s jedinečným číslom, ktoré hľadáte.
sub najdi(optional cislo as string,optional list as string)'cislo= čo hladám ,list= na ktorom liste, začne od pozície A1
dim oDoc, ocell, octl as object 'deklarácia permenných
vyberlb(list,"A1") 'tu voláte makro vyberlb, ktoré je uvedené vyššie
oDoc=ThisComponent
ocell =uFindString(cislo,list) ' voláte funkciu na vyhľadanie
octl = oDoc.getCurrentController()
octl.Select(oCell)
msgbox("nájdené",0,"Oznam najdi")
end sub
Potrebuje k tomu ešte túto vyhľadávaciu funkciu, ktorú som našiel v AndrewMacro.pdf (2,5 MB, PDF) od Gerrita Jaspera a prispôsobil, aby prijímala premenné:
Function uFindString(cislo, list) As Variant
Dim nCurCol As Integer
Dim nCurRow As Integer
Dim nEndCol As Integer
Dim nEndRow As Integer
Dim oCell,oSheet As Object
Dim oCursor As Object
Dim aAddress As Variant
Dim sFind As String
oSheet = ThisComponent.Sheets.GetByName(list)
oCell = oSheet.GetCellbyPosition(0,0)
oCursor = oSheet.createCursorByRange(oCell)
oCursor.GotoEndOfUsedArea(True)
aAddress = oCursor.RangeAddress
nEndRow = aAddress.EndRow
nEndCol = aAddress.EndColumn
For nCurCol = 0 To nEndCol 'Go through the range column by column,
For nCurRow = 0 To nEndRow 'row by row.
oCell = oSheet.GetCellByPosition( nCurCol, nCurRow )
sFind = oCell.String 'Get cell contents.
If sFind = cislo then
uFindString = oCell
Exit Function
End If
Next
Next
End Function
A ak vám predošlé makro našlo nejakú bunku, tak do nej chcete určite aj niečo vložiť nasledovným makrom:
sub vloz 'vlož inak -číslo,formát,text,dátum
dim dispatcher,document as object ' premenné
dim vloz(5) as new com.sun.star.beans.PropertyValue
vloz(0).Name = "Flags"
vloz(0).Value = "SVDT"
vloz(1).Name = "FormulaCommand"
vloz(1).Value = 0
vloz(2).Name = "SkipEmptyCells"
vloz(2).Value = false
vloz(3).Name = "Transpose"
vloz(3).Value = false
vloz(4).Name = "AsLink"
vloz(4).Value = false
vloz(5).Name = "MoveMode"
vloz(5).Value = 4
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
set document= ThisComponent.CurrentController.Frame' nastav dokument
dispatcher.executeDispatch(document, ".uno:InsertContents", "", 0, vloz())'vloženie dát ako čísiel
'msgbox("vložené",0,"Oznam")
end sub
A ešte makro zkopiruj, ktorým budete kopírovať dáta cez schránku:
sub zkopiruj
dim oDoc,oDisp as object ' premenné
oDoc= ThisComponent.CurrentController.Frame
oDisp=createUnoService("com.sun.star.frame.DispatchHelper")
oDisp.executeDispatch(oDoc, ".uno:Copy", "", 0, Array())'zkopírovanie dát do schránky
'msgbox("zkopírované",0,"Oznam")
end sub
Makro aktualizovat_tabulky budete tiež potrebovať pri dokumente faktúra.ots.
sub aktualizovat_tabulky(optional list as string,optional bunka as string)
dim document,dispatcher as object
vyberlb(list,bunka)
document = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
dispatcher.executeDispatch(document, ".uno:RecalcPivotTable", "", 0, Array())' obnov tabulku sprievodcu dátami
end sub
Ďalej potrebujete makro na export do formátu .pdf, za čo naozaj vďačím pánovi Grafovi, nakoľko som sa to pokúšal predtým riešiť iným spôsobom, s ktorým som nemal taký uspokojivý výsledok.
sub SheetToPDF(optional sSheetName as string,optional subor as string,optional sRange as string,optional sOrientation as string)
dim i as integer
dim arg(0) as new com.sun.star.beans.PropertyValue
dim PA() as object
dim CRA(0) as new com.sun.star.table.CellRangeAddress
' skryta vychozi objektova promenna
with ThisComponent.Sheets
' Pokud je to nutne nastav vychozi parametry
if IsMissing(sSheetName) or sSheetName = "" then _
sSheetName = .getByIndex(.Count-1).Name
if IsMissing(subor) then subor = "/media/hda5/testPDF.pdf" ' tu si zadajte nejakú svoju cestu pokial by ste makro spustili len tak bez suboru
if IsMissing(sRange) then sRange = ""
if IsMissing(sOrientation) then sOrientation = ""
' Nastav orientaci stranky
arg(0).Name = "PaperOrientation"
with com.sun.star.view.PaperOrientation
select case lcase(sOrientation)
case "portrait"
arg(0).Value = .PORTRAIT
ThisComponent.Printer =arg()
case "landscape"
arg(0).Value = .LANDSCAPE
ThisComponent.Printer =arg()
end select
end with
dim bVisible(.Count-1)
' Priprava listu pro vystup do pdf
for i = 0 to .Count-1
with .getByIndex(i)
' uloz viditelnost listu
bVisible(i) = .IsVisible
' uloz oblasti tisku
redim preserve PA(i)
PA(i) = .PrintAreas
' zrus oblasti tisku
.PrintAreas = array()
if .Name = sSheetName Then
' Zadany list bude viditelny
.IsVisible = true
' Dle potreby se nastavi oblast tisku,
' pro neexistujici adresu ale preskoc
on error goto ERR_NEXT
if sRange <> "" then
CRA(0) = .getCellRangeByName(sRange).RangeAddress
.setPrintAreas(CRA())
end if
ERR_NEXT:
on error goto 0
else
' Skryj nezadouci listy
.IsVisible = false
end if
end with
next i
' Uloz vybrany list do pdf
arg(0).Name = "FilterName"
arg(0).Value = "calc_pdf_Export"
ThisComponent.storeToURL(ConvertToUrl(subor), arg())
' Vraceni vsech listu do puvodniho stavu
for i = 0 to .Count-1
with .getByIndex(i)
' Zobraz puvodni listy
.IsVisible = bVisible(i)
' Nastav puvodni tiskove oblasti
.PrintAreas = PA(i)
end with
next i
end with
end sub
Hlavné ovládacie makrá používané makrami dokumentu faktúra.ots by ste mali pripravené. Ostatné makrá v module ovladanie, ktoré používajú iné dokumenty, si popíšeme pri tvorbe týchto dokumentov. Nabudúce sa pozrieme na makrá špecifické pre dokument faktúra.
Makrá na stiahnutie: Ovládacie makrá