OpenOffice.org vo výrobnej firme 4 - Ovládacie makrá

programovani.png Keďže máte už vytvorené súbory faktúra.ots a faktúry.ods, dnes sa pozrieme na makrá a najskôr to budú takzvané všeobecné makrá – ovládacie. Tieto makrá som preto nazval všeobecné (ovládacie), lebo ich využívajú moduly všetkých dokumentov a dokonca ich môžete využiť aj v hocijakom vami vytvorenom dokumente.  

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.

  1. Vloženie knižnice. Otvorte si Nástroje | Makrá Usporiadať makrá | OpenOffice.org Basic...

    Usporiadať makráUsporiadať makrá

    Tu vyberte tlačidlo Organizátor, kartu Knižnice a zvoľte Nový.

    OrganizátorOrganizátor

    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.

    Nová knižnicaNová knižnica

  2. 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.

    Nový modulNový modul

    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ť). :-)

    Vložené modulyVložené moduly

    Ak máte hotovo, zavrite organizátor, na obrazovke vám ostalo otvorené okno Makrá.

  3. 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.

    Upraviť makro MainUpraviť makro Main

Editor makierEditor makier

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á

(Jako ve škole) Průměr: 1.00 | Hodnotilo: 20
 

Komentáře

user avatar Basquiat
Odpovědět
OpenOffice.org vo výrobnej firme 4 - Ovládacie makrá
14. 05. 2009, 21:16:58
Další článek, který člověka zahltí a nemotivuje ho k naučení maker. Literatura, pořádná, žádná; jenom miliony stránek k programování maker, která stojí za h _ _ _ o. Proč? Protože většina z nich jen popisuje, co už tady stokrát bylo a nebo skončí dřív, než se člověk stačí něco naučit. Proč nezačnete opravdu seriál o makrech v OO, který popisuje je kompletní a je doložen spousty praktických příkladů, které přidávají na obtížnosti?
user avatar j-pastierik
Odpovědět
Re:OpenOffice.org vo výrobnej firme 4 - Ovládacie makrá
15. 05. 2009, 05:34:31
Písal som a chcem písať seriál o programovaní makier. Pretože neviem, čo všetko používatelia potrebujú už veľa krát som prosil, aby mi poslali nápady, otázky, myšlienky... Stalo sa to výnimočne a preto Váš príspevok považujem za ďalší príspevok typu "výkrik do tmy". Ako programátor negenerujem potreby používateľov, ale sa ich snažím riešiť...
user avatar Basquiat
Odpovědět
Re:Re:OpenOffice.org vo výrobnej firme 4 - Ovládacie makrá
15. 05. 2009, 15:17:08
Jako výbornou tematickou pomůcku o čem psát, bych doporučil knihu "EXCEL VBA - Velká kniha řešení" od Moniky Weber a Melanie Brenden. Zatim jsem tam našel většinu věcí, které po mě v práci chtěli. Samozřejmě některá témata v knize jsou méně prakticky upotřebitelná, takže stačilo by je jen nakousnout a naopak ta témata, která jsou žádaná rozvést. V práci často řeším přenos dat mezi jednotlivými soubory, automatické načítaní, formulářové prvky...atd.
user avatar Basquiat
Odpovědět
Re:Re:OpenOffice.org vo výrobnej firme 4 - Ovládacie makrá
15. 05. 2009, 15:24:57
Ještě používám "EXCEL 2007 - Programování ve VBA", což ej také výborná kniha. Proč to ale zmiňuji. Kniha řešení je psána tematicky, proto není vhodná pro úplné začátečníky. Je zde stručně nadhozeno téma, pár příkladů kódu a to je vše. Na zkopírování a upravení ideální, ale kniha "EXCEL 2007" od J.Walkenbacha je vhodnější pro začátek, kdy nastiňuje struktura VBA, programovací techniky - Vše krůček po krůčku. Myslím si, že když vhodně zkombinujete tyto dvě knihy bude váš seriál super. Vše smaozřejmě v StarBasicu nebo co to OO používá.
user avatar Miroslav Gešvantner
Odpovědět
Re:Re:Re:OpenOffice.org vo výrobnej firme 4 - Ovládacie makrá
15. 05. 2009, 15:44:45
Chcel by som len podotknúť, že tento seriál nie je o makrách a nemá za úlohu naučiť čitateľa programovať makrá. Konkrétne táto časť má ukázať ako si už hotové makrá vložiť tam kam treba a možno ich trošku upraviť.
user avatar j-pastierik
Odpovědět
Re:Re:Re:OpenOffice.org vo výrobnej firme 4 - Ovládacie makrá
15. 05. 2009, 16:15:59
Ďakujem za radu, ale VBA nepoznám, MS Office nevlastním a preto si nemôžem ani odskúšať tieto veci. Pretože som invalidný dôchodca, sú to pre mňa vyhodené peniaze, ak by som si takú knihu kupoval. Preto potrebujem konkrétne zadania, na ktoré môžem urobiť návody a makrá.
user avatar bum
Odpovědět
Re:Re:Re:Re:OpenOffice.org vo výrobnej firme 4 - Ovládacie makrá
17. 05. 2009, 22:09:20
Pekný deň prajem.
Takže ja by som mal jednu prosbu ak môžem. Na www.inet.sk sú nejaké makrá, ale žiaľ nedokážem si ich celkom prispôsobiť k svojim potrebám. Jedná sa mi napríklad o prevod čísla na text. Vôbec to makro nedokážem donútiť aby mi naslo to číslo čo potrebujem previesť na konkrétnom mieste v programe writer. Ešte poviem, že by som to rád použil na príjmový a výdavkový doklad čo vlastne vôbec nie je ďaleko od Vášho pôvodného článku.
user avatar j-pastierik
Odpovědět
Re:Re:Re:Re:Re:OpenOffice.org vo výrobnej firme 4 - Ovládacie makrá
18. 05. 2009, 05:26:55
Môžete mi napísať na mail pastierik at inet.sk? Nerozumiem celkom Vašej otázke, ako hľadáte číslo? Popis možností, ako makro s číslom pracuje nájdete tu: http://www.602office.cz/vkladanie_cisiel_slovom
user avatar bum
Odpovědět
Re:Re:Re:Re:Re:Re:OpenOffice.org vo výrobnej firme 4 - Ovládacie makrá
19. 05. 2009, 08:46:29
Odoslal som to aj so vzorom. Dakujem.
user avatar j-pastierik
Odpovědět
Re:Re:Re:Re:Re:Re:Re:OpenOffice.org vo výrobnej firme 4 - Ovládacie makrá
19. 05. 2009, 20:09:06
Zdrojový údaj v Euro máte v tabuľke7 v bunke A2, sumu slovom ukladáte v tabuľke 8 do bunky B1. Detto platí pre druhú časť dokumentu, kde je však tabuľka 5 a tabuľka 6. Názov tabuľky zistíte v jej vlastnostiach. Budem predpokladať, že makrá pre vlastný prevod čísla na text (osobitne celej a desatinnej časti) máte urobené. Potom funkcia, ktorá vám vloží sumu slovom môže vyzerať takto:

