Formátování buněk – ohraničení, stínování, slučování

programovani.png Naučíte se nastavovat ohraničení buněk, jejich stínování a slučování. Přesto ani tento díl nebude stačit, abychom vyčerpali všechny možnosti, které nám program poskytuje.  

Ohraničení

Několik vlastností nelze nastavit jediným příkazem, jednou z nich je i ohraničení. Ohraničení (orámování) se nastavuje prostřednictvím struktury com.sun.star.table.BorderLine, kde je nutné nastavit jeho typ, a teprve poté nastavíte (přiřadíte) vlastní ohraničení do stylu. Struktura se skládá z následujících částí:

Color – barva čáry – použijete funkci RGB

InnerLineWidth – šířka vnitřní čáry v setinách milimetru při dvojité čáře.

OuterLineWidth – šířka čáry (samostatné), nebo šířka vnější čáry (při nastavení dvojité čáry) opět v setinách mm.

LineDistance – stanoví mezeru mezi dvojitými čarami.

Je nutné vždy nastavit barvu a šířku čáry. Tedy:

dim cara as New com.sun.star.table.BorderLine
cara.Color = RGB (125, 125, 125)
cara.InnerLineWidth = 100
cara.OuterLineWidth = 50
cara.LineDistance = 100

Nyní máte nadefinovaný styl čáry, který má být použit. K jednoduchému ohraničení buněk samozřejmě stačí definovat pouze vnější nebo vnitřní čáru. Pokud definujete obě, můžete nastavit mezeru mezi čarami (LineDistance). Získáte tak dvojité ohraničení.

Ohraničení jedné buňky

Pro ohraničení jedné buňky musíte styl čáry přiřadit k okraji buňky, kde má být použita:

bunky = thisComponent.sheets(0).getCellRangeByName("A1")
bunky.RightBorder = cara 'pravý okraj
'LeftBorder - levý, BottomBorder - dolní, TopBorder - horní
' pro šikmé přeškrtnutí – DiagonalBLTR (zleva doprava a zdola nahoru) a Diagonal TLBR (zleva doprava a zhora dolů)

Nastavení ohraničení jedné buňky Nastavení ohraničení jedné buňky

Ohraničení v oblasti buněk

Při ohraničení souvislých oblastí buněk je ovládání makrem jiné a poskytuje více možností ohraničení. Ovládáte zde navíc i ohraničení „vnitřních“ buněk.

TIP: Je možné použít i zápis pro ohraničení jedné buňky, pak se ale vzdáváte možnosti nastavit rozdílně vnitřní a vnější čáry. Všechny čáry pak budou mít jeden styl.

Nejprve určíte oblast buněk a do proměnné přiřadíte její ohraničení.

ohraniceni = oblast.TableBorder

Teď nastavujete jednotlivé čáry oblasti. Pro jednodušší zápis můžete opět použít funkci with.

With ohraniceni
.TopLine = cara 'přiřazení druhu ohraničení k horní čáře
.BottomLine = cara ' spodní čára
.RightLine = cara ' pravá
.LeftLine = cara ' a levá čára
.VerticalLine = cara ' vodorovné čáry ohraničení – pouze vnitřní
.HorizontalLine = cara ' kolmé čáry ohraničení – pouze vnitřní
end with

Pro použití rozdílných čar vnitřního a vnějšího ohraničení si nadefinujte další proměnnou (např. cara_2) s nastavením jejích hodnot. Pak už jen přiřadíte k jednotlivým čarám.

.HorizontalLine = cara_2

Možnosti ohraničení zde ale nekončí. Je možné makrem nastavit i podmínku, zda má být čára použita. Na to slouží následující příkazy:

with ohraniceni
.IsTopLineValid = True 'povolení použití horní čáry
'.IsBottomLineValid = True ' spodní okraj
'.IsRightLineValid = True ' pravý okraj
'.IsLeftLineValid = True ' levý okraj
'.IsHorizontalLineValid = True ' vodorovné vnitřní čáry
'.IsVerticalLineValid = True ' svislé vnitřní čáry
end with

