Pohyb v buňkách pomocí kurzoru

calc.png V minulém díle jste se naučili vyhledávat buňky jiným způsobem než zadáním jejich adresy (podle jejich vlastností). Možnosti programovacího jazyka zde ale nekončí. V tomto díle se dozvíte o pohybu v buňkách pomocí vytvořeného kurzoru. Kurzor v tomto případě neznamená známou "blikající" čárku zobrazenou na monitoru, ale způsob, jakým pomocí makra provádíte pohyb v listu sešitu.  

Vytvoření kurzoru

Nejprve musíte kurzor vytvořit. Stejně jako při práci s myší umísťujete kurzor do určité buňky. Tato buňka musí být definována adresou nebo pomocí aktuálního výběru.

doc = thisComponent
list = doc.sheets(0)
bunka = list.getCellByRange("C4")
kurzor = list.createCursorByRange(bunka)

Pro účely testování si vytvořte list s vyplněnými buňkami A1:D5. Na této oblasti budete testovat následující příkazy.

Metody k pohybu pomocí kurzoru

Po vytvoření kurzoru již zadáváte příkazy, které ho přímo ovlivňují. Ve všech příkladech tedy budeme pracovat s proměnnou kurzor.

Před samotnými příkazy je ale nutné znát pojem souvislá oblast. Souvislá oblast označuje oblast neprázdných buněk, které spolu přímo sousedí. Pokud se buňky v jakémkoli bodě dotýkají, jsou pro makro spojené. Mezi buňkami musí být jeden řádek a zároveň jeden sloupec, aby je program identifikoval jako nespojené. Toto je velmi důležité, protože při nesprávném použití bude výsledek diametrálně odlišný od požadovaného chování makra.

Tip: nezapomeňte, že přirozený pohyb kurzoru je směrem doprava a dolů, všechny příkazy fungují na tomto principu.

Přejít na jednu buňku

Nejprve sada příkazu, pomocí kterých přesunete kurzor pouze na jednu buňku.

Příkaz gotoStart()

Přejde na první použitou buňku (levá horní) v souvislé oblasti buněk. Pokud je tato aktuálně vybraná (kurzor v sešitu se nachází právě na této buňce), je vybrána tato buňka.

Pro lepší představu použijte obarvování pozadí v makru.

kurzor.gotoStart()
kurzor.CellBackColor = RGB(0,0,255) 

Výsledek příkazu – první buňka souvislé oblasti A1 Výsledek příkazu – první buňka souvislé oblasti A1

Příkaz gotoEnd()

Tento příkaz je opakem gotoStart(). Po tomto příkazu přejde kurzor na poslední buňku ve spojité oblasti.

kurzor.gotoEnd()
kurzor.CellBackColor = RGB(255,0,0)

Výsledek příkazu – poslední buňka v souvislé oblasti D5 Výsledek příkazu – poslední buňka v souvislé oblasti D5

Příkaz gotoOffset(sloupec, radek)

Často potřebujete vybrat buňku, ale dopředu neznáte její polohu (poloha je například výsledkem makra). Možností je polohu zjistit a následně adresovat pomocí getCellByPosition. Pokud ale znáte aktuální polohu kurzoru, využijte příkazu gotoOffset. Příkaz vyžaduje dva argumenty – počet sloupců a počet řádků. Tato čísla určují, o kolik sloupců a řádků má být kurzor posunut, přičemž posun je realizován doprava u sloupců a dolů u řádků, záporná hodnota posouvá kurzor doleva a nahoru.

kurzor.gotoOffset(2,2)
kurzor.CellBackColor = RGB(0,255,0)

Výsledek příkazu – buňka posunutá o dva sloupce a dva řádky E6 Výsledek příkazu – buňka posunutá o dva sloupce a dva řádky E6

Příkaz gotoPrevious()

Pomocí tohoto příkazu přesunete kurzor na nejbližší předchozí neuzamčenou buňku. Ve většině případů se jedná o buňku vlevo od aktuální buňky. Nezapomeňte, že jste kurzor vytvořili v buňce C4.

kurzor.gotoPrevious()
kurzor.CellBackColor = RGB(255,0,0)

Výsledek funkce – první neuzamčená buňka vlevo C3 Výsledek funkce – první neuzamčená buňka vlevo C3

Příkaz GotoNext()

Přesune kurzor na nejbližší dostupné nechráněné buňky. Ve většině případů se jedná o buňku vpravo od aktuální buňky.

kurzor.gotoNext()
kurzor.CellBackColor = RGB(0,255,0)

