Filtrování dat v buňkách

programovani.png V tomto díle si ukážeme další způsob práce s buňkami – filtrování pomocí makra. Programově můžete filtrovat stejně jako při volbě nabídky Data | Filtr | Automatický filtr, Standardní filtr a Pokročilý filtr .  

Filtr skryje buňky (řádky, sloupce), které nevyhovují zadaným podmínkám.

Filtrování buněk

Filtr nastavíte podobným způsobem, jako jste v minulém díle nastavovali řazení buněk. Nejprve nadefinujete podmínky, podle kterých se bude filtrovat. Dále nastavujete ostatní volby filtru a nakonec zadáte příkaz k provedení.

Můžete filtrovat celý list sešitu, nejčastěji ale budete filtrovat pouze určitou oblast. Příkaz k provedení filtru přiřadíte k proměnné listu nebo oblasti.

doc = thisComponent
list = doc.sheets(0)
oblast = list.getCellRangeByName("A2:B30")
rem definice podmínek a ostatní příkazy do proměnné prefiltruj
oblast.Filter(prefiltruj)

Podmínky filtru

Podmínku nastavujete pomocí pole vlastností definovaných jako

com.sun.star.sheet.TableFilterField.
dim podminka(0) as New com.sun.star.sheet.TableFilterField

Zde nastavujete oblast, ve které se nachází testovaný obsah, a podmínku filtrování.

podminka(0).Field = 0
podminka(0).Operator = com.sun.star.sheet.FilterOperator.EQUAL
podminka(0).IsNumeric = False
podminka(0).StringValue = "Praha 4"

Seznam pro filtrování Seznam pro filtrování

FIELD

V podmínce Field nastavíte sloupec (řádek), ve kterém se má vyhledat podmínka.

TIP: Stejně jako při řazení dat začíná číslování polí podle zadané podmínky. Tzn. při vybrané oblasti B2:D:20 je pole označené 0 sloupec B. Neplatí zde číslování od začátku listu (sloupce A).

podminka(0).Field = 0

OPERATOR

Tato podmínka určuje, jakým způsobem se budou hodnoty v poli vyhodnocovat. Zde máte na výběr z více možností. Všechny možnosti se definují ve struktuře com.sun.star.sheet.FilterOperator.

podminka(0).Operator = com.sun.star.sheet.FilterOperator.EQUAL

Hodnoty jsou následující:

EMPTY – je rovno, tj. ponechá prázdné (nevyplněné) hodnoty.

NOT_EMPTY – ponechá neprázdné hodnoty.

EQUAL – je rovno podmínce.

NOT_EQUAL – není rovno.

GREATER – je větší než podmínka.

GREATER_EQUAL – je větší než nebo rovno podmínce.

LESS – je menší než podmínka.

LESS_EQUAL – je menší nebo rovno

TOP_VALUES – ponechá nejvyšší hodnoty

BOTTOM_VALUES ponechá nejnižší hodnoty.

ISNUMERIC

Tato vlastnost určuje, zda je podmínka číselná, či nikoliv.

U textových podmínek nastavíte na False, u číselných na True. Od této vlastnosti se odvíjí další zadání podmínky.

podminka(0).IsNumeric = False

STRINGVALUE / NUMERICVALUE

Zde zadáváte podmínku jako text nebo číslo, podle toho, jakým způsobem jste definovali předchozí vlastnost. Jako všude platí, že textové podmínky uzavíráte do uvozovek, číselné zadáváte přímo.

podminka(0).StringValue = "Praha 4"

Výsledek filtru bez ostatních požadavků Výsledek filtru bez ostatních požadavků

CONNECTION

Pokud chcete filtrovat podle více podmínek, musíte také zadat, v jakém vztahu mají být podmínky vůči sobě. Zda mají platit společně, nebo nezávisle na sobě. Tento vztah nastavujete pomocí struktury com.sun.star.sheet.FilterConnection, a to zadáním AND, nebo OR.

podminka(0).Connection = com.sun.star.sheet.FilterConnection.AND

Při AND platí obě podmínky filtru společně – pokud filtrujete například určité datum a společně i jméno, pak zůstanou zobrazeny pouze buňky obsahující požadované datum a jméno zadané na stejném řádku. Naopak při OR se zobrazí jak buňky s daným datem, tak jména nezávisle na tom, na kterém řádku jsou napsána.

