Buňky
K buňkám si získáte přístup přes dokument a list. Následně definujete buňky, které chcete ovládat. Tuto definici můžete provést buď jejich pojmenováním, nebo určením jejich pozice. Definovat tak můžete jednu buňku, nebo větší rozsah.
Předpokládejme, že pro všechny následující příklady máte dokument doc a pracujete s prvním listem. Pro zopakování tedy:
doc = thisComponent list = doc.sheets(0)
Definice dle názvu
bunka = list.getCellRangeByName("A1") vyber = list.getCellRangeByName("A1:D4")
Vidíte, že definice buňky nebo rozsahu je stejná jako v sešitu. To proto, že označení buněk zadáváte jako text.
Definice dle pozice
bunka = list.getCellByPosition(1, 1) ' B2
Tento zápis vychází ze struktury .CellAddres, kde definujete list, sloupec a řádek.
Dim bunka as New com.sun.star.Table.CellAdress with bunka .sheet = list .column = 1 .row = 1 end with
A zkrácený zápis struktury:
bunka = list.getCellByPosition(1,1).CellAddress
TIP: Funkce With je velmi užitečný nástroj tam, kde chcete měnit více vlastností u jedné proměnné. Její výhoda je v tom, že proměnnou nemusíte zapisovat stále dokola. Na začátku napíšete with promenna a na konci end With. Vše mezi tímto zápisem se týká proměnné a již ji neopakujete, stačí zápis například .sheet. Standardně zapisujete bunka.sheet jednotlivě pro každý příkaz.
A pro více buněk:
vyber = list.getCellByPosition(0,0,3,3) 'A1:D4
Nezapomeňte, že číslování v Basicu začíná vždy 0.
Definice výběru vychází ze struktury – CellRangeAddress
dim vyber as New com.sun.star.table.CellRangeAddress
kde je nutné definovat:
with vyber .Sheet = list .StartColumn = 0 ' první sloupec .StartRow = 0 ' první řádek< .EndColumn = 3 ' poslední sloupec .EndRow = 3 ' poslední řádek end with
Je ale lepší zkrácený zápis:
vyber = list.getCellByPosition(0,0,3,3).RangeAddress
Pomocí takového zápisu můžete například zjistit a používat rozsah z označené oblasti dokumentu. S oblastí pak můžete pracovat jako se „samostatným“ objektem. Tedy tam, kde dopředu neznáte počet sloupců a řádků, které bude makro používat, a nemůžete je tedy definovat. Například tehdy, kdy má makro fungovat v označených (vybraných) buňkách. Následující příklad ukáže, jakým způsobem použijete právě takový výběr v makru.
Sub zjisti_oblast doc = thisComponent list = doc.sheets(0) vyber = list.getCurrentSelection.RangeAddress prvni_radek = vyber.StartRow prvni_sloupec = vyber.StartColumn posl_radek = vyber.EndRow posl_sloupec = vyber.EndColumn< print "Označena oblast " + prvni_radek + prvni_sloupec + posl_radek + posl_sloupec end sub
Čtvrtý řádek je důležitý: na listu jste si přiřadili současný výběr (označení – getCurrentSelection) a definovali ho jako RangeAddress. Tímto jste si zpřístupnili možnost zjištění začátku a konce oblasti. Očividně je definice podle názvu buňky jednodušší, občas ale potřebujete vkládat obsah jinam (například na další řádek...) a tehdy použijete definici podle pozice. Výhodou takové definice je také to, že můžete čísla v definici nahradit proměnnými. Není problém pak takovou buňku zařadit do cyklu. Například:
sub secti dim i as integer for i = 0 to 99 bunka = thisComponent.sheets(0).GetCellByPosition(0,i) bunka.value = i + 1 next i end sub
Makro bude sčítat + 1 na řádcích do 100. Stejně tak můžete vložit proměnnou i do sloupce. Nebo můžete chtít sčítat jen na sudých řádcích:
if i MOD 2 <> 0 then bunka = thisComponent.sheets(0).GetCellByPosition(0,i) endif< bunka.value i + 1
Výsledek makra na sudých řádcích
MOD 2 zjistí zbytek po dělení (pokud je zbytek 0, je řádek lichý; pozor opět na číslování od 0).
Tady to již začíná být zajímavé.
Procházení buňkami
Definici podle pozice využijete také při procházení buňkami. Proč je ale chtít procházet? Např. budete chtít jednu po druhé naformátovat, zjistit jejich obsah nebo ho naopak zadat... Tedy nejprve k tomu, co vlastně buňky obsahují, mohou obsahovat a jak to zjistit.
Obsah buněk – vložení obsahu
Buňky mohou obsahovat tři základní hodnoty, a to je – text, číslo a vzorec. K jejich obsahu se dostaneme následujícím způsobem:
Text
promenna = bunka.string ' promenna přebere hodnotu buňky bunka.string = promenna ' buňka přebere hodnotu promenna bunka.string = "Ahoj" ' obsah buňky je Ahoj bunka.string = 1 ' obsah buňky je 1 naformátovaný jako Text
Čísla
promenna = bunka.value bunka.value = promenna bunka.value = "Ahoj" ' obsah buňky je 0 – číselná hodnota textu bunka.value = 1 ' obsah buňky je 1 jako číslo
Vzorec
bunka.formula = "=A1+A2"
TIP: Nezapomínejte, že pokud budete prostřednictvím makra vkládat vzorec (.formula), musíte do jeho definice uvést rovnítko ("=A1+A2"). Jinak bude vzorec akceptován jako hodnota.
Zobrazení vložených hodnot makrem
Zde dávejte pozor, jak máte „naformátované“ buňky (jaký typ hodnoty máte zadaný), ze kterých si má vzít vzorec hodnotu. Zkuste následující příklad na ukázku, jak formátování funguje.
sub secti doc = thisComponent list = doc.sheets(0) a = list.getCellRangeByName("A1").string ' v A1 máme 1 b = list.getCellRangeByName("A1").value ' v A1 máme 1 c = list.getCellRangeByName("A2").value ' v A2 máme 1 print b + c print a + c end sub
První výsledek spojuje, tj. sčítá dvě čísla (.value), tedy = 2. Druhý výsledek spojuje (nesčítá) hodnotu v A1 jednou jako text (.string) a jako číslo (.value), výsledkem je tedy 11. Pokud tedy do C1 makrem vložíte vzorec = A1+A2, počítejte s tím, že musíte správně naformátovat obsah buněk tak, abyste se dočkali žádaného výsledku.
Obsah buněk – zjištění typu
Pokud si nejste jisti, jaký druh hodnoty buňka obsahuje, můžete to zjistit pomocí funkce Type, která vrací druh hodnoty z následujícího výběru (com.sun.star.table.CellContentType).
Bunka = list.getCellRangeByName("A1") select case bunka.Type case com.sun.star.table.CellContentType.VALUE print "Obsahuje číslo" case com.sun.star.table.CellContentType.TEXT print "Obsahuje text" case com.sun.star.table.CellContentType.FORMULA print "Obsahuje vzorec" case com.sun.star.table.CellContentType.EMPTY print "Je prázdná" end select
Namísto příkazu print si vložíte své příkazy.