Výsledek funkce – první neuzamčená buňka vpravo C5 Výsledek funkce – první neuzamčená buňka vpravo C5

Přejít na oblast buněk

Následující příkazy již dávají za výsledek oblast buněk.

Příkaz collapseToCurrentRegion()

Pomocí tohoto příkazu se z definované buňky, kde jste vytvořili kurzor, přesunete na celou souvislou oblast buněk.

kurzor.collapseToCurrentRegion()
kurzor.CellBackColor = RGB(0,0,255)

Výsledek funkce - celá souvislá oblast A1:D5 Výsledek funkce - celá souvislá oblast A1:D5

Příkaz collapseToCurrentArray()

Méně využijete příkaz, který funguje na stejném principu, ale pouze tehdy, pokud buňka, ve které byl kurzor vytvořen, obsahuje maticový vzorec. Výsledkem bude oblast buněk s maticovým vzorcem. Jestliže buňky mají jiný obsah, kurzor se nemění.

kurzor.collapseToCurrentArray()
kurzor.CellBackColor = RGB(0,0,255)

Příkaz collapseToMergedArea()

Stejný princip využívá také další příkaz, který umí vybrat sloučené buňky. Při použití označí všechny sloučené buňky, podmínkou je, že se buňka, ve které se kurzor vytvořil, nachází v takové oblasti. V opačném případě je kurzor ponechán beze změny. Tento příkaz použijte pouze v případě, že chcete ovlivnit pouze sloučené buňky.

kurzor.collapseToMergedArea()
kurzor.CellBackColor = RGB(0,0,255)

Příkaz expandToEntireColumns()

Tímto příkazem označíte celý sloupec, ve kterém byl kurzor vytvořen.

kurzor.expandToEntireColumns()
kurzor.CellBackColor = RGB(0,0,255)

Výsledek funkce – celý sloupec C Výsledek funkce – celý sloupec C

Příkaz expandToEntireRows()

Stejná funkce, ale pro řádek.

kurzor.expandToEntireRows()
kurzor.CellBackColor = RGB(0,0,255)

Výsledek funkce – celý řádek 4 Výsledek funkce – celý řádek 4

Příkaz collapseToSize(sloupec, radek)

Obdobou příkazu gotoOffset je příkaz collapseToSize(sloupec, radek). Rozdíl spočívá v tom, že zde je výsledkem oblast namísto jedné buňky.

kurzor.collapseToSize(2,2)
kurzor.CellBackColor = RGB(0,0,255)

Výsledek funkce – oblast buněk se začátkem v C4 rozšířená o dva sloupce a dva řádky C4:D5 Výsledek funkce – oblast buněk se začátkem v C4 rozšířená o dva sloupce a dva řádky C4:D5

Příkaz gotoStartOfUsedArea(boolean)

Tento příkaz přesune kurzor na začátek všech používaných buněk. Vyžaduje parametr TRUE nebo FALSE, který určuje, zda bude označena pouze jedna buňka (FALSE), nebo celá oblast (TRUE). Tento příkaz nerozlišuje mezi souvislými a nesouvislými oblastmi buněk.

kurzor.gotoStartOfUsedArea(True)
kurzor.CellBackColor = RGB(0,0,255)

Výsledek funkce – oblast od místa kurzoru po první použitou buňku v sešitu A1:C4 Výsledek funkce – oblast od místa kurzoru po první použitou buňku v sešitu A1:C4

Příkaz gotoEndOfUsedArea(boolean)

A stejným způsobem se dostanete na poslední použitou buňku. Předtím si ale vyplňte například buňku F7, nebo jinou mimo souvislou oblast.

kurzor.gotoEndOfUsedArea(True)
kurzor.CellBackColor = RGB(0,0,255)

Výsledek funkce – oblast od místa kurzoru po poslední použitou buňku C4:F7 Výsledek funkce – oblast od místa kurzoru po poslední použitou buňku C4:F7

Příklad využití

Praktických využití může být mnoho. Například chcete zpracovávat dokument, který má neměnnou strukturu, ale nemůžete dopředu zjistit její celkový rozsah (počet řádků). Buňky v sešitu jsou sytě barevně zvýrazněny. Při tisku na černobílé tiskárně dochází k tomu, že se dokument stává nečitelným. Tento dokument dostáváte pravidelně a musíte jej vždy tisknout. Navíc autor používá nestandardní písmo, které se nesprávně interpretuje na vašem PC. Právě v tento okamžik použijete kurzorové příkazy.

