Základní práce s buňkami

programovani.png V minulém díle jste se naučili definovat buňky a vkládat do nich obsah, případně zjistit jeho typ. V tomto díle budeme pokračovat ve vysvětlení zbylých operací s buňkami, jako je vkládání, odstraňování a přesouvání. Naučíte se, jak vyhledat určitý obsah v buňce, jak ho smazat a provádět základní matematické operace.  

Vkládání buněk (oblastí)

V minulém díle jste poznali strukturu CellRangeAddress, která se skládá z určení listu, prvního a posledního řádku a sloupce. Tuto strukturu budete využívat i při následujících činnostech.

Nejprve je ale třeba si uvědomit rozdíl při vkládání a odstraňování buněk a řádků/sloupců. Pokud budete vkládat buňky, nevytvoříte nový řádek ani sloupec. Vložíte pouze definovanou část buněk, přičemž můžete programu říci, kam má přesunout buňky, které jsou na místě, kam vkládáte. K tomuto označení využijete strukturu com.sun.star.sheet.CellInsertMode.

Pro vklad jedné nebo více buněk je musíte zadefinovat. Můžete adresu rozepsat, jak jste to viděli v minulém díle, nebo stačí jednořádkový zápis, jak to vidíte o pár řádků níže. Příkazem RangeAddress na konci řádku předá makru adresu stejně jako rozepsaná deklarace (máte tam jak označení listu, tak řádků a sloupců).

sub vklad_bunky
list = thisComponent.sheets(0)
adresa_bunky = list.getCellByPosition(0,0,0,0).RangeAddress
list.insertCells(adresa_bunky, com.sun.star.sheet.CellInsertMode.DOWN)
end sub

Toto makro provede vložení buňky na pozici A1, s tím, že buňku či buňky, které se na dané pozici nachází, posune směrem dolů:

Rozsah buněk před vkladem buňky Rozsah buněk před vkladem buňky

Rozsah po vložení buňky A1 Rozsah po vložení buňky A1

Buňky vkládáte pomocí listů – list.insertCells, první údaj v závorce označuje místo, na které budete buňky vkládat (adresu), druhým určujete, co se má stát s buňkami, které se nachází na místě, kam vkládáte.

CellInsertMode struktura poskytuje tyto možnosti:

NONE – nepřesouváme,

RIGHT – doprava,

DOWN – dolů,

ROWS – posunout řádky,

COLUMNS – posunout sloupce.

Podobnou strukturu využijete i při opačném postupu, tedy při mazání buněk.

Odstranění buněk (oblastí)

Princip je zcela shodný. Jen prostředky se liší. Odstranění provedete pomocí list.removeRange a použijete strukturu: com.sun.star.sheet.CellDeleteMode. Tato struktura poskytuje následující:

NONE – nepřesouváme,

LEFT – doleva,

UP – nahoru,

ROWS – posunout řádky,

COLUMNS – posunout sloupce.

Zkuste odebrat buňky vložené předešlým příkladem a porovnejte si dokument před a po úpravě.

Na obrázku vidíte vzhled rozsahu buněk po odstranění oblasti A3:A5 s tím, že buňky jsou posunuty vlevo na místo odstraněných.

Změna rozsahu po odstranění buněk Změna rozsahu po odstranění buněk

Přesouvání a kopírování buněk (oblastí)

Obdobným způsobem budete přesouvat nebo kopírovat buňky. Zde je ovšem nutné zadávat o jeden adresní údaj navíc. Logicky nejprve musíte vědět, co chcete přesunout a kam.

sub vklad_bunky
list = thisComponent.sheets(0)
co = list.getCellByPosition(1, 1, 1, 1).RangeAddress
kam = list.getCellByPosition(5, 5).CellAddress
list.moveRange(kam , co)
end sub

Pro kopírování pouze změníte příkaz na list.CopyRange(kam, co).

UPOZORNĚNÍ: Nezaměňujte vkládání buněk se změnou jejich obsahu. Je např. jednodušší změnit hodnotu buňky jako takové než celou buňku vkládat a dávat jí novou hodnotu. Při vkládání buněk totiž musíte počítat s jejich posunem, který ho může provázet.

Vyzkoušejte si nejprve, co znamená vkládání buněk, standardní cestou v sešitu se všemi jeho možnostmi. To vám poskytne lepší představu, jak celý proces funguje.

Smazání obsahu

Obsah buňky nejjednodušeji odstraníte tak, že nahradíte její hodnotu prázdným řetězcem. V případě velkého počtu takových buněk tento postup již není vhodný (nezapomeňte, že každou buňku musíte definovat zvlášť). Znamená to, že tento postup použijete pro případ ojedinělého „mazání“ a nejlépe u buněk, které již máte v makru definované. Změna se neprojeví u všech ostatních vlastností buňky.

