LibreOfficeLogo

Calc Guide 7.4

Kapitola 12
Makra

Automatizace opakujících se úkolů

Autorská práva

Tento dokument je chráněn autorskými právy © 2023 týmem pro dokumentaci LibreOffice. Přispěvatelé jsou uvedeni níže. Dokument lze šířit nebo upravovat za podmínek licence GNU General Public License (https://www.gnu.org/licenses/gpl.html), verze 3 nebo novější, nebo the Creative Commons Attribution License (https://creativecommons.org/licenses/by/4.0/), verze 4.0 nebo novější.

Všechny ochranné známky uvedené v této příručce patří jejich vlastníkům.

Přispěvatelé

Pro toto vydání

Skip Masonsmith

 

 

Pro předchozí vydání

Andrew Pitonyak

Barbara Duprey

Jean Hollis Weber

Simon Brydon

Steve Fanning

Leo Moons

Felipe Viggiano

Olivier Hallot

Kees Kriek

Vasudev Narayanan

Rafael Lima

 

Zpětná vazba

Jakékoli připomínky nebo návrhy k tomuto dokumentu prosím směřujte do fóra dokumentačního týmu na adrese https://community.documentfoundation.org/c/documentation/loguides/ (registrace je nutná) nebo pošlete e-mail na adresu: loguides@community.documentfoundation.org.

Poznámka

Vše, co napíšete do fóra, včetně vaší e-mailové adresy a dalších osobních údajů, které jsou ve zprávě napsány, je veřejně archivováno a nemůže být smazáno. E-maily zaslané do fóra jsou moderovány.

Datum vydání a verze programu

Vydáno březen 2023. Založeno na LibreOffice 7.4 Community.
Jiné verze LibreOffice se mohou lišit vzhledem a funkčností.

Používání LibreOffice na systému macOS

Některé klávesové zkratky a položky nabídek jsou v systému macOS jiné než v systémech Windows a Linux. V následující tabulce jsou uvedeny nejdůležitější rozdíly, které se týkají informací uvedených v tomto dokumentu. Podrobnější seznam nalezneme v nápovědě k programu a v příloze A (Klávesové zkratky) této příručky.

Windows nebo Linux

Ekvivalent pro macOS

Akce

Výběr v nabídce Nástroje > Možnosti

LibreOffice > Předvolby

Otevřou se možnosti nastavení.

Klepnutí pravým tlačítkem

Control + klepnutí a/nebo klepnutí pravým tlačítkem myši v závislosti na nastavení počítače

Otevře se místní nabídka.

Ctrl (Control)

(Command)

Používá se také s dalšími klávesami.

F11

+ T

Otevře se postranní lišta Styly.

 

Úvod

Kapitola 13 příručky Začínáme s LibreOffice (nazvaná Začínáme s makry) je úvodem do maker, která jsou k dispozici v LibreOffice. Tato kapitola obsahuje další úvodní informace o použití maker v sešitech programu Calc.

Makro je posloupnost příkazů nebo stisků kláves uložených za účelem pozdějšího použití. Příkladem jednoduchého makra je makro, které zadá vaši adresu do aktuální buňky otevřeného sešitu. Makra můžeme použít k automatizaci jednoduchých i složitých úkolů a umožňují nám připravit nové funkce, které nejsou zabudovány do programu Calc.

Nejjednodušší způsob, jak vytvořit makro, je zaznamenat řadu akcí prostřednictvím uživatelského rozhraní programu Calc. Calc ukládá zaznamenaná makra pomocí otevřeného zdrojového skriptovacího jazyka LibreOffice Basic, což je dialekt známého programovacího jazyka BASIC. Tato makra mohou být editována a vylepšena pomocí integrovaného vývojového prostředí (IDE) LibreOffice Basic.

Nejvýkonnější makra v Calcu se vytvářejí psaním kódu pomocí jednoho ze čtyř podporovaných skriptovacích jazyků (LibreOffice Basic, Python, JavaScript a BeanShell). Tato kapitola poskytuje přehled o možnostech maker v LibreOffice, většinou se zaměřuje na výchozí jazyk pro skriptování maker, LibreOffice Basic. Některé příklady jsou zahrnuty pro skriptovací jazyky Python, JavaScript a BeanShell, ale úplnější popis možností těchto jazyků přesahuje rámec tohoto dokumentu.

Kompatibilita s jazykem Visual Basic for Applications (VBA)

Programovací jazyk LibreOffice Basic a programovací jazyk VBA – použitý v mnoha dokumentech Microsoft Office včetně tabulek Excel - jsou dialekty jazyka Basic. Pokud chceme v LibreOffice používat makra vytvořená v jazyce VBA v programu Microsoft Excel, musíme nejprve v editoru LibreOffice Basic IDE upravit jejich kód.

Některé tipy pro převod maker aplikace Excel napsaných v jazyce VBA jsou uvedeny na konci této kapitoly.

Používání záznamu maker

Kapitola 13, Začínáme s makry, příručky Začínáme obsahuje příklady, které ukazují, jak používat záznamník maker a porozumět generovaným skriptům LibreOffice Basic. Následující kroky uvádějí další příklad, specifický pro sešit Calc, bez podrobnějších vysvětlení z příručky Začínáme s LibreOffice. Je vytvořeno a uloženo makro, které provádí vložení jinak s operací násobení v celé řadě buněk tabulky.

Poznámka

Pro povolení záznamu makra použijeme Nástroje > Možnosti > LibreOffice > Pokročilé z hlavní nabídky a vybereme volbu Povolit záznam maker (omezená funkčnost).

  1. Nový sešit vytvoříme pomocí Soubor > Nový > Sešit v hlavní nabídce.

  2. V novém sešitě zadáme čísla uvedená na obrázku 1  do buněk A1:C3 na listu List1.

graphics4

Obrázek 1: Zadáme čísla do buněk A1:C3

  1. Vybereme buňku A3, která obsahuje číslo 3 a použijeme Úpravy > Kopírovat z hlavní nabídky, čímž zkopírujeme hodnotu do schránky.

  2. Vybereme všechny buňky v oblasti A1:C3.

  3. V hlavní nabídce zvolíme Nástroje > Makra > Zaznamenat makro a spustíme záznam makra. Program Calc zobrazí dialogové okno Zaznamenat makro, které obsahuje tlačítko Zastavit nahrávání (obrázek 2).

graphics5

Obrázek 2: Dialogové okno Zaznamenat makro s tlačítkem Zastavit nahrávání

  1. V hlavní nabídce zvolíme Úpravy > Vložit jinak > Vložit jinak a tím otevřeme dialog Vložit jinak (obrázek 3).

graphics14

Obrázek 3: Dialogové okno Vložit jinak

  1. Vybereme možnost Vše v části VložitNásobit v části Operace (obě možnosti jsou červeně orámovány na obrázku 3), a klikneme na OK. Hodnoty v buňkách A1:C3 se nyní vynásobí třemi (obrázek 4).

graphics15

Obrázek 4: Buňky A1:C3 vynásobené číslem 3

  1. Klepneme na tlačítko Zastavit nahrávání a zastavíme nahrávání makra. Calc zobrazí variantu dialogového okna Makra v Basicu (obrázek 5).

Poznámka

Oblast Uložit makro do v dialogovém okně Makra v Basicu zobrazují existující makra LibreOffice Basic, hierarchicky členěná do knihovních kontejnerů, knihoven, modulů a maker, jak je popsáno v kapitole 13 příručky Začínáme s LibreOffice. Obrázek 5 ukazuje kontejner pro knihovny nazvaný Moje makra, kontejner pro knihovny Makra LibreOffice, kontejner pro knihovny v otevřeném souboru Makra.ods a kontejner pro knihovny v nepojmenovaném souboru vytvořeném v kroku 1) . Pomocí ikon rozbalení/sbalení vlevo od každého názvu kontejneru knihovny zobrazíme knihovny, moduly a makra v tomto kontejneru.

