Jak na řádky a sloupce v makrech

programovani.png Stejně jako sešit obsahuje listy, tak list obsahuje buňky, sloupce a řádky. Pojďte se nyní věnovat právě sloupcům a řádkům. Vysvětlíme si je dohromady, protože jejich ovládání je zcela shodné.  

V následujících příkladech budu tedy vždy uvádět dva zápisy kódu, první s columns (sloupce) a druhý s rows (řádky).

Přístup

Nejprve si ukážeme cestu, pomocí které si k sloupcům a řádkům získáte přístup.

doc = thisComponent
list = doc.sheets(0)
sloupce = list.columns
sloupec1 = sloupce.getByIndex(0)
radky = list.rows
radek1 = radky.getByIndex(0)

Takto jste si všechny sloupce a řádky přiřadili do proměnných a můžete je pak ovládat jejich prostřednictvím. Pokud ale chcete měnit jejich vlastnosti jednorázově, stačí vynechat proměnnou:

list.columns....
list.rows.....

Zde však už zadáváte přímo, co chcete se sloupci a řádky provádět – například: Za pomoci znalosti této struktury můžete jednoduše zjistit počet sloupců a řádků v označené oblasti.

sub pocet_radku_sloupcu
dim radek as long, sloupec as long
doc=thisComponent
vyber=doc.CurrentSelection
radek=vyber.rows.getCount
sloupec=vyber.columns.getCount
print "Vybráno "+sloupec+" S x "+ radek+ " Ř "
end sub

Makro vrátí počet sloupců a řádků v označené oblasti. Někdy totiž neznáte dopředu oblast, se kterou bude program pracovat, zjištění její velikosti se tak může hodit.

Vložení nového sloupce nebo řádku

Na vložení nového sloupce použijete:

list.columns.insertByIndex(1,1)

a řádek:

list.rows.insertByIndex(1,1)

Údaj v závorce uvádí, kolik sloupců chcete vložit a na jakou pozici. Zde vkládáte 1 sloupec na pozici sloupce B (druhý v pořadí).

TIP: Nezapomeňte, že číslování v Basicu začíná vždy 0! Toto pravidlo platí jak pro listy, řádky, sloupce a buňky, ale i pro veškeré operace, pokud je neomezíte sami.

Odstranění

Postup je stejný jako při vkládání:

list.columns.removeByIndex(1,1)
list.rows.removeByIndex(1,1)

Čísla v závorce opět řídí počet řádků/sloupců a pozici, ze které budete odebírat.

Vlastnosti

Samozřejmě můžete ovlivňovat i vlastnosti, které řádky a sloupce poskytují, jako je šířka/výška, zda jsou skryté či viditelné, zda se bude šířka/výška automaticky měnit podle obsahu buňky, a nakonec můžete vložit zalomení stránky k určitému sloupci/řádku – toto se velmi hodí při následném tisku.

Ještě než se ale dostanete k prostředkům, jak přímo tyto vlastnosti ovlivnit, musíme si ukázat způsob, jak sloupce a řádky adresovat (říci programu, s jakými konkrétními sloupci a řádky má operaci provést). Přístup k nim si zjednáte pomocí indexu (jejich pořadí):

list.columns(0)
list.rows(0)

Číslování jako vždy začíná 0 (nulou). Zde jste tedy identifikovali první sloupec (A) a první řádek (1).

Šířka a výška

Nastavovat můžete obě hodnoty.

Sloupce:

list.columns(0).Weight = 2000 ' výška

Řádky:

list.rows(0).Height = 2000 ' šířka

Číslo uvádí výšku/šířku v setinách milimetru. Nastavili jste tedy výšku a šířku na 2 cm.

Automatická šířka a výška

Pokud chcete určit řádkům/sloupcům, aby řídili svou velikost podle velikosti obsahu, použijete:

list.columns(0).OptimalWeight = True
list.rows(0).OptimalHeight = True

Skrýt a zobrazit

Stejně jako u listů:

list.columns(0).IsVisible = False ' skryje sloupec
list.rows(0).IsVisible = False ' skryje řádek

Pro zobrazení použijete hodnotu True.

Začátek nové strany

Samozřejmě v Calcu se občas bude hodit, když budete umět nastavit zalomení řádku/sloupce pro tisk.

list.columns(0).IsStartOfNewPage = True
list.rows(0).IsStartOfNewPage = True ' vloží zalomení

A opět použijete False pro zrušení zalomení.

Hledání v sešitech

Pro vyhledávání v sešitech můžete využít dva způsoby hledání. Jeden projde buňku po buňce a hledá přesnou shodu, druhý funguje obdobně jako klasické vyhledávání v dokumentu.

Druhý způsob je zde:

sub vyhledej
list=thisComponent.sheets(0)
hledej=list.CreateReplaceDescriptor
hledej.SearchRegularExpression = True
hledej.SearchString = "ahoj\>"
hledej.ReplaceString = "nazdar"
list.ReplaceAll(hledej)
end sub

Vidíte, že můžete hledat a nahrazovat velmi rychle. Hledání a nahrazování totiž probíhá „nad úrovní“ dokumentu. Makro najde (a nahradí) pouze hodnotu v buňce, ne buňku jako takovou. Tento způsob vyhledávání nelze použít na formát buněk! Pro tyto případy musíte mít zjištěnu lokalizaci buňky způsobem, jaký se dovíte v dílech věnovaným buňkám.