Pokud chcete využít této možnosti, musíte tyto příkazy umístit v kódu makra před přiřazením čáry k ohraničení buněk (tedy například před ohraniceni.TopLine = cara). Jestliže tuto definici vynecháte, bude ohraničení nastaveno vždy.

TIP: Podmínka ohraničení nemusí být striktně zadána jako True nebo False. Je možné použít i výsledek funkce, která tuto hodnotu vrací (například funkce IIF a jiných).

Nakonec opět musíte ohraničení nastavit pro vybranou oblast buněk:

oblast.TableBorder = hranice

Vzorový kód makra nastaví dvojité ohraničení červené barvy na vnitřních vodorovných a kolmých stranách buněk a v případě, že buňky A1 a A2 jsou si rovny, bude použito i horní ohraničení oblasti. V opačném případě nebude horní ohraničení použito.

sub ohraniceni
oblast = thisComponent.Sheets(0).getCellRangeByName("B2:D6")
oblast1 = thisComponent.Sheets(0).getCellRangeByName("A1").value
oblast2 = thisComponent.Sheets(0).getCellRangeByName("A2").value
dim ohraniceni as new com.sun.star.table.BorderLine
ohraniceni.color = RGB(255,55,50)
ohraniceni.OuterLineWidth = 40
ohraniceni.InnerLineWidth = 10
ohraniceni.Linedistance = 20
hranice = oblast.TableBorder
with hranice
.IsTopLineValid = IIF(oblast1=oblast2,True,False) '
.TopLine = ohraniceni
 .VerticalLine = ohraniceni
.HorizontalLine = ohraniceni
end with
oblast.Tableborder = hranice
end sub

Ohraničení při různých hodnotách v buňkách Ohraničení při různých hodnotách v buňkách

Ohraničení při shodě hodnot v buňkách

Ohraničení při shodě hodnot v buňkách

Nastavení stínování buněk

Stínování buněk má podobnou strukturu jako ohraničení buněk, neřídí se ale jedním příkazem. Pomocí struktury com.sun.star.table.ShadowFormat si nastavíte vlastnosti a přiřadíte k proměnné buňky (oblasti). Nastavujete umístění stínu, barvu a velikost.

Nastavení provedete tak, že si zadefinujete proměnnou, ve které provádíte vlastní nastavení stínování, a poté je přiřadíte k buňce:

dim stin as new com.sun.star.table.ShadowFormat
stin.ShadowWidth = 100 'nastavení velikosti stínu v setinách mm
stin.Color = RGB(100, 100, 100) ' nastavení barvy stínu
stin.Location = com.sun.star.table.ShadowLocation.BOTTOM_RIGHT ' vpravo dole

Další možnosti nastavení stínování:

.ShadowLocation.BOTTOM_LEFT ' vlevo dole
.ShadowLocation.TOP_LEFT ' vlevo nahoře
.ShadowLocation.TOP_RIGHT ' vpravo nahoře
.ShadowLocation.NONE ' žádný stín
stin.isTransparent = True
bunka.ShadowFormat = stin

Nastavení stínování Nastavení stínování

Slučování buněk

Samozřejmě lze makrem slučovat i rozdělovat buňky. Na rozdíl od Writeru lze ale rozdělit pouze sloučené buňky. Samotné sloučení provedete příkazem merge(true), pro rozdělení zadáte samozřejmě false.

oblast = thisComponent.sheets(0).getCellRangeByName("A1:B5")
oblast.merge(true)

Zde je nutné ohlídat si obsah buněk. Při sloučení buněk ruční volbou v Calcu jste dotázáni, zda chcete přesunout obsah skrytých buněk do první. Při psaní makra ale musíte tuto volbu samostatně zadat v kódu. Sloučení také způsobí pouze skrytí slučovaných buněk, takže pokud nepřesunete jejich obsah, bude po rozdělení opět viditelný. V makru obsah ale můžete stále používat. Stačí zadat adresu sloučené (skryté) buňky.