Pro všechny ostatní případy poskytuje program metodu ClearContents(flags). Pomocí ní odmazáváte obsah buněk (nebo jeho části) stejně jako po stisku tlačítka [DELETE] a výběru, co chcete mazat. Tento výběr musíte předat makrem:

maz = com.sun.star.sheet.CellFlags.VALUE 

VALUE – čísla,

DATETIME – čas, datum nebo obojí,

STRING – text,

ANNOTATION – poznámky (komentáře),

FORMULA – vzorce,

HARDATTR – formátování buněk,

STYLES – styly,

OBJECTS – objekty,

EDITATR – formátování písmen v jednotlivých buňkách (například barva písma…).

Málokdy budete mazat pouze jeden druh obsahu nebo vlastnost buňky. Většinou budete odmazávat čísla a text dohromady (případně i datum). Jak na to, ukazuje následující příklad. Použijte pomoc funkce With, urychlí to práci:

dim odstran as new com.sun.star.sheet.sheet.CellFlags
with odstran
 .VALUE + .STRING +.DATETIME
end with

V praxi:

sub maz
dim i as integer
listy = thisComponent.sheets()
for i = 0 to listy.count – 1
rozsah = listy(i).getCellRangeByName("K5:L15")
with com.sun.star.sheet.CellFlags
rozsah.ClearContents(.VALUE or .STRING)
end with
next i
end sub

Toto makro projde všechny listy v dokumentu a vymaže v oblasti K5:L15 všechny číselné a textové hodnoty.

Makro lze rozšířit tak, aby odmazávalo pouze neuzamčené buňky. Takové makro (ClearUnlockedCells) lze najít na stránkách p. Grafa. Makro zjistí pomocí výše uvedených metod první a poslední řádky/sloupce, využije cyklus FOR NEXT a projde buňku po buňce. U každé zjistí, zda je uzamčena (if bunka.isLocked = True then), a pokud není, vymaže její hodnotu.

Hledání v buňkách

V případě, že se nejedná o jedinou buňku, potřebujete mít způsob, který je bude schopen procházet. Například při vyhledávání přesné shody. Praktické využití si ukážeme na makru p. Pitonyaka uFindString, které jsem jen přeložil do češtiny:

sub hledej_hodnotu
rem co vlastně hledáme? 
najdi = inputbox ("Napište hledanou hodnotu, nebo text")
doc = thisComponent
list = doc.Sheets(0)' List1
oblast = doc.CurrentSelection.RangeAddress ' aktuální výběr, nebo zadáte rozsah buněk k prohledání
sradek = oblast.StartRow ' první řádek oblasti
ssloupec = oblast.StartColumn ' první sloupec
kradek = oblast.EndRow ' poslední řádek
ksloupec = oblast.EndColumn ' poslední sloupec
rem  pro všechny sloupce
For sloupec_bunky = ssloupec To ksloupec
For radek_bunky = sradek To kradek ' a všechny řádky
bunka = list.GetCellByPosition( sloupec_bunky, radek_bunky) ' projde jednotlivé buňky
nasel = bunka.String ' do nasel předá hodnotu buňky
If nasel = najdi then ' pokud souhlasí tak
print "OK" ' napíše OK
rem nebo přepsat, zformátovat … 
Exit sub ' končíme, pokud chceme najít pouze první hodnotu
End If
Next
Next
End sub

Z vybrané oblasti (označené například myší) – currentSelection – si makro zjistí první a poslední sloupce a řádky oblasti. Projde jednotlivé buňky a hledá přesnou shodu s proměnnou najdi. CurrentSelection můžete nahradit zadáním rozsahu přímo makrem. Například:

oblast=thisComponent.sheets(0).getCellRangeByName("A1:K50").RangeAddress

Počítání s buňkami

Ještě než ukončíme tento díl, ukážeme si další z užitečných vlastností, a to počítání s rozsahem buněk – tedy s jejich obsahem. Pokud jste někdy využívali výhod kontingenční tabulky, již jste s obdobou takového výpočtu přišli do styku. Výpočet probíhá se všemi buňkami výběru. Můžete použít následující funkce:

SUM – součet všech buněk oblasti,

COUNT – počet všech neprázdných buněk oblasti,

COUNTNUMS – počet všech buněk obsahujících čísla,

AVERAGE – průměr všech buněk oblasti,

MAX a MIN – maximální a minimální hodnota buněk oblasti,

PRODUCT – součin všech buněk v oblasti.

Jsou i další (VAR, VARP, STDEV a STDEVP) – jedná se o statistické funkce, a pokud nebudete programovat přímo makro pro statistiku, nebudete je potřebovat.

Praktické použití v makru:

doc = thisComponent
list = doc.sheets(0)
oblast = list.getCellRangeByName("A1:B10")
soucet=oblast.computeFunction(com.sun.star.sheet.GeneralFunction.SUM)
print soucet

Příštím díle budeme pokračovat řazením dat v buňkách.

(Jako ve škole) Průměr: 1,00 | Hodnotilo: 7
 

Přidat názor

 

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