Pokročilé vyhledávání buněk

calc.png V dnešním díle se vrátíme k buňkám sešitu a práci s nimi. Dozvíte se, jak je možné se v buňkách nebo oblastech pohybovat jiným způsobem než přímým zadáním adresy v kódu makra. Jako první se naučíte vyhledávat určitý druh buněk v definované oblasti.  

Metody k hledání v oblasti buněk

Níže uvedené metody vrací oblast buněk, která vyhovuje zadaným podmínkám. S těmito oblastmi (buňkami) můžeme nadále pracovat stejně jako při jejich standardním zadáním pomocí adresy nebo pozice. Pro využití těchto metod musíte v makru zadat adresu buněk, ve kterých po té bude toto vyhledávání probíhat.

Pro odzkoušení si připravte sešit s následující strukturou buněk:

ZOBRAZENÉ HODNOTY POUŽIT VZOREC =FORMULA(bunka)
  A B C D E F G H I
1 1 2 3 4   1 =A1+1 =B1+1 =C1+1
2 11 12 13 14   =A1+10 =A2+1 =B2+1 =C2+1
3                  
4 11 21 31 41   =A1&1 =B1&1 =C1&1 =D1&1
5 111 121 131 141   =A2&1 =B2&1 =C2&1 =D2&1
6                  
7 A #VALUE! #VALUE! #VALUE!   A =A7+1 =B7+1 =C7+1
8 s s s t   s s s s
9 s s t t   s s t t
10 s t t t   s t t =D9

Tabulka 1: Struktura buněk pro zkoušku maker

V levé části tabulky jsou hodnoty a v pravé části pomocí funkce sešitu FORMULA() vidíte použité vzorce a zopakovanou hodnotu nebo text tam, kde nejsou použity vzorce. Poté si definujte základní proměnné, které budete používat pro zkoušení:

doc = thisComponent
list = doc.currentController.getActivesheet
oblast = list.getCellRangeByName("A1:D10")
bunka = doc.currentSelection() 

Proměnná bunka je určena tak, aby stačilo přemístit výběr buňky myší nebo šipkami bez nutnosti zadávání adresy buňky.

Po vyhledání buněk nebo oblastí jsou tyto vráceny jako adresované buňky/oblasti. Můžete s nimi tedy nadále pracovat – například formátovat – stejně jako se standardně definovanou buňkou. Pro názorné předvedení je v příkladech použito obarvení pozadí buněk.

Vyhledání předchůdce

Pro vyhledání buněk, které jsou odkázány do zadané oblasti (buňky) použijte metodu:

queryPrecedents(True)

Předchůdci jsou všechny buňky, které ovlivňují zadanou proměnnou (oblast nebo buňku) a jsou umístěny ve stejném listu.

predchudce = bunka.queryPrecedents(True)
predchudce.CellBackColor = RGB(0,0,50)

Pro větší přehlednost je v použitém příkladu použito vyhledání předchůdců jedné buňky. Tato metoda vyhledá kromě předchůdců i buňku nebo oblast, která je použita k vyhledávání. Při použití oblasti je tedy vybrána celá oblast + případní předchůdci. Například při výběru jedné buňky B4 se označí její předchůdce – tedy buňka B1.

28_1_Vyhledani_predchozi_bunky_B4.png


Vyhledání následníka

Pro vyhledání buněk, které obsahují odkazy ze zadané oblasti (buňky), použijte metodu:

queryDependents(True)

Následníci jsou všechny buňky, které jsou ovlivněny zadanou proměnnou (oblastí nebo buňkou) a jsou umístěny ve stejném listu.

naslednik = bunka.queryDependents(True)
naslednik.CellBackColor = RGB(0,50,50)

Princip vyhledávání je stejný jako u předchůdců. Při výběru buňky C5 je vyhledán i následník buňka H5.

28_2 Vyhledani naslednika bunky C5.png

TIP: Podobnou funkci plní i funkce Detektiv, která je schopna najít předchůdce i následníky. Po nalezení je ale pouze označí šipkou a tyto buňky není možné přímo ovlivňovat.

Následující funkce jsou určené pro použití v oblastech.

Vyhledání viditelných buněk

Pro vyhledání buněk, které neobsahují žádná data, použijte metodu:

queryVisibleCells()

Pro odzkoušení funkčnosti si skryjte řádek 5 a sloupec C ve vzorovém příkladu.

viditelne = oblast.queryVisibleCells()
viditelne.CellBackColor = RGB(50,50,50)

Tento kód označí všechny neskryté buňky. Po zobrazení skrytých buněk je výsledek tento:

28_3 Vyhledani viditelnych bunek v oblasti.png


Vyhledání prázdných buněk

Pro vyhledání buněk, které neobsahují žádná data, použijte metodu:

queryEmptyCells()

Po spuštění kódu zůstanou označeny buňky v řádku 3 a 5 našeho příkladu:

viditelne = oblast.queryEmptyCells()
viditelne.CellBackColor = RGB(50,50,100)