sub uprava_tabulky
doc = thisComponent
list = doc.sheets(0)
bunka = list.getCellRangeByName("B2")
kurzor = list.createCursorByRange(bunka)
kurzor.gotoStartOfUsedArea(False)
kurzor.gotoEndOfUsedArea(True)
kurzor.CellBackColor = RGB(255,255,255)
kurzor.CharFontName = "Arial"
end sub
(Jako ve škole) Průměr: 1.00 | Hodnotilo: 2
 

Komentáře

user avatar Jiří Daněk
Odpovědět
Pohyb v buňkách pomocí kurzoru
4. 03. 2018, 20:09:59
Zkouším přejít z MS Office na LO a dělám začátečnické pokusy. Kdysi dávno jsem takto přecházel z Calc 602 na MS Office. Nevím, jestli je to tím, že jsem taky už podstatně starší a nebo makra ve zmíněných programech mi byly srozumitelnější, nebo kombinací obojího, ale LO mi dává zabrat.
Potřebuji si předělat nějaká moje makra do LO a dost narážím. Naštěstí jsem důchodce a tak čas, který tím trávím beru jako trening. Být v aktivním věku, asi bych už utekl.
Ve svých makrech poměrně často používám interní proměnné:
- konec dat (řádek sloupec)
- ActiveCellRow případně ActiveCellColumn atd.Interních proměnných je v excelu mrak.
Domnívám se, že v LO nic takového není, alespoň jsem nikde nenašel o tom žádnou zmínku. To je ale otázka zvyku.
Hodnoty konce dat (sloupec, řádek) pak používám jako proměnné v cyklech.
V uvedené kapitole je sice příkaz:
"kurzor.gotoEndOfUsedArea(True)",
který sice příkazem
"kurzor.CellBackColor = RGB(0,0,255)"
obarví správnou buňku, ale když se zeptám na jeho "souřadnice",sekvencí příkazů

oCell = ThisComponent.CurrentController.getSelection()
With oCell.RangeAddress
SH = .Sheet REM číslo záložky
SC = .StartColumn REM číslo sloupce konce dat
SR = .StartRow REM číslo řádku konce dat
End With

dostanu do proměnných souřadnice "AKTIVNÍ BUŇKY" (tu jsem dosud chápal jako polohu KURZORU) a ne polohu kurzoru dle LO. Na konec dat v listu, bych ale musel manuálně přejít příkazem CTRL END. Pokoušel jsem se to řešit taky "záznamem makra", který jsem dost používal v excelu, ale výsledek v LO Calc byl pro mě zoufale nepřehledný.
Už jsem pochopil, že "Pohyb v buňkách pomocí kurzoru" pracuje s proměnnými v buňkách a poloha aktivní buňky. Název mě tedy trochu mate. To ale není důležité.

S čím bych tedy potřeboval pomoci (pokud to jde):
- Jak mohu dostat aktivní buňku na konec dat?
- Jak mohu dostat aktivní buňku obecně kamkoli?
- jak mohu zjistit polohu aktivní buňky a její uložení do proměnných. (řádek slupec)?
- jak mohu zjistit polohu poslední editované hodnoty v buňce, tedy polohu kurzoru LO (kurzor.goto...)?

Pro kontrolu posílám odpovídající excelové příkazy pro práci s aktivní buňkou.
- Přesunutí aktivní buňky na poslední použitou buňku tabulky.
„ActiveCell.SpecialCells(xlLastCell).Select“
- Převzetí čísla sloupce aktivní buňky (Kurzoru) do proměnné.
„(Poslední)Sloupec = ActiveCell.Column“
- Převzetí čísla řádku aktivní buňky do proměnné.
"(Poslední)Radek = ActiveCell.Row“
„Poslední“ platí jen pokud bylo provedeno přesunutí na poslední buňku datové oblasti.

Moc moc děkuji.
J. Daněk
user avatar neutr
Odpovědět
Pohyb v buňkách pomocí kurzoru
5. 03. 2018, 09:30:07
Pane Daněk nejlepší bude, když otevřete na fóru - téma Calc. Stačí když se přihlásíte jako nový uživatel a napíšete "nový příspěvek" právě pro Calc.
Uveďte název například "Převod maker MSO na StarBasic" nebo něco podobného.

Je pravdou že já bývám velmi nepříjemný pokud někdo prosazuje VB, nebo VBA na úkor StarBasicu, ale opačný přechod považuji za správný a žádoucí.

Asi bych Vás měl ujistit že jsem také starobní důchodce ale nemám čas na nic jiného nežli na programování ve StarBasic, nebo práci pro zdejší fórum. Takže místo "koníčka" se u mne vyprofilovala pořádná kobyla:-)

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