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.

 
KARAT Software
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).

 

Public Relations

Seznamte se s českou doménou

Máte vlastní doménu nebo se chystáte ji zaregistrovat? Myslíte také na její důkladné a profesionální zabezpečení? Spojte se s profesionály.

Pokračování ...


 
 
woo jaw demo hz