Také si uvědomte, že při sloučení se mění adresování buněk. Sloučené buňky jsou považovány za jednu s adresou původní buňky, která byla položena v levém horním rohu. Například při sloučení oblasti B5:C10 se adresa buněk změní na B5.

Sloučení buněk Sloučení buněk

Při slučování buněk se také hodí způsob, jakým zjistíte, zda jsou buňky sloučené. K tomu slouží funkce ismerged, která vrací hodnotu boolean (tedy True nebo False). Například takto:

oblast = thisComponent.sheets(0).getCellRangeByName("A1:B5")
if oblast.isMerged then 'místo pro další příkazy...

I zde však platí určitá omezení. Funkce vrátí True pouze v případě, že buňky správně adresujete. Vždy musí adresa obsahovat první použitou buňku (zde A1), a to i v případě zadání rozsahu (A1:B5). V opačném případě (např. B5) vrátí funkce hodnotu False.

V dalších dílech si ukážeme, jak formátovat přímo obsah buňky např. formát použitého písma, ale také jaký formát čísel můžete pomocí makra nastavit.

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

Komentáře

user avatar lp.
Odpovědět
Formátování buněk – ohraničení, stínování, slučování
21. 02. 2013, 17:48:33
Drobnost:

psát

něco = IIF(oblast1=oblast2,True,False)

nebo

něco = (oblast1=oblast2)

Příklad s porovnáváním shodných buněk je pěkný, ale příklad, kdy se namaluje čára mezi buňky s rozdílnými vzorci by se dal použít i jako doplněk - je to hodně užitečný nástroj při hledání chyb nebo studiu struktury většího sešitu.
user avatar Martin
Odpovědět
Formátování buněk – slučování
20. 03. 2015, 17:06:49
Prosím o radu:

tohle funguje
Sub slouceni
Dim Doc As Object
dim oblast as object
doc = thiscomponent
strana_2 = doc.sheets(2)
oblast = strana_2.getCellrangebyname("a1:c1") ==== tady mám problém
oblast.merge(true)
end sub
---
potřeboval bych oblast sloučení deklarovat dynamicky, protože předem nevím, na kterém řádku se mi vyskytne
---
příkaz
oblast = strana_2.getCellByPosition(0,0,0,2) nebo s proměnnými
oblast = strana_2.getCellByPosition(a,b,c,d)
ignoruje a sloučení neprovede. Je vůbec možné deklarovat pro sloučení s proměnnými?
Dělám něco špatně? Deklarace? jiná chyba?
Děkuju
Martin
user avatar j-pastierik
Odpovědět
Re:Formátování buněk – slučování
24. 03. 2015, 19:43:09
getCellByPosition môže mať iba dva parametre (stĺpec, riadok) a nie štyri – je to iba jedna bunka. Pretože argument getCellrangebyname je reťazec, čo vám bráni ho vytvoriť ako premennú? Napríklad niečo takéto (je to iba náznak, chce to doladiť podľa vašich potrieb) – stĺpec a riadok sú ako čísla od jednotky, čiže adresa B3 je stlpec=2, riadok=3:
adresa1 = chr(64+stlpec1)&riadok1
adresa2 = chr(64+stlpec2)&riadok2
sAdresa=adresa1+":"+adresa2
oblast = strana.getCellrangebyname(sAdresa)
oblast.merge(true)
user avatar Karel
Odpovědět
Formátování buněk – ohraničení, stínování, slučování
26. 02. 2020, 11:12:53
Dobrý den, pořád marně hledám jak nastavit délku buňky. Buď pevně číslem , nabo automaticky podle nejdelšího záznamu. Výska mi jde př. : list.rows.Height = 400 ale délka ne. Zkoušel jse Weight, Length apod ale píše to vždy metoda nenalezena. Mohl byste mi někdo poradit? Děkuji.Karel
user avatar kamlan
Odpovědět
Re:Formátování buněk – ohraničení, stínování, slučování
26. 02. 2020, 14:04:52
Váš dotaz je spíše do fóra, ale nejspíš to bude list.columns.width

Odpovědět

 

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