Další nastavení fitru

Máte nastaveny podmínky, za kterých bude makro filtrovat Dále vytvoříte pro filtrovanou oblast tzv. FilterDescriptor, do kterého vložíte tyto podmínky.

prefiltruj = oblast.createFilterDescriptor(True)
prefiltruj.setFilterFields(podminka())

Zde můžete nastavit další nastavení filtru:

Zkopírování výsledku

Jednoduše můžete nastavit zkopírování výsledku filtru do jiné oblasti. Zdrojová oblast tak zůstane nevyfiltrována.

prefiltruj.CopyOutputData = True
prefiltruj.OutputPosition = list.getCellRangeByName("B2").CellAddress

Takto jste nastavili, že chcete kopírovat výsledek filtru, a nastavili buňku B2 jako výchozí pro výsledek.

Zkopírování výsledku filtru do buňky Zkopírování výsledku filtru do buňky

Obsahuje záhlaví

Pokud vybraná oblast obsahuje záhlaví (pojmenování sloupců), můžete buď oblast definovat bez něj (prostě ho vynechat), nebo definujete, že oblast je i se záhlavím. To pak samozřejmě není obsahem filtru.

prefiltruj.ContainsHeader = True

Vynechat duplicity

Programový filtr poskytuje stejné možnosti jako ten klasický a nechybí ani možnost nezobrazení duplicitních hodnot. Makrem nastavíte velmi jednoduše:

prefiltruj.SkipDuplicates = True

Makro zobrazí vždy pouze jednu hodnotu z více stejných.

Zkopírování výsledku filtru bez duplikátů Zkopírování výsledku filtru bez duplikátů

Nakonec si zkuste sestavit celé makro, zde je kód pro nastavení filtru podle jedné podmínky se skrytím duplicitních údajů a zkopírováním výsledku do buňky B2.

Sub Filtr
doc = thisComponent
list = doc.sheets(0)
oblast = list.getCellRangeByName("A2:B30")
dim podminka(0) as New com.sun.star.sheet.TableFilterField
podminka(0).Field = 0
podminka(0).Operator = com.sun.star.sheet.FilterOperator.EQUAL
podminka(0).IsNumeric = False
podminka(0).StringValue = "Praha 4"
prefiltruj = oblast.createFilterDescriptor(True)
prefiltruj.setFilterFields(podminka())
prefiltruj.CopyOutputData = True
prefiltruj.OutputPosition = list.getCellRangeByName("B2").CellAddress
prefiltruj.SkipDuplicates = True
oblast.Filter(prefiltruj)
End Sub

Automatický filtr

Všechny výše uvedené příklady pracují jako standardní filtr. Jako poslední zbývá nastavení automatického filtru pro danou oblast. Tzn. nastavení filtru pro následné používání bez použití maker.

sub automaticky_filtr
doc = thisComponent
list = doc.sheets(0)
kfiltru = doc.DatabaseRanges
oblast = list.getCellRangeByName("A1:C8").getRangeAddress()
kfiltru.addNewByName("MujFiltr",oblast)' přidá databázovou oblast
kfiltru.getByName("MujFiltr").Autofilter = true ' nastaví filtr
' pro skrytí filtru změňte na false
kfiltru.removeByName("MujFiltr") ' odstraní přidanou oblast
end sub

Tento kód nastaví databázovou oblast pojmenovanou MujFiltr v buňkách A1:C8, následně přidá automatický filtr a oblast opět zruší. Filtr je připraven k použití.

V příštím díle se budeme věnovat způsobům kopírování buněk.

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

Komentáře

user avatar Ludvík
Odpovědět
Filtrování dat v buňkách
20. 04. 2014, 22:01:11
Jen taková blbina tady je chybka místo:
podminka(0).Connection = com.sun.star.sheet.FilterOperator.AND
má být
podminka(0).Connection = com.sun.star.sheet.FilterConnection.AND

Ono to v textu vlastně je, ale pak se do zápisu nějak vloudil ten operátor ...
user avatar Lukáš Jelínek
Odpovědět
Re:Filtrování dat v buňkách
21. 04. 2014, 12:52:22
Děkujeme za upozornění, už je to opraveno.

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