Po spuštění jsou vybarveny neprázdné buňky A3:D3 a A6:D6.

28_4 Vyhledani prazdnzch bunek v oblasti.png


Vyhledání buněk podle obsahu

Pro vyhledání buněk podle obsahu použijte metodu:

queryContentCells(CellFlags)

CellFlags již znáte z dílu Základní práce s buňkami, kde jste se jejich pomocí naučili mazat jen určitý druh obsahu.

TIP: Pro zopakování, jsou možné tyto hodnoty 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.

obsahuje = oblast.queryContentCells(com.sun.star.sheet.CellFlags.STRING)
obsahuje.CellBackColor = RGB(50,100,100)

Tento kód označí všechny buňky v oblasti, které obsahují text nebo hodnotu. V použitém příkladu tedy buňky C7, A8:D9 a A10:C10.

28_5 Vyhledani bunek obsahujicich text v oblasti.png


Vyhledání buněk podle výsledku vzorce

Vzorce používané v Calcu vrací vždy hodnotu jako text, hodnotu, případně chybu. Pro jejich vyhledání použijete metodu:

queryFormulaCells()

Možnosti kódu jsou tyto:

vysledek_hodnota = oblast.queryFormulaCells(1) ' vyhledání výsledku jako hodnota (čísla)
vysledek_hodnota.CellBackColor = RGB(100,100,100)
vysledek_text = oblast.queryFormulaCells(2) ' text vyhledání výsledku jako textu
vysledek_text.CellBackColor = RGB(100,100,150)
vysledek_chyba = oblast.queryFormulaCells(4) ' vyhledání výsledku jako chyba
vysledek_chyba.CellBackColor = RGB(100,150,150)

Tento příklad označí šedou barvou buňky B1:D1 a A2:D2, kde vzorec vrací výsledek jako číslo, dále označí modře buňky A4:D5 a D10, ve kterých vzorec vrací výsledek jako text a nakonec buňky B7:D7, ve kterých vzorec vrací chybovou hlášku, označí zeleně.

28_6 Vyhledani bunek podle vysledku vzorce.png

TIP: Ve funkci queryFormulaCells() můžete pomocí funkce OR kombinovat více požadavků v jednom zadání. Pro vyhledání čísel a textu zadáte oblast.queryFormulaCells(1 or 2).


Vyhledávání rozdílů ve sloupci

Užitečnou metodou v některých případech je i metoda:

queryColumnDifferences(bunka.CellAddress)

Tato metoda vyhledá buňky v definované oblasti, které obsahují rozdílnou hodnotu než hodnota, která je v zadané buňce, přitom vyhledávání probíhá pouze ve sloupcích. Použitá oblast obsahuje 4 sloupce, metoda zjistí hodnotu ze stejného řádku, jaký má zadaná buňka ve všech sloupcích. Celkem tedy porovnává hodnoty 4 buněk ze stejného řádku, ale ve čtyřech sloupcích.

podle_sloupce = oblast.queryColumnDifferences(bunka.CellAddress)
podle_sloupce.CellBackColor = RGB(150,150,150)

Při vybrané buňce B9 zjistí hodnoty buněk z devátého řádku, tedy – s v sloupci A. Pokud sloupec A obsahuje buňky s rozdílnou hodnotou, jsou tyto buňky vráceny jako výsledek metody.

28_6 Vyhledavani rozdilu ve sloupcich oblasti.png


Vyhledávání rozdílů v řádku

Obdobným způsobem s naprosto rozdílným výsledkem lze vyhledávat i rozdíly po řádcích.

queryRowDifferences(bunka.CellAddress)

Princip vyhledávání je stejný, jen je aplikován na řádky. V použitém příkladu bude tedy probíhat vyhledávání hodnot 10 buněk ze stejného sloupce v deseti řádcích.

podle_radku = oblast.queryRowDifferences(bunka.CellAddress)
podle_radku.CellBackColor = RGB(150,150,200)

Při vybrané buňce B9 je výsledek naprosto rozdílný.

28_7 Vyhledavani rozdilu ve sloupcich oblasti.png


Vyhledání průniku dvou oblastí

Poslední metodou v tomto díle je:

queryIntersection(oblast2.RangeAddress)

Tato metoda vyhledá společné buňky dvou definovaných oblastí. Pro tento příklad je nutné definovat si druhou oblast.

oblast2 = list.getCellRangeByName("D4:H20")

Společné buňky proměnné oblastoblast2 jsou D4:D10. K jejich zjištění použijete metodu takto:

prunik_oblasti = oblast.queryIntersection(oblast2.RangeAddress)
prunik_oblasti.CellBackColor = RGB(150,200,200)

Očekávaný výsledek je označen světle modrou barvou.

28_8 Vyhledavani rozdilů v radcich oblasti.png


Příští díl se bude věnovat dalším možnostem, jak se můžete pohybovat v buňkách sešitu.

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

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