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,40 | Hodnotilo: 10
 

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ří.
user avatar petouf
Odpovědět
Jak na řádky a sloupce v makrech
12. 11. 2019, 14:19:11
Jenom k té šířce: OptimalWidth a né OptimalWeight :-D
Stálo mě to 2 hodiny pokusomylů...
Ale stejně mě to nefunguje. Pevná šířka ano, ale když dám optimal tak se mě sloupce ani nehnou... No jdu bádat :-)
Jinak dík autorovi za bezva návody. A nevíte někdo, kde se nechá sehnat kompletní dokumentace k Basicu (nejlépe v Č.J.) pro makra v CALCu?

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.

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

 

Public Relations

IPv4 zastarává, i tak si však zaslouží kvalitní zabezpečení

Znáte souvislost mezi doménami a typickými IP adresami? Není od věci si uvědomit, že zatímco domény jsou určeny pro zjednodušení hledání webové stránky na internetu, IP adresy slouží primárně pro výpočetní techniku, konkrétně pro přesné vyhledání konkrétního serveru nebo počítače.

Pokračování ...


LinuxEXPRES (news 300px)
SAM v kostce 2019
 
 
woo jaw demo hz