K jednotlivým řádkům makra: rozmer = list.CreateReplaceDescriptor – v listu, který jste definovali jako první list (sheets(0)), jste vytvořili „pomocný“ descriptor, ve kterém budou vyhledány hodnoty rozmer.SearchString = hodnota, budou v něm také nahrazeny rozmer.ReplaceString = hodnota. Nakonec přiřadíte pomocný descriptor zpět do dokumentu (listu) list.ReplaceAll(rozmer).

Řádek rozmer.SearchRegularExpression = True znamená, že hledáme pomocí regulárních výrazů. Regulární výraz je zástupné vyjádření pro znak/znaky. Využijete je tam, kde nechcete hledat přesnou shodu. Přehled regulárních výrazů je velmi pěkně popsán i v nápovědě OpenOffice.org, ale podrobně si o nich povíme v některém z dalších dílů seriálu.

Nadefinujte si v buňkách slovo ahoj tímto způsobem – ahoj, bahoj, b ahoj, ahojb, ahoj b. Tím, že hledáte za pomoci regulárního výrazu (\>), jste zajistili vyhledání textu ahoj pouze na konci slova. Výměna tedy proběhne pouze tam, kde slovo končí na ahoj. V tomto případě nebude nahrazeno slovo „ahojb“ (ahoj není na konci slova). Pokud chcete vyhledat ve všech listech, musíte pomocí cyklu listy projít a v každém z nich pak proběhne vyhledání a náhrada zvlášť.

Podobný způsob funguje i ve Writeru. Pouze musíte provést změnu v přiřazení descriptoru. Writer samozřejmě neobsahuje listy, proto musíte proměnnou hledej přiřadit k dokumentu:

doc = thisComponent
hledej = doc.CreateReplaceDescriptor

Výměna proběhne v celém dokumentu.

V dalším díle se již vrhneme na buňky, jejich definici a práci s nimi.

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

Komentáře

user avatar Franta
Odpovědět
Jak na řádky a sloupce v makrech
25. 11. 2015, 11:56:19
Dobrý den
Nepotřebuji hledat v celém sešitu,ale ve sloupci nebo řádku.
zatím jsem to nikde nenašel.
děkuji Franta
user avatar neutr
Odpovědět
Re:Jak na řádky a sloupce v makrech
25. 11. 2015, 13:39:44
Víte Search descriptor (to co uvádá Daniel) je opravdu rychlý. Najde start a End úsek v sešitě, což jsou sloupce a řádky - například A1:Z1023. Systémem "metelsku blesku" najde hledané a nahradí dle zadání.

Je samozřejmé, že někdy je potřeba jen vybarvit, nebo sečíst počet výskytů a podobné záležitosti. To se dá také udělat descriptorem.

Já mám osobně nepříjemný dojem, že Daniel práci nestačil, nebo nemohl ap. - dokončit. Dnes v podstatě podobné téma (prakticky stejné ale v plné šíři) zpracovává Eduard Boldižár. Ale asi uplyne hodně dílů (díl za 2 týdny) nežli se dopracuje k descriptoru a podobným věcem.

Ale můžete dát dotaz do fóra. Nejméně Vám já osobně odpovím. Mám několikero maker na bázi descriptoru, ale mám i takové, která hledají jen v jediném sloupci (řádku). Descriptor pracuje s array (proto ta rychlost) ale můžeme hledat i relativně pomaleji například pomocí While.., Do.., For.. a podobně.
user avatar lp.
Odpovědět
Jak na řádky a sloupce v makrech
25. 11. 2015, 23:30:38
Tak vytvoř search/replace descriptor nad jiným objektem, třeba řádkem nebo sloupcem, pro range:

CellRange = Sheet.getCellRangeByPosition(2,1,5,1)
Descript = CellRange.createSearchDescriptor()
user avatar Franta
Odpovědět
Jak na řádky a sloupce v makrech
27. 11. 2015, 10:32:39
Dobrý den
Něco jsem poskládal ale nefunguje to kde jsem udělal chybu?
sub vyhledej_0123456789_mazat
dim document, dispatcher, vyber as Object
Dim sloupec2
doc = ThisComponent
list = doc.sheets(0)
sloupce = List.columns
'Sloupek C
sloupec2 = sloupce.getByIndex(2)
hledej=sloupec2.CreateReplaceDescriptor
hledej.SearchRegularExpression = True
hledej.SearchString = "0123456789"
hledej.ReplaceString = ""
sloupec2.ReplaceAll(hledej)
end Sub
moc děkuji Franta
user avatar neutr
Odpovědět
Jak na řádky a sloupce v makrech
27. 11. 2015, 13:06:51
Otestujte tohle. Nesmíte ale zapomenout, že hledáte string. Problém s hledáním čísel není, ale normálně se uvozující nula nezobrazuje takže abyste našel 0123456789 tak to musí být text '0123456789, nebo "0123456789".

sub vyhledej_0123456789_mazat
'Sheet = ThisComponent.Sheets.getByName("List1") 'varianta deklarace
Sheet = ThisComponent.Sheets.getByIndex(0)
CellRange = Sheet.getCellRangeByPosition(1,0,1,100000) 'array B1:B100001
'To CellRange můžete nahradit čímkoliv třeba tím Vaším sloupcem
Descript = CellRange.createSearchDescriptor()
hledej=CellRange.CreateReplaceDescriptor
hledej.SearchRegularExpression = True
hledej.SearchString = "0123456789"
hledej.ReplaceString = ""
CellRange.ReplaceAll(hledej)
end Sub

Když zadáte opravdu číslo, tak potom zapište :
hledej.SearchString = 123456789

Jinak tohle je opravdu na Fórum - sem tyhle dotazy nepatří.

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