Nápověda Excelu k tématu řazení stojí za starou bačkoru. Velmi strohé informace jsem našel na stránce SharePointu a Excel Services.



Podobné dokumenty
Empty, Null, Nothing, Missing, prázdný řetězec a buňka

Skripta ke školení. Základy VBA. vypracoval: Tomáš Herout. tel:

Pole a kolekce. v C#, Javě a C++

JAK DEFINOVAT PRAVIDLO PRO VÍCE BUNĚK NARÁZ

Cvičné příklady Hodina 8 Cvičný 1

Generátor list nastavení

Odstavení automatického zpracování hypertextových odkazů

VÝŘEZ OBLASTI BUNĚK VZORCEM

Odstranění řádků (na základě hodnoty)

IB111 Úvod do programování skrze Python

5a. Makra Visual Basic pro Microsoft Escel. Vytvořil Institut biostatistiky a analýz, Masarykova univerzita J. Kalina

Jak definovat pravidlo pro více buněk naráz

Pole jinak ArrayList ve VBA

Algoritmizace prostorových úloh

Spojování textových řetězců na listu

Aplikovaná informatika. Podklady předmětu Aplikovaná informatika pro akademický rok 2006/2007 Radim Farana. Obsah. Obsah předmětu

Databáze v Excelu EU peníze středním školám Didaktický učební materiál

Tabulkový procesor. Základní rysy

Parsování HTML. Pro účely testování jsem vytvořil stránku parsovani.html. Zdrojový kód:

OBSAH Úvod do VBA... 6 K čemu VBA... 6 Když VBA nestačí... 6 Historie Visual Basicu... 7 Objektový model, vlastnosti, metody, události a funkce...

Řazení řádků ve vzestupném pořadí (A až Z nebo 0 až 9) nebo sestupném pořadí (Z až A nebo 9 až 0)

Microsoft Office. Excel vyhledávací funkce

DUM 07 téma: Proměnné, konstanty a pohyb po buňkách ve VBA

Maturitní otázky z předmětu PROGRAMOVÁNÍ

4a. Makra Visual Basic pro Microsoft Excel Cyklické odkazy a iterace Makra funkce a metody

Tabulka aneb Seznam čili ListObject

Poslední nenulová číslice faktoriálu

Třídění a vyhledávání Searching and sorting

- znakové konstanty v apostrofech, např. a, +, (znak mezera) - proměnná zabírá 1 byte, obsahuje kód příslušného znaku

Algoritmizace řazení Bubble Sort

Inovace a zkvalitnění výuky prostřednictvím ICT Základy programování a algoritmizace úloh Třídění dat. Ing. Hodál Jaroslav, Ph.D. VY_32_INOVACE_26 04

Registrační číslo projektu: CZ.1.07/1.5.00/ Elektronická podpora zkvalitnění výuky CZ.1.07 Vzděláním pro konkurenceschopnost

Test z programování v jazyce VBA v rámci předmětu Počítače II Vzorová zadání a vypracování

Článek je napsán pro českou verzi Excelu 2010, ale věřím, že i v jných verzích si dovedete poradit.

DATABÁZE A SYSTÉMY PRO UCHOVÁNÍ DAT 61 DATABÁZE - ACCESS. (příprava k vykonání testu ECDL Modul 5 Databáze a systémy pro zpracování dat)

Tabulka obsluhovaná kódem VBA

10 Algoritmizace Příklad 2 Word 2007/ VBA

Na chvilku se vžijte do situace, kdy pořádáte jednodenní konferenci a potřebujete naplánovat jednotlivé přednášky včetně přestávek.

Textové, datumové a časové funkce

Čtvrtek 8. prosince. Pascal - opakování základů. Struktura programu:

Efektivní práce s Excelem (středně pokročilí uživatelé)

8 Makra Příklad 4 Excel 2007

Pozn č. 1: Matematickým ekvivalentem pro pravdivostní hodnotu True je ve Visual Basicu -1 (autora bych škrtil a topil).