Image9

1

Moje makra

5

Aktuální dokument

2

Makra LibreOffice

6

Vytvoření nové knihovny

3

Ikona rozbalit/sbalit

7

Vytvoření nového modulu v knihovně

4

Otevřené dokumenty

8

Makra ve vybraném modulu

Obrázek 5: Části dialogového okna Makra v Basicu

  1. Vybereme položku aktuálního dokumentu v oblasti Uložit makro do. Protože aktuální dokument v tomto příkladu nebyl uložen, označuje se jeho výchozí název Bez názvu 1.

  2. Uložené dokumenty zahrnují knihovnu maker pojmenovanou Standard. Tato knihovna se nevytvoří, dokud není dokument uložen nebo pokud není potřeba, takže v tomto bodě v příkladu postup náš nový dokument knihovnu neobsahuje. Můžeme vytvořit novou knihovnu s makrem, které jsme právě vytvořili, ale není to nutné.

  3. Klepneme na tlačítko Nový modul. Calc zobrazí dialogové okno Nový modul (obrázek 6). Zadáme název nového modulu nebo ponecháme výchozí název Modul 1.

graphics17

Obrázek 6: Dialogové okno Nový modul

Poznámka

Názvy knihoven, modulů a maker se musí řídit přísnými pravidly. Podle pravidel musí jména:

  1. Pro vytvoření nového modulu klepneme na tlačítko OK. Protože v našem aktuálním dokumentu neexistují žádné knihovny maker, program Calc automaticky vytvoří a použije knihovnu Standard.

  2. V dialogovém okně Makra v Basicu vybereme položku nově vytvořeného modulu v oblasti Uložit makro do, zadáme text PasteMultiply v poli Název makra a klepneme na tlačítko Uložit (obrázek 7).

Image10

Obrázek 7: Vybereme modul a pojmenujeme makro

Makro je uloženo pod názvem PasteMultiply v nově vytvořeném modulu v knihovně Standard dokumentu Bez názvu 1. Výpis 1  ukazuje obsah makra.

Výpis 1: Speciální vložení pomocí makra s násobením

Sub PasteMultiply
 
' --------------------------------------------------------------
 
' Definování proměnných
 
dim document   as object
 
dim dispatcher as object
 
' --------------------------------------------------------------
 
' Získání přístupu k dokumentu
 
document   = ThisComponent.CurrentController.Frame
 
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")

 
' --------------------------------------------------------------
 
dim args1(5) as new com.sun.star.beans.PropertyValue
 
args1(0).Name = "Flags"
 
args1(0).Value = "A"
 
args1(1).Name = "FormulaCommand"
 
args1(1).Value = 3
 
args1(2).Name = "SkipEmptyCells"
 
args1(2).Value = false
 
args1(3).Name = "Transpose"
 
args1(3).Value = false
 
args1(4).Name = "AsLink"
 
args1(4).Value = false
 
args1(5).Name = "MoveMode"
 
args1(5).Value = 4

 
dispatcher.executeDispatch(document, ".uno:InsertContents", "", 0, args1())

End Sub

Poznámka

Model komponent použitý v LibreOffice je Universal Network Objects nebo (UNO) a záznamník maker používá pro většinu příkazů UNO dispečer. S tímto technickým přístupem však souvisejí dva problémy. Jedním z nich je, že výstupy dispečera nejsou plně zdokumentovány a mohou se změnit. Další je, že rekordér ignoruje některé hodnoty z dialogů, které se otevírají během záznamu makra – je proto možné, že zaznamenáme komplikované makro, které ve skutečnosti neprovede vše podle očekávání. Další informace najdeme v rejstříku nápovědy pod heslem „záznam makra – omezení“.

Psaní vlastních funkcí

Vytvoření makra funkce

Můžeme napsat makro a pak jej zavolat, jako bychom volali funkci programu Calc. K vytvoření jednoduchého makra funkce postupujeme dle následujících kroků:

  1. Nový sešit vytvoříme pomocí Soubor > Nový > Sešit v hlavní nabídce, uložíme jej pod názvem CalcTestMacros.ods a necháme jej otevřený v programu Calc.

  2. V hlavní nabídce zvolíme Nástroje > Makra > Správce maker > Basic a otevřeme dialogové okno Makra v Basicu (obrázek 8). Uvědomme si, že rozvržení dialogového okna Makra v Basicu se za těchto okolností liší od verze, kterou program Calc zobrazí, když uživatel klepne na tlačítko Zastavit nahrávání v dialogu Zaznamenat makra (viz obrázek 5).

