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.
user avatar Michal Šťastný
Odpovědět
Re:Re:Filtrování dat v buňkách
25. 01. 2017, 15:21:23
Dobrý den,
Nejsem programátor, nicméně umím si makra najít a použít.
Potřeboval bych pomoc, upravit makro tak abych nemusel podmínku, ve vašem případě "Praha 4" vkládat do makra, ale brat si hodnotu z buňky listu. Potřebuji často měnit podmínku a je komplikované ji měnit v makru.

Děkuji.

Michal Šťastný
user avatar neutr
Odpovědět
Re:Re:Re:Filtrování dat v buňkách
25. 01. 2017, 19:48:50
Autor Dan Sedláček z nějakého důvodu přestal fungovat takže doporučuji obrátit se na fórum.

Vy tady sice uvádíte svůj email a je možné Vám odepsat - ale tohle může a také asi někdy bude zajímat další uživatele.

Takže doporučuji otevřít na fóru nové téma a upřesnit. Zatím to vypadá že byste chtěl iterovat (nebo nějak sofistikovaně procházet) buňky.

Nejspíš Vás bude zajímat funkce která by se zadávala jako vzorec v sešitě. Pokud ovšem chcete takto obsluhovat sady hesel - pak by to chtělo něco jiného.

- Například zadat úsek s hesely kterých může být poměrně mnoho a odsouhlasovat heslo po heslu.
- Nebo zadat vlastní úsek a zadat pro následné dávkové vyhledávání.

Prostě přihlašte se jako uživatel (pokud už nejste registrován), otevřete nové téma popište co nejpřesněji jak by to mělo vypadat. K tomu byste měl připsat odkaz na toto téma a podobné věci ze kterých bude zřejmé že nejste úplný začátečník a podobné údaje.
user avatar lp.
Odpovědět
Filtrování dat v buňkách
26. 01. 2017, 12:35:08
Použijte pokročilý filtr.

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