Řazení buněk dle obsahu
Když potřebujete automatizovaně setřídit oblast buněk, použijete následující postup.
K samotnému třídění slouží příkaz sort(podminka()). Příkaz vezme podmínky, podle kterých má třídit a provede ho. Podmínky udávají, podle kterého sloupce budete řadit a zda chcete řadit vzestupně, nebo sestupně. Podívejte se na praktický příklad, prozatím s řazením podle jednoho sloupce.
Podmínky jsou definovány v tridpodle(). Serad() pak přidá podmínky do příkazu sort. Makro seřadí aktuálně označenou oblast.
sub seradit dim tridpodle(0) as New com.sun.star.util.SortField dim serad(0) as New com.sun.star.beans.PropertyValue doc = thisComponent oblast = doc.currentSelection tridpodle(0).Field = 0 tridpodle(0).SortAscending = True serad(0).Name = "SortFields" serad(0).Value = tridpodle() oblast.sort(serad()) end sub
Proměnnou oblast můžete samozřejmě také určit přímo:
oblast = doc.sheets(0).getCellRangeByName("A2:C11")
Podle čeho řadíme
V tridpodle() nastavujete podmínky, podle kterých se má zdrojová oblast řadit. Jako první určujete pole. Vycházíte přitom z vlastností definovaných jako com.sun.star.util.SortField. Zde najdete následující možnosti nastavení.
Field – pole
Jednoduše nastavíte číslo sloupce.
tridpodle(0).Field = 0
UPOZORNĚNÍ: Příklady zde uvedené počítají s řazením od sloupce A (Field = 0). Platí, že pokud řadíte označenou oblast, nastavujete jako první sloupec vždy 0 (první sloupec oblasti). Zde neplatí číslování od začátku dokumentu, ale od prvního sloupce nastavené oblasti.
Seřazeno podle prvního sloupce
SortAscending – vzestupně, nebo sestupně
Nastavujete také, jak se mají data setřídit, zda od nejmenšího k největšímu, nebo naopak.
tridpodle(0).SortAscending = True
IsCaseSensitive – velká a malá písmena
Jako další můžete nastavit i to, zda má makro brát zřetel na velká a malá písmena (např. praha nebo Praha).
tridpodle(0).IsCaseSensitive = True
FieldType – čísla nebo text
Můžete nastavit, zda se má řadit podle čísel, textu nebo automaticky. Nastavení se skrývá ve struktuře com.sun.star.util.SortFieldType.
tridpodle(0).FieldType = com.sun.star.util.SortFieldType.NUMERIC
NUMERIC – řazení podle číselných hodnot (text jako 0)
ALPHANUMERIC – řazení abecedně
AUTOMATIC – automatický výběr druhu
TIP: Výchozí nastavení je AUTOMATIC, pokud nepotřebujete, nemusíte některé z vlastností definovat.
Ostatní nastavení řazení
Další nastavení realizujete za pomoci pole definovaného jako com.sun.star.sheet.PropertyValue. S touto definicí se setkáte často. Vždy zde nastavujete název a hodnotu vlastnosti (stejně jako v záznamníku maker)
Přiřazení nastavení filtru do podmínky příkazu
Máte definovány podmínky, za jakých chcete filtrovat, zbývá je přiřadit do
serad(1).Name = "SortFields" serad(1).Value = tridpodle()
Řazení bez záhlaví
Samozřejmě většina zdrojových dat obsahuje „záhlaví“, které nemá být setříděno. Pro vás to znamená buď omezit výběr pouze na data, nebo přidat záhlaví do podmínek řazení. To provedete následujícím způsobem:
serad(1).Name = "ContainsHeader" serad(1).Value = True
Kopírovat seřazená data
Další možností, kterou program poskytuje, je zkopírování seřazených výsledků do jiné oblasti. Zdrojová oblast tak zůstane v původním stavu a na místo, které určíte, se zkopírují seřazená data.
serad(2).Name = "CopyOutputData" ' kopírovat jinam? serad(2).Value = True ' ANO serad(3).Name = "OutputPosition" ' kopírovat kam serad(3).Value = list.getCellRangeByName("F1").CellAddress
Makro zkopíruje seřazená data do oblasti, která začíná v buňce F1.
Jako vždy platí, že nemusíte nastavovat ty vlastnosti, které jsou výchozí. Takže například pokud nenastavíte způsob řazení, bude výběr seřazen sestupně. Pokud nenadefinujete číslo sloupce, podle kterého se má řadit, proběhne seřazení podle prvního sloupce výběru. Zkuste schválně před obě podmínky tridpodle() přidat REM, čímž je označíte za komentář, a spusťte makro.
Řazení ve více sloupcích
Řadit v Calcu lze podle tří sloupců. Řazení makrem má stejné omezení, jen s tím rozdílem, že se na třídění může ihned navázat makro s dalšími podmínkami. Následujícím způsobem setřídíte zadanou oblast (obsahující záhlaví) podle tří sloupců.
tridpodle(0).Field = 0 ' sloupec A tridpodle(0).SortAscending = True tridpodle(1).Field = 1 ' sloupec B tridpodle(1).SortAscending = True tridpodle(2).Field = 2 ' sloupec C tridpodle(2).SortAscending = True serad(0).Name = "SortFields" serad(0).Value = tridpodle() serad(1).Name = "ContainsHeader" ' obsahuje záhlaví serad(1).Value = True
Řazení v tomto případě proběhne nejprve ve sloupci A, pak B a nakonec C. Pořadí sloupců můžete samozřejmě měnit.
Seřazeno podle sloupce A a B a C
Všimněte si změny v zadání oblasti k řazení. V prvním příkladu jste řadili aktuálně označenou oblast (currentSelection), v druhém jste oblast zadali přímo v makru. Řazení musí vždy proběhnout v označené oblasti, proto po zadání oblasti musíte tuto oblast označit. To jste učinili příkazem doc.CurrentController.select(oblast), zadání řazení je pak již stejné.
Změna orientace – sloupce a řádky
Stejně jako jste přidali definici o záhlaví oblasti, můžete změnit i orientaci řazení. Výchozí orientace řadí údaje v řádcích, toto můžete změnit a řadit po sloupcích:
serad(1).Name = "Orientation" serad(1).Value = com.sun.star.table.TableOrientation.COLUMNS ' nebo ROWS
Příkaz k provedení řazení
Pokud jste provedli veškerá nastavení, můžete dát příkaz k jejich řazení.
oblast.sort(serad())
A to je celé základní programové nastavení řazení. V příštím díle se naučíte, jakým způsobem se mohou filtrovat data v tabulce, včetně nastavení automatického filtru.