Image13

Obrázek 8: Dialogové okno Makra v Basicu

  1. Oblast Makro z obsahuje seznam dostupných kontejnerů knihoven maker, včetně kontejnerů vztahujících se k aktuálně otevřeným dokumentům LibreOffice. Moje makra obsahuje makra, která píšeme nebo přidáme do LibreOffice a jsou k dispozici pro více než jeden dokument. Makra LibreOffice obsahuje makra, která jsou součástí naší instalace LibreOffice a neměla by se měnit.

  2. Klepnutím na Organizátor otevřeme dialogové okno Organizátor maker Basicu (obrázek 9).

Klepneme na kartu Knihovny a v sekci Umístění vybereme položku s názvem aktuálního dokumentu. Oblast Knihovna se aktualizuje a zobrazí název prázdné knihovny Standard.

graphics7

Obrázek 9: Dialogové okno Organizátor maker Basicu

  1. Klepnutím na Nová otevřeme dialogové okno Nová knihovna a vytvoříme novou knihovnu pro tento dokument (obrázek 10).

graphics8

Obrázek 10: Dialogové okno Nová knihovna

  1. Zadáme popisný název knihovny (například AuthorsCalcMacros) a klepnutím na OK vytvoříme knihovnu. Oblast Knihovna v dialogovém okně Organizátor maker Basicu se aktualizuje a nyní obsahuje název nově vytvořené knihovny. Název knihovny může obsahovat až 30 znaků. V některých případech může dialog zobrazovat pouze část názvu.

graphics9

Obrázek 11: Nová knihovna se zobrazí v oblasti Knihovna:

  1. Vybereme položku AuthorsCalcMacros v oblasti Knihovna a pro úpravu knihovny klepneme na Upravit. Program Calc automaticky vytvoří modul s názvem Modul 1 a makro pojmenované Main. Program Calc zobrazí základní integrované vývojové prostředí LibreOffice (IDE), zobrazené na obrázku 12.

Obrázek 12  zobrazuje výchozí konfiguraci pro IDE LibreOffice Basic. To zahrnuje:

Image11

Obrázek 12: Integrované vývojové prostředí LibreOffice Basic

LibreOffice Basic IDE poskytuje výkonné prostředí pro vývoj a ladění maker LibreOffice Basic. Podrobnější popis prostředí je nad rámec tohoto dokumentu, ale další informace lze nalézt v nápovědě.

  1. V okně Editoru upravíme kód tak, aby odpovídal kódu uvedenému v seznamu 2. Důležitým doplňkem je vytvoření funkce NumberFive, která vrací hodnotu 5.

Tip

Příkaz Option Explicit vynutí všechny proměnné, které mají být deklarovány před jejich použitím. Je-li Option Explicit vynechán, proměnné jsou automaticky definovány při prvním použití jako typ Variant.

Výpis 2: Funkce, která vrací hodnotu 5

 

'  *****  BASIC  *****
Option Explicit

Sub Main

End Sub

Function NumberFive ()
 
NumberFive = 5
End Function

  1. V hlavní nabídce LibreOffice Basic IDE zvolíme Soubor > Uložit nebo klepneme na ikonu Uložit na standardní nástrojové liště, zmáčkneme Ctrl + S, čímž uložíme upravený Module1.

Použití makra jako funkce

V nově vytvořeném sešitu CalcTestMacros.ods vybereme buňku a zadáme vzorec =NumberFive() (obrázek 13). Program Calc najde makro, zavolá jej a zobrazí výsledek (5) v dané buňce.

graphics1

Obrázek 13: Použití makra NumberFive jako funkce programu Calc

Tip

Názvy funkcí nerozlišují velká a malá písmena. Na obrázku 13 byl zadán název funkce NumberFive, ale program Calc ji zobrazí v liště vzorců jako NUMBERFIVE.

Upozornění na zabezpečení maker

Nyní bychom měli dokument Calc uložit, zavřít a znovu otevřít. V závislosti na našich nastaveních v dialogovém okně Zabezpečení maker, ke kterému se dostaneme z hlavní nabídky Nástroje > Možnosti > LibreOffice > Zabezpečení > Zabezpečení maker může program Calc zobrazit jedno z varování zobrazených na obrázcích 14  a 15.

graphics2

Obrázek 14: Upozornění, že dokument obsahuje makra

V případě výstrahy znázorněné na obrázku 14 budeme muset klepnout na Povolit makra, jinak program Calc neumožní v dokumentu spustit žádná makra. Pokud neočekáváme, že dokument obsahuje makro, je bezpečnější klepnout na Zakázat makra, protože se může jednat o virus.

V případě výstrahy znázorněné na obrázku 15 program Calc neumožní v dokumentu spustit žádná makra a měli bychom klepnout na tlačítko OK pro odstranění varování z obrazovky.

Pokud se dokument načte s deaktivovanými makry, program Calc nebude moci najít žádné funkce maker a zobrazí chybu v postižené buňce zobrazením textu #NAME?.

graphics16

Obrázek 15: Varování, že makra v dokumentu jsou zakázána

Načtené/nenačtené knihovny

Když program Calc otevře sešit, neotevře všechny knihovny maker, které může najít v dostupných kontejnerech knihoven, protože by to bylo náročné na zdroje. Místo toho program Calc automaticky načte jen knihovnu Standard v rámci kontejneru Moje makra a vlastní knihovnuStandard z dokumentu.

Když znovu otevřeme sešit CalcTestMacros.ods, program Calc neobsahuje funkci pojmenovanou NumberFive(), proto zkontroluje všechny viditelné a načtené makro knihovny a hledá funkci. Program zkontroluje, zda načtené knihovny v Makra LibreOffice, Moje makra a dokumenty neobsahují pojmenovanou funkci. V naší počáteční implementaci je funkce NumberFive() uložena v knihovně AuthorsCalcMacros, která se při otevření dokumentu automaticky nenačte. Z tohoto důvodu nebyla funkce NumberFive() nalezena a v buňce, kde je volána, se objeví chybový stav (obrázek 16).