IB111 Úvod do programování skrze Python

Tabulkový procesor otázka č.17

Pascal. Katedra aplikované kybernetiky. Ing. Miroslav Vavroušek. Verze 7

FUNKCE 3. Autor: Mgr. Dana Kaprálová. Datum (období) tvorby: září, říjen Ročník: sedmý. Vzdělávací oblast: Informatika a výpočetní technika

Sada 2 - MS Office, Excel

Vlastní formát buňky. Vytvoření nebo odstranění vlastního formátu čísla

IAJCE Přednáška č. 9. int[] pole = new int[pocet] int max = pole[0]; int id; for(int i =1; i< pole.length; i++) { // nikoli 0 if (Pole[i] > max) {

Sada 1 - Základy programování

Pokud Windows 8 nemáte, můžete si situaci nasimulovat i ve Windows 7 a starších.

MS Excel makra a VBA

Slíbená princezna. Univerzální ComboBox

Gymnázium Vysoké Mýto nám. Vaňorného 163, Vysoké Mýto

Čtvrtek 3. listopadu. Makra v Excelu. Obecná definice makra: Spouštění makra: Druhy maker, způsoby tvorby a jejich ukládání

Visual Basic for Applications

DUM 06 téma: Tvorba makra pomocí VBA

A4B33ALG 2010/05 ALG 07. Selection sort (Select sort) Insertion sort (Insert sort) Bubble sort deprecated. Quicksort.

Gymnázium Vysoké Mýto nám. Vaňorného 163, Vysoké Mýto

Hromadná změna datumu a času v buňkách

Na úvod tip, jak kontrolovat šířku tabulky před a po změně. Chování makra ukazují obrázky. Jak změnit rastr v hotové tabulce Excelu

Rekurze a rychlé třídění

NPRG030 Programování I, 2018/19 1 / :03:07

Marek Laurenčík. Excel. práce s databázemi a kontingenčními tabulkami

Select sort: krok 1: krok 2: krok 3: atd. celkem porovnání. výběr nejmenšího klíče z n prvků vyžaduje 1 porovnání

Střední průmyslová škola strojnická Olomouc, tř.17. listopadu 49

Porovnání dvou seznamů

Níže uvedená tabulka obsahuje technické údaje a omezení aplikace Excel (viz také článek Technické údaje a omezení aplikace Excel (2007).

MS Excel Základy maker. Operační program Vzdělávání pro konkurenceschopnost. Projekt Zvyšování IT gramotnosti zaměstnanců vybraných fakult MU

DUM 01 téma: Obecné vlastnosti tabulkového editoru, rozsah, zápis do buňky, klávesové zkratky

VISUAL BASIC. Práce se soubory

KAPITOLA 11 - POKROČILÁ PRÁCE S TABULKOVÝM PROCESOREM

Použijeme-li prostorový typ grafu, můžeme pro každou datovou zvolit jiný tvar. Označíme datovou řadu, zvolíme Formát datové řady - Obrazec

Výběr složek a souborů ve VBA

Obsah. Základy práce s databází 13. Tabulky 43. Obsah. Úvod 9 Poděkování 12

Dialog Vzhled stránky

Tematický celek Proměnné. Proměnné slouží k dočasnému uchovávání hodnot během provádění aplikace Deklarace proměnných

Tematický celek 03 - Cvičné příklady

1.1 Struktura programu v Pascalu Vstup a výstup Operátory a některé matematické funkce 5

for (int i = 0; i < sizeof(hodnoty) / sizeof(int); i++) { cout<<hodonoty[i]<< endl; } cin.get(); return 0; }

Dynamické datové struktury III.

Skripty základy VB, vestavěné objekty, příklady

Spuštění a ukončení databázové aplikace Access

Informatika Datové formáty

Marek Laurenčík. Excel. práce s databázemi a kontingenčními tabulkami

ALG 09. Radix sort (přihrádkové řazení) Counting sort. Přehled asymptotických rychlostí jednotlivých řazení. Ilustrační experiment řazení

První cestou, jak vynechat jakákoliv data v grafu, je jejich skrytí, ať už přímo či filtrem aplikovaným na řádcích.

Úvodní příručka. Získání nápovědy Kliknutím na otazník přejděte na obsah nápovědy.

ALG 14. Vícedimenzionální data. Řazení vícedimenzionálních dat. Experimentální porovnání řadících algoritmů na vícedimenzionálních datech

Dnešní téma. Oblasti standardizace v ICT. Oblasti standardizace v ICT. Oblasti standardizace v ICT

Test z programování v jazyce VBA v rámci předmětu Počítače II Vzorová zadání a vypracování

Zdokonalování gramotnosti v oblasti ICT. Kurz MS Excel kurz 3. Inovace a modernizace studijních oborů FSpS (IMPACT) CZ.1.07/2.2.00/28.

Zadání: TÉMA: Zápis algoritmu, čtení textového souboru, porovnání řetězců.

Úvod do programování 6. hodina

1. D Y N A M I C K É DAT O V É STRUKTUR Y

Excel - pokračování. Př. Porovnání cestovních kanceláří ohraničení tabulky, úprava šířky sloupců, sestrojení grafu

KAPITOLA 9 - POKROČILÁ PRÁCE S TABULKOVÝM PROCESOREM

Pracovní sešit MS Word pokročilý

Rotace, transpozice a zrcadlení matice hodnot

Transkript:

Na úvod dva pojmy třídění a řazení. Správnější je řazení. Ve skutečnosti netřídíme data do nějakých skupin (tříd), ale jde nám o stanovení pořadí. Oba pojmy jsou ovšem natolik zažité, že není velkou chybou mluvit o třídících algoritmech a setřídění. Co pořadí definuje? U čísel je to samozřejmě jejich velikost, tj. umístění na číselné ose. A co určuje pořadí textových řetězců? Textový řetězec sestává z jednotlivých znaků, takže by se dalo čekat, že Excel bere znak po znaku a porovnává jejich pořadí v tabulce ASCII (ANSI). Nicméně jazykové sady obsahují i některé výjimky. V naší abecedě k nim patří spojení znaků c a h coby písmeno ch. Ale od začátku Nápověda Excelu k tématu řazení stojí za starou bačkoru. Velmi strohé informace jsem našel na stránce SharePointu a Excel Services. Ani odtud se toho bohužel moc nedozvíme ve vztahu k české lokalizaci Excelu. Lepším zdrojem informací je web Charlese Williamse. Vzal jsem znaky české kódové stránky Windows 1250 a vložil je do Excelu, následně přihodil do kotle chybové a pravdivostní hodnoty, prázdnou buňku, prázdný řetězec, apostrof, datumy, časy a další data, a začal experimentovat. První na ráně je karta Data a nástroje skupiny Seřadit a filtrovat. Výsledek řazení A-Z ukazuje obrázek (přeuspořádáno z důvodu úspory místa, čtěte zleva doprava a dolů jako v knize). Vzestupné řazení na listu Data / Seřadit Z obrázku můžeme vysledovat následující: První se řadí čísla, mezi něž patří i zmíněný datum a čas (interně vyjádřené celým číslem či zlomkem). Za nimi se objevují na oko prázdné buňky prázdný řetězec ("") a apostrof (', jako formátovací znak viditelný pouze v řádku vzorců). Následuje viditelný apostrof, pomlčky, oba typy mezery a řada symbolů. Až poté se objevují znaky abecedy. A tady se na chvilku zastavíme. Nástroje ve skupině Seřadit a filtrovat běžně nerozlišují velikost písmen (A = a, což odpovídá textovému porovnávání) a pracují v duchu stabilního řazení, tj. nemění původní vzájemné pořadí položek se stejným klíčem. Toto chování lze ovlivnit pod tlačítkem Seřadit / Možnosti / Rozlišovat malá a velká Excelplus.NET 1

(A-Z: a < A, e < ë < é < ě, ch < Ch < CH, u < ü < ű < ú < ů). Seřadit rozlišování velikosti písmen Písmeno ch se začlení správně v souladu s českou abecedou (řazení se řídí tzv. collating sequence ), nicméně posloupnost dvojice velké-malé písmeno není dodržena. Na konci seznamu najdeme pravdivostní hodnoty (NEPRAVDA < PRAVDA, v logice 0 < 1, nikoli N < P), chybové hodnoty (neřadí se podle názvu, jsou si rovnocenné, vztahuje se na ně pravidlo stabilního řazení) a jako úplně poslední se objeví skutečně prázdná buňka (bude vždy poslední bez ohledu na řazení A-Z, Z-A). Co prostý test rovnosti obsahu dvou buněk? Nyní porovnáme dříve testované hodnoty vůči sobě v prostém vzorci. V tomto případě na rozdíl od předchozího Excel nerozlišuje velikost písmen (bez ohledu na užití funkce STEJNÉ), a zrovna tak nevidí rozdíl u prázdných buněk (prázdná, prázdný řetězec, formátovací apostrof). Písmeno ch respektuje českou abecedu. Jak je tomu ve VBA? Pro porovnávání řetězců slouží vestavěná funkce StrComp, která nabízí porovnání binární a textové. Nechová se bohužel ve všech případech stejně jako řazení na listu. 'Option Compare Text Sub TestStrCompare() Dim stra As String Dim strb As String Excelplus.NET 2

Dim intsrovnani As Integer 'StrComp 'vbusecompareoption... nastavení se řídí Option Compare v úvodu modulu 'vbbinarycompare... binární porovnávání (a < á, A < a) 'vbtextcompare... textové porovnávání (a < á, a = A, tj. nerozlišuje velikost písmen) 'vbdatabasecompare... pouze pro Microsoft Access, řídí se nastavením databáze) 'výsledek intsrovnani '-1... stra < strb ' 0... stra = strb ' 1... stra > strb stra = "a" strb = "A" '1 intsrovnani = StrComp(strA, strb, vbbinarycompare) '0 intsrovnani = StrComp(strA, strb, vbtextcompare) stra = "a" strb = "á" '-1 intsrovnani = StrComp(strA, strb, vbbinarycompare) '-1 intsrovnani = StrComp(strA, strb, vbtextcompare) stra = "ci" strb = "ch" '1, nerespektuje českou abecedu ("collating sequence") 'tj. neodpovídá řazení na listu intsrovnani = StrComp(strA, strb, vbbinarycompare) '-1 intsrovnani = StrComp(strA, strb, vbtextcompare) stra = "ch" strb = "Ch" '1, neodpovídá řazení na listu pro tento znak Excelplus.NET 3

'ale je v souladu s ostatním řazením na listu (A < a) intsrovnani = StrComp(strA, strb, vbbinarycompare) '0 intsrovnani = StrComp(strA, strb, vbtextcompare) A jak ve VBA vlastně provádět řazení? Nejčastěji ho potřebujeme uskutečnit na poli hodnot. Jenže samotné VBA pro tyto účely nenabízí zhola nic. Možná i vy jste se prokousávali teorií, studovali Bubble Sort, Merge Sort, Counting Sort, Selection Sort a nakonec našli algoritmického vítěze rekurzivní verzi Quick Sortu. Nejedná se o ovšem o stabilní řazení (položky se stejným klíčem se mohou prohodit), a pokud u textových řetězců používá prostý test (<, >, =), pak jeho aplikování na češtině nedopadne dobře (C < Ch < c < ch < ci < č). Sub TrideniQuickSortTest() Dim Pole1() Dim Pole2() Pole1 = Array(10, 2, 15, 125, 26, 18, 33, 35, 26, 51, 106) Pole2 = Array("Gates", "gates", "Windows", "Office", "windows") QuickSort Pole1, LBound(Pole1), UBound(Pole1) QuickSort Pole2, LBound(Pole2), UBound(Pole2) Public Sub QuickSort(vArray As Variant, inlow As Long, inhi As Long) ' velká číselná pole, jejichž počet položek je značně menší ' než největší hodnota ' textová pole Dim pivot As Variant Dim tmpswap As Variant Dim tmplow As Long Dim tmphi As Long tmplow = inlow Excelplus.NET 4

tmphi = inhi pivot = varray((inlow + inhi) \ 2) While (tmplow <= tmphi) While (varray(tmplow) < pivot And tmplow < inhi) tmplow = tmplow + 1 Wend While (pivot < varray(tmphi) And tmphi > inlow) tmphi = tmphi - 1 Wend If (tmplow <= tmphi) Then tmpswap = varray(tmplow) varray(tmplow) = varray(tmphi) varray(tmphi) = tmpswap tmplow = tmplow + 1 tmphi = tmphi - 1 End If Wend If (inlow < tmphi) Then QuickSort varray, inlow, tmphi If (tmplow < inhi) Then QuickSort varray, tmplow, inhi Pozn. Existují i dvourozměrné (2D) varianty pro Quick Sort, kdy můžete třídit celé záznamy. Tip Až donedávna jsem neměl tušení, že je možné s pomocí funkce CreateObject využívat některé objekty a struktury z.net Frameworku pod VBA. Pokud tedy nechcete na pole nasadit Quick Sort, můžete si dopomoci jinak. Sub SerazeniPoleNET() Dim mylist As Object Excelplus.NET 5

'vytvoření pole (ArrayList) Set mylist = CreateObject("System.Collections.ArrayList") 'přidání položek do pole mylist.add ("slon") mylist.add ("kočka") mylist.add ("prase") mylist.add ("kůň") mylist.add ("antilopa") 'setřídění mylist.sort Přirozené řazení V rámci řazení převažuje u textových řetězců postup znak po znaku. V tomto duchu je ve vzestupné posloupnosti A100 < A11, což zpravidla nevyhovuje našim potřebám. Chceme-li, aby A11 < A100, C2 < C10 atd., tak mluvíme o tzv. "přirozeném" řazení. Excel toto nenabízí a musíme si pomoci kódem VBA. Teoreticky postupujeme tak, že číselnou část řetězce dorovnáváme na stejný počet číslic (doplňujeme úvodní nulu), tj. A11 bude A011, C2 pak C02. Jinou cestou je užití API funkce StrCmpLogicalW z knihovny shlwapi.dll. '-1... lpstring1 < lpstring2 ' 0... lpstring1 = lpstring2 ' 1... lpstring1 > lpstring2 Public Declare Function StrCmpLogicalW Lib "shlwapi" (ByVal lpstring1 As Long, _ ByVal lpstring2 As Long) As Long Sub TestPrirozeneTrideniAPI() 'přirozené třídění 'StrPtr nutné (jedná se o Unicode funkci) Debug.Print StrCmpLogicalW(StrPtr("a"), StrPtr("A")) ' 0 Debug.Print StrCmpLogicalW(StrPtr("a"), StrPtr("á")) '-1 Debug.Print StrCmpLogicalW(StrPtr("14"), StrPtr("100")) '-1 Debug.Print StrCmpLogicalW(StrPtr("a1"), StrPtr("a2")) '-1 Debug.Print StrCmpLogicalW(StrPtr("a10"), StrPtr("a2")) ' 1 Debug.Print StrCmpLogicalW(StrPtr("c"), StrPtr("č")) '-1 Excelplus.NET 6

Debug.Print StrCmpLogicalW(StrPtr("č"), StrPtr("Č")) ' 0 Debug.Print StrCmpLogicalW(StrPtr("c"), StrPtr("ch")) '-1 Debug.Print StrCmpLogicalW(StrPtr("ci"), StrPtr("ch")) '-1 Dovolím si ještě jednu ukázku API funkce CompareStringW z knihovny kernel32.dll. 'Michael S. Kaplan 'http://www.siao2.com/2005/10/28/486019.aspx Public Enum CmpFlags NORM_IGNORECASE = &H1& NORM_IGNORENONSPACE = &H2& NORM_IGNORESYMBOLS = &H4& NORM_IGNOREKANATYPE = &H10000 NORM_IGNOREWIDTH = &H20000 LINGUISTIC_IGNORECASE = &H10& LINGUISTIC_IGNOREDIACRITIC = &H20& SORT_DIGITSASNUMBERS = &H8& 'Windows 7 SORT_STRINGSORT = &H1000& End Enum Public Enum CSTR_ LESS_THAN = 1 'string 1 less than string 2 EQUAL = 2 'string 1 equal to string 2 GREATER_THAN = 3 'string 1 greater than string 2 End Enum Public Declare Function CompareStringW Lib "kernel32" (ByVal Locale As Long, _ ByVal dwcmpflags As Long, ByVal lpstring1 As Long, ByVal cchcount1 As Long, _ ByVal lpstring1 As Long, ByVal cchcount1 As Long) As Long Public Function CompareString(ByVal lcid As Long, ByVal flags As CmpFlags, _ ByVal st1 As String, ByVal st2 As String) As CSTR_ CompareString = CompareStringW(lcid, flags, StrPtr(st1), Len(st1), _ StrPtr(st2), Len(st2)) End Function Sub TestCompareString() Excelplus.NET 7

Debug.Print CompareString(1029, NORM_IGNORECASE, "a", "A") '2 Debug.Print CompareString(1029, NORM_IGNORECASE, "a", "á") '1 Debug.Print CompareString(1029, NORM_IGNORECASE, "14", "100") '3 Debug.Print CompareString(1029, NORM_IGNORECASE, "c", "č") '1 Debug.Print CompareString(1029, NORM_IGNORECASE, "č", "Č") '2 Debug.Print CompareString(1029, NORM_IGNORECASE, "c", "ch") '1 Debug.Print CompareString(1029, NORM_IGNORECASE, "ci", "ch") '1 Debug.Print CompareString(1029, SORT_STRINGSORT, "a", "A") '1 Debug.Print CompareString(1029, SORT_STRINGSORT, "a", "á") '1 Debug.Print CompareString(1029, SORT_STRINGSORT, "14", "100") '3 Debug.Print CompareString(1029, SORT_STRINGSORT, "c", "č") '1 Debug.Print CompareString(1029, SORT_STRINGSORT, "č", "Č") '1 Debug.Print CompareString(1029, SORT_STRINGSORT, "c", "ch") '1 Debug.Print CompareString(1029, SORT_STRINGSORT, "ci", "ch") '1 'přirozené třídění Debug.Print CompareString(1029, SORT_DIGITSASNUMBERS, "14", "100") '1 Debug.Print CompareString(1029, SORT_DIGITSASNUMBERS, "a1", "a2") '1 Debug.Print CompareString(1029, SORT_DIGITSASNUMBERS, "a10", "a2") '3 Téma rozhodně není vyčerpáno. Museli bychom se zabývat vyhledávacími funkcemi SVYHLEDAT a POZVYHLEDAT, zobecnit úvahu řazení ve vztahu k operačnímu systému a jeho lokalizaci, pobavit se o tématu porovnávání v databázích, kódových stránkách, práci s textem v operační paměti, vyzkoušet chování Excelu ve webovém prohlížeči a také Office 365. A nakonec bychom vinili z našich útrap Cyrila s Metodějem, Husa, Komenského a další osobnosti naší historie a jazyka. Proto je na čase říci dost, končíme. Ke stažení excel-razeni.zip Excelplus.NET 8