Řazení dat v buňkách

programovani.png Řazení dat je velmi používanou funkcí Calcu. V případech, kdy potřebujete například opakovaně setřídit tabulku podle určitých kritérií, provést další operace s tabulkou (například tisk), tak je ruční nastavování tabulky velmi pracné a zdlouhavé. Makro tyto operace zvládne během vteřiny.   

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

Zdroj dat k seřazení Zdroj dat k seřazení

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

Seřazeno do určené oblasti Seřazeno do určené oblasti

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

(Jako ve škole) Průměr: 1.00 | Hodnotilo: 7
 

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