graphics11

Obrázek 16: Makro funkce není k dispozici

V hlavní nabídce zvolíme Nástroje > Makra > Správce maker > Basic a otevřeme dialogové okno Makra v Basicu (obrázek 17). Ikona načtené knihovny (například Standard) má jiný vzhled než ikona knihovny, která není načtena (například AuthorsCalcMacros).

Pro načtení knihovny klepneme na ikonu rozbalení vedle AuthorsCalcMacros. Ikona změní vzhled, což znamená, že knihovna je nyní načtena. Klepneme na Zavřít a zavřeme dialog Makra v Basicu.

Image2

Obrázek 17: Různé symboly pro načtené a nenačtené knihovny

Bohužel buňka, která obsahuje =NumberFive() v naší počáteční implementaci stále obsahuje chybu. Calc nepřepočítává buňky v chybě, pokud je neupravujeme nebo je nějak nezměníme. Obvyklým řešením je ukládat makra použitá jako funkce do knihovny Standard. Pokud je makro velké nebo existuje-li mnoho maker, je do knihovny Standard uložen odkaz s požadovaným názvem. Makro s odkazem načte knihovnu obsahující implementaci a poté zavolá implementaci. Tuto metodu ilustrují následující kroky.

  1. Pro otevření dialogového okna Makra v Basicu použijeme Nástroje > Makra > Uspořádat makra > Basic v hlavní nabídce. Vybereme makro NumberFive a klepneme na Upravit pro otevření makra pro úpravy (obrázek 18).

graphics18

Obrázek 18: Vybereme makro a klepneme na Upravit

  1. Calc zobrazí IDE LibreOffice Basic (obrázek 12), vstupní kurzor je v okně editoru na řádku Function NumberFive (). Změníme název NumberFive na NumberFive_Implementation, aby kód funkce odpovídal výpisu 3.

Výpis 3: Změníme název NumberFive na NumberFive_Implementation

 

Function NumberFive_Implementation ()
 
NumberFive_Implementation = 5
End Function

  1. Klepneme na tlačítko Vybrat makro na nástrojové liště Standardní v IDE LibreOffice Basic a otevřeme dialog Makra v Basicu (obrázek 18).

  2. Vybereme knihovnu Standard v dokumentu CalcTestMacros.ods a klepneme na tlačítko Nový, čímž vytvoříme nový modul. Zadáme smysluplný název, například CalcFunctions a klepneme na OK. Program Calc automaticky vytvoří makro s názvem Main a otevře modul pro úpravy.

  3. Vytvoříme makro v modulu CalcFunctions v knihovně Standard, která načte knihovnu AuthorsCalcMacros pokud již není načtena a poté zavolá implementační funkci. Viz výpis 4.

Výpis 4: Vytvoříme novou funkci NumberFive a zavoláme funkci NumberFive_Implementation

 

Function NumberFive()
 
If NOT BasicLibraries.isLibraryLoaded("AuthorsCalcMacros") Then
   
BasicLibraries.LoadLibrary("AuthorsCalcMacros")
 
End If
 
NumberFive = NumberFive_Implementation()
End Function

  1. Uložíme, zavřeme a znovu otevřeme dokument v programu Calc. Tentokrát, pokud jsou povolena makra, funkce NumberFive() funguje podle očekávání.

Předávání argumentů makru

Pro ilustraci funkce, která přijímá argumenty, napíšeme makro, které vypočítá součet jeho pozitivních argumentů. Bude ignorovat argumenty, které jsou menší než nula (viz výpis 5).

Výpis 5: PositiveSum vypočítá součet svých pozitivních argumentů

 

Function PositiveSum(Optional x)
 
Dim TheSum As Double
 
Dim iRow As Integer
 
Dim iCol As Integer

 
TheSum = 0.0
 
If NOT IsMissing(x) Then
   
If NOT IsArray(x) Then
     
If x > 0 Then TheSum = x
   
Else
     
For iRow = LBound(x, 1) To UBound(x, 1)
       
For iCol = LBound(x, 2) To UBound(x, 2)
         
If x(iRow, iCol) > 0 Then TheSum = TheSum + x(iRow, iCol)
       
Next
     
Next
   
End If
 
End If
 
PositiveSum = TheSum
End Function

Makro ve výpisu 5  demonstruje některé důležité techniky:

  1. Argument x je volitelný. Když argument není volitelný (Optional) a funkce je volána bez něj, program Calc vydá varovnou zprávu při každém vyvolání makra. Pokud Calc volá funkci mnohokrát, pak se chyba zobrazí mnohokrát.

  2. Funkce IsMissing před použitím zkontroluje, zda argument projde.

  3. Funkce IsArray zkontroluje, zda argument je jedna hodnota nebo pole. Například =PositiveSum(7) nebo =PositiveSum(A4). V prvním případě je jako argument předáno číslo 7 a ve druhém případě je funkci předána hodnota buňky A4. V obou těchto případech vrací IsArray hodnotu False.

  4. Pokud je funkci předán rozsah, je předán jako dvourozměrné pole hodnot; například =PositiveSum(A2:B5). Funkce LBoundUBound se používají k určení používaných hranic pole. Přestože dolní mez je jedna, považuje se za bezpečnější použití LBound v případě, že se v budoucnu změní.

Tip

Makro ve výpisu 5  je napsáno opatrně a zkontroluje, zda je argument pole nebo jediný argument. Makro neověřuje, že každá hodnota je číselná. Můžeme být opatrní dle vlastního uvážení. Čím více věcí zkontrolujeme, tím robustnější je makro, ale běží pomaleji.

Předání jednoho argumentu je stejně snadné jako předání dvou: přidáme do definice funkce další argument (viz výpis 6). Při volání funkce se dvěma argumenty oddělíme argumenty čárkou; například =TestMax(3, -4).

