Buňky – definice a vkládání obsahu

programovani.png Dá se říci, že buňky jsou poslední základní součást sešitu. K buňkám přistupujte jako k objektům a vždy je takto definujte. Ukážeme si, jak získat přístup k jednotlivým buňkám i k oblastem (výběru buněk). Zjistíte, jak měnit jejich obsah, přebírat hodnoty do makra, měnit jejich formát apod.  

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

Výsledek makra (cyklu) Výsledek makra (cyklu)

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

(Jako ve škole) Průměr: 1.08 | Hodnotilo: 13
 

Komentáře

user avatar Peter
Odpovědět
Buňky – definice a vkládání obsahu
27. 12. 2012, 16:34:03
Vážený pán Sedláček,
chcel by som sa Vám poďakovať za Vaše príspevky.
Som rás že existujú ľudia, ktorý sú ochotný ostatným pomôcť.
Verím že Vaše články budú naďalej pokračovať.

Ďakujem
user avatar Daniel Sedláček
Odpovědět
Re:Buňky – definice a vkládání obsahu
27. 12. 2012, 20:49:54
Děkuji za uznání,
jsem rád že jsou články užitečné. Jak říká klasik "Jeden rád pomůže".
Připraveno je dalších 7 dílů a mám ještě pár tipů na další, takže dokud bude zájem, tak seriál určitě nekončí.


;o)
user avatar Petr Valach
Odpovědět
Re:Buňky – definice a vkládání obsahu
28. 12. 2012, 03:33:43
Připojuji se k poděkování. Bohužel ale upřímně řečeno tohle je vyšší dívčí a zatím míří do šuplíku. Dobrou zprávou je, že v souvislosti s mou činností v práci půjdou hned v lednu ven :-))

Děkuju vám. Nahrazujete tak můj určitý výpadek.
user avatar Dawe
Odpovědět
Buňky – definice a vkládání obsahu
1. 10. 2017, 19:41:49
Díky a respekt
user avatar Zdeněk Bláha
Odpovědět
Buňky – definice a vkládání obsahu
3. 12. 2022, 12:07:03
Díky za článek, jenom bych si dovolil upozornit na nepřesnost v definicích, chvíli mi trvalo než jsem pochopil proč mi to nefunguje. Třeba tato poznámka pomůže.
Jde o rozdíl v adresování jedné buňky a rozsahu buněk:
bunka = list.getCellByName("A1")
vyber = list.getCellRangeByName("A1:D4")
to samé lze dělat pomocí pozice
bunka = list.getCellByPosition(1, 1) ' B2
vyber = list.getCellRangeByPosition(0,0,12,16)
Tato nepřesnost v počáteční definici, že je tam potřeba použít jinou metodu pro range, se objevuje i nadále v textu. Možná to v roce 2012,kdy byl tento článek publikován, bylo jedno, ale v roce 2022 už to jedno není a je třeba rozlišovat, jestli chceme get pro jednu cell-bunku nebo get pro range of cells .

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.

 
Daniel Sedláček

Daniel Sedláček

Amatérsky se věnuji programování maker od podzimu 2010.
Aktivní jsem na fóru od ledna 2011.
Od července 2011 spolupracuji i jako moderátor fóra.

Využívám pouze OpenOffice.org (LibreOffice nemám nainstalován).

 
 
 
woo jaw demo hz