Práce s listy

programovani.png V tomto díle seriálu o makrech se podíváme na práci s listy; ty jsou součástí sešitu. Můžete je makrem přidávat, odebírat, přesouvat, přejmenovávat, nastavovat jim pozadí, skrývat a znovu zobrazovat a lze ještě mnoho dalších věcí. Ukážeme si ještě, jak listy procházet jeden po druhém a jak zjistit jejich počet. Nejprve ale jakým způsobem se k listům dostanete.  

Přístup k listům

Listy jsou v definici proměnných objekty. Pro přístup k listu musíte nejprve mít zpřístupněný dokument.

doc = thisComponent
oListy = doc.Sheets()

Po zpřístupnění dokumentu přiřadíte všechny listy do proměnné oListy. Pokud chcete pracovat pouze s jedním listem, musíte určit programu, s kterým, a to buď určením jeho jména, nebo jeho pořadí (indexu):

oList = doc.sheets.getByName("List1")

nebo

oList = doc.sheets(0) / oList = doc.sheets.getByIndex(0)

Přístup podle jména je bezpečnější, protože se nemůže stát, že zapomenete započítat skryté listy. Ale všude tam, kde budete provádět operace se všemi listy, použijete index (číslo lze nahradit proměnnou, která se pravidelně zvyšuje/snižuje).

Pokud dopředu víte, že nebudete pracovat s dokumentem jako celkem, ale pouze s listem, můžete zápis zkrátit takto:

oList = thisComponent.sheets.getByName("List1")

nebo

oList = thisComponent.sheets(0)

Jak vidíte, vypustili jste proměnnou dokumentu. Je ale lepší si dokument deklarovat zvlášť, nikdy nevíte, jak se bude náš kód vyvíjet a zda nakonec nebudete pracovat právě s dokumentem.

TIP: Toto byla jedna z věcí, která mě zpočátku trápila. Ke konci psaní makra jsem zjistil, že potřebuji pracovat i s dokumentem, a přepisoval jsem kód. Pokud spěcháte, stačí si dokument deklarovat do nové proměnné třeba na konci makra, ale zbytečně tak zanášíte kód, protože jde v podstatě o duplicitní deklaraci.

Ve všech dalších příkladech budete používat kratší definici doc.sheets(0) .

Procházení listů

Pokud budete pracovat se všemi listy dokumentu, máte několik možností, jak listy projít a průběžně s nimi pracovat.

První takovou možností je listy spočítat a pomocí cyklu je projít. Na spočítání máte v Basicu funkci count, pomocí které jste schopni zjistit poslední volnou pozici v definovaných proměnných.

oListy = doc.sheets.Count – 1

Protože chcete zjistit pořadí posledního listu, musíte na konci příkazu odečíst 1.

Následujícím příkladem zjistíte pořadí všech listů v sešitu

sub prochazej_listy
dim list as object
oListy = thisComponent.Sheets
for i = 0 to oListy.getCount – 1
list = oListy(i)
print i 
next i
end sub

Pokud zadáte v příkazu print místo i hodnotu list.name, vrátí makro názvy všech listů v sešitu.

Přidání

Pro přidání listu použijete následující příkaz, kde musíte specifikovat jméno a umístění listu:

doc = thisComponent
listy = doc.sheets
listy.insertNewByName("Nový list",0)

Příkaz insertNewByName vloží list, první údaj v závorce je vámi určené jméno listu a druhý údaj je pořadí, na jaké chcete list vložit. Pořadí nemusíte zadávat číselně, pokud budete přidávat vždy na konec sešitu, místo nuly zadáte listy.count.

Vložení nového listu na první pozici Vložení nového listu na první pozici

Přesunutí

Obdobně jako vkládání funguje i přesouvání listů, jen místo insertNewByName použijete MoveByName:

presun_list = listy.MoveByName("Nový list",1)

Údaje jsou opět v závorce: název listu, který chcete přesunout, a pořadí, kam ho přesouváte.

Přesunutí listu na druhou pozici Přesunutí listu na druhou pozici

Kopírování

Nyní je kopírování již hračka:

listy.CopyByName("Nový list","Zkopírovaný list",0)

Údaje v závorce – název zdrojového listu, název zkopírovaného listu a pořadí umístění.

Zkopírování Zkopírování "Nového listu" a vložení na první pozici

Odstranění

listy.RemoveByName("Nový list")

Odstranění Odstranění "Nového listu"

Přejmenování

Pro přejmenování nejdříve musíte vybrat list a pak mu určit jméno.

listy.getByName("Zkopírovaný list").name("Přejmenovaný list")

Přejmenování listu Přejmenování listu

Zkuste si zapsat následující makro, které spustíte v sešitu, příkaz Wait 500 zadrží vykonání příkazů na 500 milisekund a uvidíte, jak se listy mění.

sub prace_s_listy
listy=thiscomponent.sheets
listy.insertNewByName("Nový list",0)'
wait 500
listy.MoveByName("Nový list",1)
wait 500
listy.copyByName("Nový list","Zkopírovaný list", 0)
wait 500
listy.RemoveByName("Nový list")
wait 500
listy.getByName("Zkopírovaný list").setName("Přejmenovaný list")
end sub

