Základní práce s buňkami

programovani.png V minulém díle jste se naučili definovat buňky a vkládat do nich obsah, případně zjistit jeho typ. V tomto díle budeme pokračovat ve vysvětlení zbylých operací s buňkami, jako je vkládání, odstraňování a přesouvání. Naučíte se, jak vyhledat určitý obsah v buňce, jak ho smazat a provádět základní matematické operace.  

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 Rozsah buněk před vkladem buňky

Rozsah po vložení buňky A1 Rozsah po vložení buňky A1

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

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

Komentáře

user avatar Miroslav
Odpovědět
Základní práce s buňkami
7. 01. 2018, 21:45:20
Dobrý den přeji, mám problém s buňkami v programu OPEN OFFICE.ORG(v práci) . Kolegyně se nám v tom trochu šťourala a nějak se jí podařilo zapnout informace o změně buněk. Prosím Vás o radu jak toto vypnout. Vždy když na buňku najedu kurzorem tak mi nad buňkou vyskočí okénko s informací kdy byla změněna a na co, s informací že před tím byla buňka prázdná. Děkuji Mošovský
user avatar kabi
Odpovědět
Základní práce s buňkami
8. 01. 2018, 13:16:10
Odznačte volbu v nabídce Upravit - Sledování změn - Záznam
user avatar Hanka
Odpovědět
Re:Základní práce s buňkami
3. 07. 2020, 22:17:19
Děkuju, děkuju, DĚKUJU!!!! Miluju Vás! Už jsem po těch dvou dnech s každou změněnou červeně orámovanou buňkou šílela a nikde jsem nemohla najít jak se toho zbavit. Ještě jednou DĚKUJU!!!!
user avatar Marek
Odpovědět
Základní práce s buňkami
5. 05. 2018, 00:25:22
Mám problém....
Mam vytvořený formulář kde je zboží,kusy a ceny bez DPH. Jak to prosim sečte dohromady?
user avatar Marek
Odpovědět
Problém
5. 05. 2018, 00:31:49
v Exelu mi součet ceníku vypočítalo ve sloučení buněk..... Tady ne.... Už se vtom placám PORADITE??????
user avatar neutr
Odpovědět
Re:Problém
5. 05. 2018, 07:36:06
Marku tohle téma už sleduje minimum lidí protože je dost staré. Správný postup je otevřít nové téma ve fóru. To znamená přihlásit se jako nový uživatel a otevžít příslušný modul pro problematiku Calcu a vytvořit nový příspěvek.

Tady není ani možnost pořádně problematiku popsat :
Jaké sloučení "zboží,kusy a ceny" - vše v jedné buňce? Nebo v jednotlivých buňkách? Tedy A1(zboží), B1(kusy), C1(ceny)? Nejspíš jde o převod z formátu CSV (typicky eshop) který je proveden nesprávnými separátory (oddělovači).

Podle toho o jaký problém jde se dá odpovědět. Z výrazu v jedné buňce například (tatranka 10 6,70Kč) by excel uměl vytvořit asi jen tatranka 16,70Kč - správně by to mělo být tatranka 67 Kč - jako souhrn. Ale musela by se použít funkce evaluate (ta by v Excelu být měla, ale v Calcu není) a ta stejně musí vědět jakou operaci zadat mezi čísla - tedy operátor (+, -, *, /). Funguje pouze pro jeden výraz, respektive jeden číselný výraz bez oerací které mohou být složité. Tohle ale nevím - Excel nemám.

Zato se domnívám že jde o jiný problém. Máte nastaven špatný importní filtr ve smyslu separátoru. Při importu musíte zadat separátory a může to být také jen mezera i když jde většinou o čárku (název CSV je od ní odvozen). Potom se dostane každý výraz do samostatné buňky a ty už se dají sčítat ze sloupce, nebo na řádku vytvořit patřičnou variantu operace (tedy pomocí operátorů (+, -, *, /) a může to být i složeno z více různých operací.

Takže pochopte, že sem to jednak nepatří, že se sem nedá poslat ukázka jako obrázek nebo vzor, těžko je problém popsatelný jednoduchou větou. Například zapsat sem složitější vzorce nelze a chodí sem jen málo lidí. Snadno se řešení zvrhne do 2-3 stránkové diskuse.

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