Sub Suma_Slovom
dim dokument,tabulka,bunka as object
dokument=StarDesktop.CurrentComponent.GetTextTables()
' Výber tabuľky s číselným údajom podľa jej názvu
tabulka=dokument.GetByName("Tabuľka7")
' Výber hodnoty z bunky A2
bunka=tabulka.getCellByName("A2")
' Prevod na text - tieto funkcie treba naprogramovať
euro=preved_celu_cast(bunka.String)
centy=prebed_desatinnu_cast(bunka.string)
' Výber tabuľky, kde sa ukladá suma slovom podľa jej názvu
tabulka=dokument.GetByName("Tabuľka8")
' Výber bunky, kde sa ukladá suma slovom
bunka=tabulka.getCellByName("B1")
' Vloženie sumy slovom
bunka.string=euro+" Eur "+centy+" Euro centov"
' Opakovať pre zdrojovú tabuľku Tabuľka5 a uložiť výsledok do Tabuľka6
End Sub

Odpovědět

 

Nejsou podporovány žádné značky, komentáře jsou jen čistě textové. Více o diskuzích najdete v nápovědě. Diskuzi můžete sledovat pomocí RSS kanálu.

 
Miroslav Gešvantner

Miroslav Gešvantner

 
 
 
woo jaw demo hz