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"
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ů
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
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ů
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.