Výpis 6: TestMax přijímá dva argumenty a vrací větší z nich

 

Function TestMax(x, y)
 
If x >= y Then
   
TestMax = x
 
Else
   
TestMax = y
 
End If
End Function

Argumenty jsou předávány jako hodnoty

Argumenty předávané makru z programu Calc jsou vždy hodnoty. Není možné vědět, jaké buňky, pokud nějaké, jsou použity. Například =PositiveSum(A3) předá hodnotu buňky A3 a PositiveSum nemá možnost vědět, že byla použita buňka A3. Pokud musíme vědět, na které buňky se odkazuje spíše než na hodnoty v buňkách, předáme rozsah jako řetězec, analyzujeme řetězec a získáme hodnoty v odkazovaných buňkách.

Psaní maker, která fungují jako vestavěné funkce

Přestože program Calc najde a volá makra jako normální funkce, ve skutečnosti se nechovají jako vestavěné funkce. Například makra se neobjeví v seznamech funkcí. Napsáním doplňku je možné psát funkce, které se chovají jako normální funkce. Jedná se však o pokročilé téma, které je určeno zkušeným programátorům a je nad rámec této příručky. Další informace,včetně podrobností, jsou dostupné v nápovědě aplikace.

Odstranění maker LibreOffice Basic

Chceme-li odstranit nežádoucí makro, použijeme následující kroky:

  1. Použijeme Nástroje > Makra > Správce maker > Basic v hlavní nabídce a otevřeme dialogové okno Makra v Basicu (obrázek 18 na stránce 1).

  2. Vybereme makro, které chceme odstranit, a klepneme na tlačítko Smazat.

  3. Program Calc zobrazí potvrzovací dialog. Pro pokračování klepneme na Ano.

  4. Pro odstranění dialogového okna Makra v Basicu z obrazovky klepneme na tlačítko Zavřít.

Nežádoucí modul odstraníme následujícím postupem:

  1. Použijeme Nástroje > Makra > Správce maker > Basic v hlavní nabídce a otevřeme dialogové okno Makra v Basicu (obrázek 18 na stránce 1).

  2. Pro otevření dialogového okna Organizátor maker LibreOffice Basic klepneme na tlačítko Organizátor (obrázek 19).

  3. Ujistíme se, že je vybrána karta Moduly.

Image12

Obrázek 19: Organizátor maker LibreOffice Basic, karta Moduly

  1. V oblasti Moduly vybereme modul, který chceme odstranit.

  2. Klepneme na tlačítko Smazat.

  3. Program Calc zobrazí potvrzovací dialog. Pro pokračování klepneme na Ano.

  4. Pro zavření dialogového okna Organizátor maker LibreOffice Basic klepneme na tlačítko Zavřít.

  5. Pro zavření dialogového okna Makra v LibreOffice Basic klepneme na tlačítko Zavřít.

Přímý přístup k buňkám

K interním objektům LibreOffice můžeme přistupovat přímo a manipulovat s dokumentem Calc. Například makro ve výpisu 7 přidá v aktuálním dokumentu hodnotu do buňky A2 každého listu. ThisComponent při spuštění makra automaticky nastaví odkaz na aktuální dokument. Dokument Calc obsahuje listy a makro k nim přistupuje prostřednictvím volání ThisComponent.getSheets(). Použití getCellByPosition(sloupec, řádek) vrátí buňku na konkrétním řádku a sloupci.

Výpis 7: SumCellsAllSheets přidá hodnoty do buňky A2 každého listu

 

Function SumCellsAllSheets()
 
Dim TheSum As Double
 
Dim i As integer
 
Dim oSheets
 
Dim oSheet
 
Dim oCell

 
TheSum = 0
 
oSheets = ThisComponent.getSheets()
 
For i = 0 To oSheets.getCount() - 1
   
oSheet = oSheets.getByIndex(i)
   
oCell = oSheet.getCellByPosition(0, 1) ' GetCell A2
   
TheSum = TheSum + oCell.getValue()
 
Next
 
SumCellsAllSheets = TheSum
End Function

Tip

Objekt buňky podporuje metody getValue(), getString()getFormula() pro získání numerické hodnoty, hodnoty řetězce nebo vzorce použitého v buňce. Použijeme odpovídající sady funkcí k nastavení příslušných hodnot.

Pomocí oSheet.getCellRangeByName("A2") vrátíme rozsah buněk podle názvu. Pokud je odkazováno na jednu buňku, je vrácen objekt buňky. Pokud je uveden rozsah buněk, je vrácen celý rozsah buněk (viz výpis 8). Všimněme si, že oblast buněk vrací data jako pole polí, což je těžkopádnější než to, že se s nimi zachází jako s poli se dvěma dimenzemi, jak se to dělá ve výpisu 5.

Výpis 8: SumCellsAllSheets přidá hodnoty do buněk A2:C5 každého listu

Function SumCellsAllSheets()
 
Dim TheSum As Double
 
Dim iRow As Integer, iCol As Integer, i As Integer
 
Dim oSheets, oSheet, oCells
 
Dim oRow(), oRows()

 
TheSum = 0
 
oSheets = ThisComponent.getSheets()
 
For i = 0 To oSheets.getCount() - 1
   
oSheet = oSheets.getByIndex(i)
   
oCells = oSheet.getCellRangeByName("A2:C5")

   
' Metoda getDataArray() vrací řetězce a čísla
   
' ale v této funkci se nepoužívá.

   
' Metoda getData() vrací pouze čísla a je použitelná
   
' pro tuto funkci.

   
oRows() = oCells.getData()
   
For iRow = LBound(oRows()) To UBound(oRows())
     
oRow() = oRows(iRow)
     
For iCol = LBound(oRow()) To UBound(oRow())
       
TheSum = TheSum + oRow(iCol)
     
Next
   
Next
 
Next
 
SumCellsAllSheets = TheSum
End Function

Tip

Když je makro voláno jako funkce Calc, nemůže makro upravit žádnou hodnotu v listu, ze kterého bylo makro vyvoláno, s výjimkou hodnoty buňky, která obsahuje funkci.

