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










