Vkládání buněk (oblastí)
V minulém díle jste poznali strukturu CellRangeAddress, která se skládá z určení listu, prvního a posledního řádku a sloupce. Tuto strukturu budete využívat i při následujících činnostech.
Nejprve je ale třeba si uvědomit rozdíl při vkládání a odstraňování buněk a řádků/sloupců. Pokud budete vkládat buňky, nevytvoříte nový řádek ani sloupec. Vložíte pouze definovanou část buněk, přičemž můžete programu říci, kam má přesunout buňky, které jsou na místě, kam vkládáte. K tomuto označení využijete strukturu com.sun.star.sheet.CellInsertMode.
Pro vklad jedné nebo více buněk je musíte zadefinovat. Můžete adresu rozepsat, jak jste to viděli v minulém díle, nebo stačí jednořádkový zápis, jak to vidíte o pár řádků níže. Příkazem RangeAddress na konci řádku předá makru adresu stejně jako rozepsaná deklarace (máte tam jak označení listu, tak řádků a sloupců).
sub vklad_bunky list = thisComponent.sheets(0) adresa_bunky = list.getCellByPosition(0,0,0,0).RangeAddress list.insertCells(adresa_bunky, com.sun.star.sheet.CellInsertMode.DOWN) end sub
Toto makro provede vložení buňky na pozici A1, s tím, že buňku či buňky, které se na dané pozici nachází, posune směrem dolů:
Rozsah buněk před vkladem buňky
Buňky vkládáte pomocí listů – list.insertCells, první údaj v závorce označuje místo, na které budete buňky vkládat (adresu), druhým určujete, co se má stát s buňkami, které se nachází na místě, kam vkládáte.
CellInsertMode struktura poskytuje tyto možnosti:
NONE – nepřesouváme,
RIGHT – doprava,
DOWN – dolů,
ROWS – posunout řádky,
COLUMNS – posunout sloupce.
Podobnou strukturu využijete i při opačném postupu, tedy při mazání buněk.
Odstranění buněk (oblastí)
Princip je zcela shodný. Jen prostředky se liší. Odstranění provedete pomocí list.removeRange a použijete strukturu: com.sun.star.sheet.CellDeleteMode. Tato struktura poskytuje následující:
NONE – nepřesouváme,
LEFT – doleva,
UP – nahoru,
ROWS – posunout řádky,
COLUMNS – posunout sloupce.
Zkuste odebrat buňky vložené předešlým příkladem a porovnejte si dokument před a po úpravě.
Na obrázku vidíte vzhled rozsahu buněk po odstranění oblasti A3:A5 s tím, že buňky jsou posunuty vlevo na místo odstraněných.
Změna rozsahu po odstranění buněk
Přesouvání a kopírování buněk (oblastí)
Obdobným způsobem budete přesouvat nebo kopírovat buňky. Zde je ovšem nutné zadávat o jeden adresní údaj navíc. Logicky nejprve musíte vědět, co chcete přesunout a kam.
sub vklad_bunky list = thisComponent.sheets(0) co = list.getCellByPosition(1, 1, 1, 1).RangeAddress kam = list.getCellByPosition(5, 5).CellAddress list.moveRange(kam , co) end sub
Pro kopírování pouze změníte příkaz na list.CopyRange(kam, co).
UPOZORNĚNÍ: Nezaměňujte vkládání buněk se změnou jejich obsahu. Je např. jednodušší změnit hodnotu buňky jako takové než celou buňku vkládat a dávat jí novou hodnotu. Při vkládání buněk totiž musíte počítat s jejich posunem, který ho může provázet.
Vyzkoušejte si nejprve, co znamená vkládání buněk, standardní cestou v sešitu se všemi jeho možnostmi. To vám poskytne lepší představu, jak celý proces funguje.
Smazání obsahu
Obsah buňky nejjednodušeji odstraníte tak, že nahradíte její hodnotu prázdným řetězcem. V případě velkého počtu takových buněk tento postup již není vhodný (nezapomeňte, že každou buňku musíte definovat zvlášť). Znamená to, že tento postup použijete pro případ ojedinělého „mazání“ a nejlépe u buněk, které již máte v makru definované. Změna se neprojeví u všech ostatních vlastností buňky.
Pro všechny ostatní případy poskytuje program metodu ClearContents(flags). Pomocí ní odmazáváte obsah buněk (nebo jeho části) stejně jako po stisku tlačítka [DELETE] a výběru, co chcete mazat. Tento výběr musíte předat makrem:
maz = com.sun.star.sheet.CellFlags.VALUE
VALUE – čísla,
DATETIME – čas, datum nebo obojí,
STRING – text,
ANNOTATION – poznámky (komentáře),
FORMULA – vzorce,
HARDATTR – formátování buněk,
STYLES – styly,
OBJECTS – objekty,
EDITATR – formátování písmen v jednotlivých buňkách (například barva písma…).
Málokdy budete mazat pouze jeden druh obsahu nebo vlastnost buňky. Většinou budete odmazávat čísla a text dohromady (případně i datum). Jak na to, ukazuje následující příklad. Použijte pomoc funkce With, urychlí to práci:
dim odstran as new com.sun.star.sheet.sheet.CellFlags with odstran .VALUE + .STRING +.DATETIME end with
V praxi:
sub maz dim i as integer listy = thisComponent.sheets() for i = 0 to listy.count – 1 rozsah = listy(i).getCellRangeByName("K5:L15") with com.sun.star.sheet.CellFlags rozsah.ClearContents(.VALUE or .STRING) end with next i end sub
Toto makro projde všechny listy v dokumentu a vymaže v oblasti K5:L15 všechny číselné a textové hodnoty.
Makro lze rozšířit tak, aby odmazávalo pouze neuzamčené buňky. Takové makro (ClearUnlockedCells) lze najít na stránkách p. Grafa. Makro zjistí pomocí výše uvedených metod první a poslední řádky/sloupce, využije cyklus FOR NEXT a projde buňku po buňce. U každé zjistí, zda je uzamčena (if bunka.isLocked = True then), a pokud není, vymaže její hodnotu.
Hledání v buňkách
V případě, že se nejedná o jedinou buňku, potřebujete mít způsob, který je bude schopen procházet. Například při vyhledávání přesné shody. Praktické využití si ukážeme na makru p. Pitonyaka uFindString, které jsem jen přeložil do češtiny:
sub hledej_hodnotu rem co vlastně hledáme? najdi = inputbox ("Napište hledanou hodnotu, nebo text") doc = thisComponent list = doc.Sheets(0)' List1 oblast = doc.CurrentSelection.RangeAddress ' aktuální výběr, nebo zadáte rozsah buněk k prohledání sradek = oblast.StartRow ' první řádek oblasti ssloupec = oblast.StartColumn ' první sloupec kradek = oblast.EndRow ' poslední řádek ksloupec = oblast.EndColumn ' poslední sloupec rem pro všechny sloupce For sloupec_bunky = ssloupec To ksloupec For radek_bunky = sradek To kradek ' a všechny řádky bunka = list.GetCellByPosition( sloupec_bunky, radek_bunky) ' projde jednotlivé buňky nasel = bunka.String ' do nasel předá hodnotu buňky If nasel = najdi then ' pokud souhlasí tak print "OK" ' napíše OK rem nebo přepsat, zformátovat … Exit sub ' končíme, pokud chceme najít pouze první hodnotu End If Next Next End sub
Z vybrané oblasti (označené například myší) – currentSelection – si makro zjistí první a poslední sloupce a řádky oblasti. Projde jednotlivé buňky a hledá přesnou shodu s proměnnou najdi. CurrentSelection můžete nahradit zadáním rozsahu přímo makrem. Například:
oblast=thisComponent.sheets(0).getCellRangeByName("A1:K50").RangeAddress
Počítání s buňkami
Ještě než ukončíme tento díl, ukážeme si další z užitečných vlastností, a to počítání s rozsahem buněk – tedy s jejich obsahem. Pokud jste někdy využívali výhod kontingenční tabulky, již jste s obdobou takového výpočtu přišli do styku. Výpočet probíhá se všemi buňkami výběru. Můžete použít následující funkce:
SUM – součet všech buněk oblasti,
COUNT – počet všech neprázdných buněk oblasti,
COUNTNUMS – počet všech buněk obsahujících čísla,
AVERAGE – průměr všech buněk oblasti,
MAX a MIN – maximální a minimální hodnota buněk oblasti,
PRODUCT – součin všech buněk v oblasti.
Jsou i další (VAR, VARP, STDEV a STDEVP) – jedná se o statistické funkce, a pokud nebudete programovat přímo makro pro statistiku, nebudete je potřebovat.
Praktické použití v makru:
doc = thisComponent list = doc.sheets(0) oblast = list.getCellRangeByName("A1:B10") soucet=oblast.computeFunction(com.sun.star.sheet.GeneralFunction.SUM) print soucet
Příštím díle budeme pokračovat řazením dat v buňkách.