Třídění

Zvažme třídění dat uvedených na obrázku 20. Nejprve seřadíme sloupec B sestupně a poté sloupec A vzestupně.

graphics22

Obrázek 20: Seřazení sloupce B sestupně a sloupce A vzestupně

Příklad ve výpisu 9 ukazuje, jak seřadit hodnoty podle těchto dvou sloupců. Spustíme makro klepnutím na ikonu Spustit na nástrojové liště LibreOffice Basic IDE.

Výpis 9: SortRange seřadí buňky A1:C5 na listu Sheet 1

 

Sub SortRange
 
Dim oSheet        ' List Calcu obsahující data k řazení.
 
Dim oCellRange    ' Oblast dat k řazení.

 
' Pole třídicích polí určuje sloupce, které jsou
 
' tříděné. Jedná se o pole se dvěma prvky, 0 a 1.
 
' Chceme-li řadit pouze jeden sloupec, použijeme:
 
' Dim oSortFields(0) As New com.sun.star.util.SortField
 
Dim oSortFields(1) As New com.sun.star.util.SortField

 
' Deskriptor řazení je pole vlastností.
 
' Primární vlastnost obsahuje pole řazení.
 
Dim oSortDesc(0) As New com.sun.star.beans.PropertyValue

 
' Získáme list s názvem "Sheet1"
 
oSheet = ThisComponent.Sheets.getByName("Sheet1")

 
' Získáme rozsah buněk k řazení
 
oCellRange = oSheet.getCellRangeByName("A1:C5")

 
' Pro výběr oblasti k řazení odkomentujeme následující kód.
 
' Jediným účelem by bylo zdůraznit tříděná data.
 
'ThisComponent.getCurrentController.select(oCellRange)

 
' Sloupce jsou číslovány počínaje 0, tedy
 
' sloupec A je 0, sloupec B je 1, atd.
 
' Řazení sloupce B (sloupec 1) sestupně.
 
oSortFields(0).Field = 1
 
oSortFields(0).SortAscending = FALSE
 ' Pokud má sloupec B dvě buňky se stejnou hodnotou,
 
' pak se pomocí sloupce A vzestupně rozhodne o pořadí.
 
oSortFields(1).Field = 0
 
oSortFields(1).SortAscending = TRUE

 
' Nastavíme popisovač řazení.
 
oSortDesc(0).Name = "SortFields"
 
oSortDesc(0).Value = oSortFields()

 
' Seřadíme oblast.
 
oCellRange.Sort(oSortDesc())
End Sub

Přehled maker BeanShell, JavaScript a Python

Úvod

Mnoho programátorů nemusí znát LibreOffice Basic, a proto program Calc podporuje makra napsaná ve třech dalších jazycích, které mohou být známější. Jedná se o BeanShell, JavaScript a Python.

Primárním skriptovacím jazykem pro program Calc je LibreOffice Basic a standardní instalace LibreOffice poskytuje výkonné integrované vývojové prostředí (IDE) spolu s dalšími možnostmi pro tento jazyk.

Makra jsou organizována stejným způsobem pro všechny čtyři skriptovací jazyky. Kontejner Makra LibreOffice obsahuje všechna makra, která jsou dodávána v instalaci LibreOffice. Kontejner Moje makra obsahuje makra, která jsou k dispozici pro jakýkoliv dokument LibreOffice. Každý dokument může také obsahovat makra, které nejsou dostupná v jiném dokumentu.

Při použití funkce záznamu makra program Calc vytvoří makro v LibreOffice Basic. Chceme-li použít další dostupné skriptovací jazyky, musíme tento kód napsat sami.

Když vybereme spuštění makra pomocí Nástroje > Makra > Spustit makro v hlavní nabídce, program Calc zobrazí dialogové okno Výběr makra. Toto dialogové okno umožňuje výběr a spuštění jakéhokoliv dostupného makra, napsaného v kterémkoliv z dostupných jazyků (obrázek 21).

Když se rozhodneme upravit makro pomocí Nástroje > Makra > Upravit makra z hlavní nabídky, zobrazí program Calc IDE LibreOffice Basic. Toto dialogové okno umožňuje výběr a úpravu jakéhokoliv dostupného makra LibreOffice Basic, ale ne makra v jiných jazycích.

Model komponent použitý v LibreOffice je znám jako Universal Network Objects nebo UNO. LibreOffice makra ve všech skriptovacích jazycích používají UNO runtime application programming interface (API). Rozhraní XSCRIPTCONTEXT je poskytováno skriptům maker ve všech čtyřech jazycích a poskytuje prostředek pro přístup k různým rozhraním, která mohou potřebovat k provedení nějaké akce v dokumentu.

Image3

Obrázek 21: Dialogové okno Výběr makra

Makra BeanShell

BeanShell je skriptovací jazyk podobný Java, který byl poprvé vydán v roce 1999.

Vybereme-li Nástroje > Makra > Správce maker > BeanShell z hlavní nabídky, program Calc zobrazí dialogové okno Makra BeanShell (obrázek 22).

Image4

Obrázek 22: Dialogové okno Makra BeanShell

Klepnutím na tlačítko Upravit v dialogovém okně Makra BeanShell otevřeme BeanShell Debug Window (obrázek 23).

Image5

Obrázek 23: BeanShell Debug Window

Výpis 10  je příklad makra BeanShell, které vkládá text „Hello World from BeanShell“ do buňky A1 aktivního sešitu Calc.

Výpis 10: Ukázkové makro BeanShell

 

import com.sun.star.uno.UnoRuntime;
import com.sun.star.sheet.XSpreadsheetView;
import com.sun.star.text.XText;

model = XSCRIPTCONTEXT.getDocument();

controller = model.getCurrentController();

view = UnoRuntime.queryInterface(XSpreadsheetView.class, controller);

sheet = view.getActiveSheet();

cell = sheet.getCellByPosition(0, 0);

cellText = UnoRuntime.queryInterface(XText.class, cell);

textCursor = cellText.createTextCursor();

cellText.insertString(textCursor, "Hello World from BeanShell", true);