Skrývání a zobrazování

Pokud chcete pomocí makra skrýt, nebo zobrazit určitý list, slouží k tomu vlastnost IsVisible :

doc = thisComponent
list = doc.sheets(0)
list.IsVisible = True

a pro zobrazení

list.IsVisible=False

navíc můžete ještě zjistit, zda je list skrytý

if list.IsVisible then

tento zápis vrátí True, pokud je list viditelný.

Ochrana listu

Stejně jako můžete uzamknout dokument proti změnám, můžete uzamknout i jednotlivé listy:

doc = thisComponent
list = doc.sheets(0)
list.Protected("Heslo") nebo list.Protected("")
list.Unprotect("Heslo") nebo list.Unprotect("")

a zjištění, zda je list chráněn

if list.IsProtected = True then

Zamčení listu souvisí s uzamykáním buněk. Popis na uzamčení buněk najdete v některém z dalších dílů o buňkách.

Základní práce s listy je zde popsána. V příštím díle se budeme věnovat řádkům, sloupcům a práci s nimi.

(Jako ve škole) Průměr: 1,17 | Hodnotilo: 12
 

Komentáře

user avatar jano14
Odpovědět
Práce s listy
26. 08. 2018, 10:55:35
Som programátor amatér,už na dôchodku.Články sú inšpiratívne, ale chýba mi otvorenie iného listu v otvorenom dokumente.Vytvorenie a presúvanie listov je pekné.To funguje 100%, ale je nepraktické aby listy ,ktoré momentálne nepoužívam boli skryté.Občas je potrebné mať prehľad o vytvorených lisoch,a prejsť na iný už vytvorený.Ďakujem
user avatar neutr
Odpovědět
Re:Práce s listy
26. 08. 2018, 11:36:56
Daniel Sedláček už tady několik let nebyl. Nevím proč, ale můžu odkázat ne další díly jeho seriálů. Bohu žel zde není vhodné řešit konkrétní příklady. K tomu slouží Fórum.


Doporučuji nejprve prohledat dotazy z fóra a teprve následně vytvořit nový příspěvek. K tomuto musíte být přihlášeným uživatelem. Pokud to s programováním myslíte vážně neobejdete se bez fóra.


Mimo toho sem chodí mnohem méně lidí. Není sem možné dobře poslat kód a podobně.


Vlastní řešení Vaší potřeby potřebuje upřesnit jak si představujete kontrolu existujích listů. Může to být provedeno různými způsoby, ale asi bych doporučil při vygenerování udělat zápis formou hyperlinku do buňky prvního listu. Hyperlink může přímo otevřít list a na druhé kliknutí ho zase zavřít. Jiný způsob by byl například pomocí dialogu, nebo také pomocí PopUp menu které načte všechny existující listy.

Pokud máte názvy nějak standardizované (máte seznam názvů který používáte pro vytvoření listů) tak by stačilo řešit dotaz zda list uvedeného jména existuje. Ale řešení může být velice různorodé.
user avatar Jiří Daněk
Odpovědět
Práce s listy
26. 09. 2018, 11:45:01
Jsem na tom podobně jako první přispěvatel. Důchodce, který řeší přechod z excelu na LO. Tedy hlavně poměrně jednoduchých maker. Jak říkali jiní, čas nemám nikdy. ten si musím vždycky udělat a do této činnosti je ho třeba opravdu mnoho. Co mě skoro ničí je, že skoro vždy mám problém, jehož řešení nenajdu přímo v této ´, nebo i jiných "příručkách". Toto je také jeden z nich. Perfektně popsaná práce s listy. Co mi v ní ale chybí je, jak mohu pracovat jen s jedním, ale libovolným listem. Tedy získat do proměnné jméno a nebo pořadové číslo aktuálně otevřeného listu, abych se mohl dále v makru na něj odkazovat.

Prohledávání fóra mi už několikrát v podobných problémech pomohlo, ale vzhledem k tomu, že není tak systematicky členěno jako tato příručka, je prohledávání vždy zoufalé a nejen časově náročné.

Takto jsem řešil např. nalezení adresy poslední použité buňky v listu a několika dalších věcí. Na seznamu ale mám několik dalších. Například:

Dosud jsem nepřišel na to, jak přesunout kurzor z aktuální buňky na jinou. V excelu se tento pohyboval po tabulce a v aktuální buňce pak pracovalo makro. Tady je to tak nějak na pozadí. Na to si lze zvyknout i když je pro mě obtížnější zjistit v které části tabulky se právě nalézám.

Excel také má spoustu systémových proměnných, které lze využít a nebo je přímo měnit. Z těchto jsem právě bral názvy listů, adresu poslední buňky atd. U LO jsem zatím na nic takového nenarazil. Je mi jasné, že začátky jsou vždy náročné. za těch svých 70 let jsem jich zažil mnoho.

Na závěr. Myslím si, že popularizaci OO/LO by nesmírně prospělo právě praktické řešení těchto detailů a jejich srovnání pro Excel - LO/OO a opačně.

Moc děkuji J. Daněk

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

 
Tiskárna Brno (CCB)
 
 
woo jaw demo hz