return 0;

Makra JavaScript

JavaScript je skriptovací jazyk, který byl poprvé vydán v roce 1995.

Vybereme-li v hlavní nabídce Nástroje > Makra > Správce maker > JavaScript, program Calc zobrazí dialogové okno Makra JavaScript (obrázek 24).

Image6

Obrázek 24: Dialogové okno Makra JavaScript

Klepnutím na tlačítko Upravit v dialogovém okně Makra JavaScript otevřeme Rhino JavaScript Debugger (obrázek 25). Rhino je snadno použitelný open source engine JavaScriptu od nadace Mozilla Foundation a další informace najdeme na adrese https://github.com/mozilla/rhino.

Image7

Obrázek 25: Rhino JavaScript Debugger

Výpis 11 je příkladem JavaScript makra, které vloží text „Hello World from JavaScript“ do buňky A1 do prvního listu sešitu Calc.

Výpis 11: Ukázkové makro JavaScriptu

 

importClass(Packages.com.sun.star.uno.UnoRuntime);
importClass(Packages.com.sun.star.sheet.XSpreadsheetDocument);
importClass(Packages.com.sun.star.container.XIndexAccess);
importClass(Packages.com.sun.star.table.XCellRange);
importClass(Packages.com.sun.star.table.XCell);

documentRef = XSCRIPTCONTEXT.getDocument();

spreadsheetInterface = UnoRuntime.queryInterface(XSpreadsheetDocument, documentRef);

allSheets = UnoRuntime.queryInterface(XIndexAccess, spreadsheetInterface.getSheets());

theSheet = allSheets.getByIndex(0);

Cells = UnoRuntime.queryInterface(XCellRange,theSheet);

cellA1 = Cells.getCellByPosition(0,0);

theCell = UnoRuntime.queryInterface(XCell,cellA1);

theCell.setFormula("Hello World from JavaScript");

Makra Python

Python je univerzální skriptovací jazyk, který byl poprvé vydán v roce 1991. V posledních letech se těší stále větší oblibě a je běžně používán datovými vědci.

Vybereme-li Nástroje > Makra > Správce maker > Python z hlavní nabídky, program Calc zobrazí dialogové okno Makra Python (obrázek 26).

Image8

Obrázek 26: Dialogové okno Makra Python

Prostředí pro úpravy a ladění skriptů Python není v současné době integrováno do standardního uživatelského rozhraní LibreOffice. Nicméně můžeme upravovat Python skripty pomocí oblíbeného textového editoru nebo externího IDE. Rozšíření Alternative Python Script Organizer (APSO) usnadňuje editaci skriptů v Pythonu, zejména pokud jsou vložené do dokumentu. Pomocí APSO můžeme nastavit preferovaný editor zdrojového kódu, spuštění integrovaného Python shellu a ladění Python skriptů. Více informací nalezneme v systému LibreOffice nápovědy a v sekci Designing & Developing Python Applications na wiki The Document Foundation https://wiki.documentfoundation.org/Macros/Python_Design_Guide.

Výpis 12 je příkladem Python makra, které vloží text „Hello World from Python“ do buňky A1 do prvního listu sešitu Calc.

Výpis 12: Ukázkové makro Python

 

import uno

def HelloWorld():

    doc = XSCRIPTCONTEXT.getDocument()

    cell = doc.Sheets[0]['A1']

    cell.setString('Hello World from Python')

    return

Knihovna ScriptForge

Programátoři maker často potřebují provádět úlohy, jako je vytváření a otevírání souborů, přístup k ovládacím prvkům formulářů, čtení dat z databází vložených do dokumentů LibreOffice Base apod. Cílem knihovny ScriptForge je zjednodušit tvorbu maker tím, že usnadní provádění takových příkazů bez nutnosti učit se potřebná rozhraní API (Application Programming Interfaces) a příkazy LibreOffice, což může být pro příležitostné programátory obtížné.

Knihovna ScriptForge podporuje LibreOffice Basic i Python. Je uspořádána do sady služeb, z nichž každá poskytuje metody a vlastnosti související s určitým tématem. Například služba Dialog umožňuje přístup k dialogovým oknům dostupným ve skriptovacích modulech a služba Database umožňuje provádět příkazy SQL v dokumentech Base.

Kapitola 13, Začínáme s makry, příručky Začínáme s LibreOffice obsahuje další úvodní materiál o knihovně ScriptForge a jednoduchý příklad. Podrobnější informace a mnoho příkladů naleznete v nápovědě LibreOffice, když v rejstříku vyhledáme výraz „ScriptForge“.

Vestavěný inspektor objektů

LibreOffice má rozsáhlé rozhraní API (Application Programming Interface), které mohou programátoři maker využít k automatizaci téměř všech aspektů jeho aplikací. Jednou z hlavních výzev pro programátory je však zjištění typů objektů UNO (Universal Network Objects) a jejich podporovaných služeb, metod a vlastností.

Vestavěný inspektor objektů slouží vývojářům maker k prohlížení objektů a zjišťování, jak k nim lze přistupovat a jak je lze používat. Chceme-li se k tomuto nástroji dostat, zvolíme v hlavní nabídce Nástroje > Nástroje pro vývojáře a otevře se okno Inspektor objektů (obrázek 27). Ve výchozím nastavení je toto okno zakotveno v dolní části uživatelského rozhraní.

Levou část okna tvoří navigátor DOM (Document Object Model), který umožňuje uživateli procházet všechny objekty v dokumentu. Po výběru objektu se na kartách v pravé části okna zobrazí následující informace o objektu:

Namísto kontroly objektů pomocí Navigátoru DOM je možné kontrolovat přímo aktuálně vybraný objekt v dokumentu přepnutím tlačítka Aktuální výběr.

Image1Obrázek 27: Okno Inspektor objektů

Kapitola 13, Začínáme s makry, příručky Začínáme s LibreOffice obsahuje další informace o vestavěném inspektoru objektů. Podrobnější informace a příklady nalezneme v nápovědě LibreOffice po vyhledání výrazu „vývojové nástroje“ v rejstříku nápovědy.

Práce s makry VBA

Pro programátora Excel/VBA je LibreOffice Basic programovacím jazykem velmi podobným VBA. Primárním důvodem, proč VBA nefunguje v programu Calc, přestože Calc umí číst sešit aplikace Excel, je to, že Calc používá jiný mechanismus pro přístup ke komponentám pracovního sešitu "workbook" (v programu Calc se nazývá sešit), jako jsou buňky na listu "worksheet" (tzv. list "sheet" v Calc).  Konkrétně objekty, atributy a metody používají různé názvy a odpovídající chování se někdy mírně liší.

Chceme-li převést kód VBA, musíme nejprve načíst kód VBA v LibreOffice.

Načtení kódu VBA

Na stránce Vlastnosti VBA (Nástroje > Možnosti > Načítání/ukládání > Vlastnosti VBA) můžeme nastavit, zda se mají v dokumentech Microsoft Office, které otevíráme v LibreOffice, zachovat makra.

Image21

Obrázek 28: Volba Načítání/ukládání vlastností VBA

Pokud zaškrtneme Načíst kód Basic, umožníme tím v LibreOffice upravovat makra. Změněný kód se uloží v dokumentu ODF, ale nezachová se, pokud ho uložíme do formátu Microsoft Office.

Pokud zaškrtneme Uložit původní kód Basic, makra nebudou v LibreOffice spustitelná, budou však v nezměněné podobě ukládány do souborů ve formátech Microsoft Office.

Při importu souborů programů Microsoft Word nebo Excel, jejichž součástí je kód VBA, můžeme zaškrtnout možnost Spustitelný kód. Tento kód se obvykle jen uchovává, je však neaktivní (pokud kód zobrazíme pomocí Basic IDE, bude celý zakomentovaný). S touto možností bude kód spustitelný.

Možnost Uložit původní kód Basic má přednost před Načíst kód Basic. Pokud jsou zaškrtnuté obě možnosti a zakomentovaný kód upravíme, při ukládání do formátů Microsoft Office se uloží původní kód VBA.

Chceme-li si být jisti, že jsme odstranili možné makroviry z dokumentu Microsoft Office, zaškrtnutí Uložit původní kód Basic zrušíme. Dokument bude uložen bez kódu VBA.

Příkaz Option VBASupport

Příkaz Option VBASupport určuje, že LibreOffice Basic bude podporovat některé příkazy, funkce a objekty VBA. Tento příkaz musíme přidat před spustitelný kód v modulu.

Poznámka

Podpora VBA není úplná, ale pokrývá velkou část běžných způsobů použití.

Když je povolena volba VBASupport, argumenty funkce LibreOffice Basic a návratové hodnoty jsou stejné jako jejich protějšky VBA. Když je podpora VBA zakázána, mohou funkce LibreOffice Basic přijímat argumenty a vracet hodnoty odlišné od jejich protějšků VBA.

Výpis 13. Použití Option VBASupport

 

Option VBASupport 1
Sub Example
   
Dim sVar As Single
   
sVar = Worksheets("Sheet1").Range("A1")
   
Print sVar
End Sub

Bez deklarace Option VBASupport musí být kód ve výpise 13 konvertován na LibreOffice Basic, viz výpis 14.

Výpis 14. Konvertovaný VBA code

 

Sub Example
   
Dim sVar As Single
   
Dim oSheet as Object
   
Dim oCell as Object
   
' Worksheets(“Sheet1”).
   
oSheet = ThisComponent.getSheets().getByIndex(0)
   
' Range("A1")
   
oCell = oSheet.getCellByPosition(0, 0)
   
sVar = oCell.getValue()
   
Print sVar
End Sub

Option VBASupport může ovlivnit nebo pomoci v následujících situacích:

VBA UserForms (dialogová okna LibreOffice Basic)

V makrech se často objevují uživatelské formuláře (dialogy), které vyžadují vaši interakci a výběr parametrů. Fragment kódu níže je receptem na takové převody, které které nejsou zpracovány automaticky pomocí VBA.

Výpis 15. VBA zobrazí UserForm [Dialog] nazvaný “MyForm”

 

Sub MyProc
   
MyForm.Show
End Sub

Výpis 16: LibreOffice Basic zobrazí UserForm [Dialog] nazvaný “MyForm”

 

' oDlg by měl být viditelný na úrovni modulu
Dim oDlg As Object
Sub MyProc
   
DialogLibraries.LoadLibrary("Standard")
   
oDlg = CreateUnoDialog(DialogLibraries.Standard.MyForm)
   
oDlg.execute()
End Sub

Poznámka

Proměnná oDlg je viditelná na úrovni modulu pro všechny ostatní procedury, které přistupují k ovládacím prvkům dialogu. To znamená, že všechny postupy manipulující s ovládacími prvky na tomto dialogovém panelu nebo přistupující k nim jsou umístěny v jednom modulu.

Závěr

Tato kapitola poskytuje přehled o vytváření knihoven a modulů pomocí záznamníku maker, o používání maker jako funkcí Calc, psaní vlastních maker bez záznamníku maker a konverzi VBA na LibreOffice Basic. Každé téma si zaslouží alespoň jednu kapitolu a psaní vlastních maker pro Calc může snadno zaplnit celou knihu. Jinými slovy, toto je jen začátek toho, co se můžeme naučit.

Pokud již známe jazyk Basic (nebo jiný programovací jazyk), web LibreOffice Extensions obsahuje na adrese https://extensions.libreoffice.org/ sadu rychlých referenčních karet LibreOffice Basic. Ty lze rychle vyhledat výběrem filtrů Dokumentace a Makro

Další podrobnosti o makrech v Calcu lze získat v nápovědě LibreOffice (obecné informace najdeme vyhledáním hesla „makra“ v rejstříku, konkrétní informace o podpoře VBA najdeme vyhledáním hesla „podpora VBA“), na stránkách wiki nadace The Document Foundation (https://wiki.documentfoundation.org/Macros) a v dalších internetových zdrojích (například na webu https://ask.libreoffice.org/ Q&A>).

Obsah