hlavicka.png, 18 kB

Calc - Funkce a vzorečky

Easter eggs - Velikonoční vajíčka

Zajímavou funkcí nepopsanou v nápovědě je funkce GAME. Vyzkoušejte zadat do libovolné buňky:

=GAME("StarWars")

 nebo
 
=GAME(A1:C3;"TicTacToe").

První spustí jednoduchou hru, něco jako Space Invaders. Druhá pak miniaturní piškvorky. Ono to totíž nejsou funkce Calcu, ale jeho tzv. velikonoční vajíčka. Hodně tvůrců různých aplikací se snaží "propašovat" nějaké odlehčení, které často s vlastní aplikací nesouvisí.

Někdy s aplikací souvisí. A takovou v Calcu je

=STARCALCTEAM()


funkce STYLE

Tento text je v podstatě přepsán z nápovědy, možnosti této funkce se mi zdály natolik zajímavé (přitom asi nepříliš známe), že jsem se rozhodnul ji tady popsat.

Funkce STYLE použije definovaný styl na buňku se vzorcem. Po určité době může být použit jiný styl. Tato funkce vždy vrací hodnotu 0, což vám umožní přičíst její výsledek k jiné funkci aniž by se změnila výsledná hodnota. Společně s funkcí CURRENT můžete na buňku použít barvu beze změny samotné hodnoty. Například:

=...+STYLE(IF(CURRENT()>3;"červený";"zelený"))

aplikuje na buňku styl "červený" je-li hodnota větší než 3, jinak je použit styl "zelený" . Oba styly buněk musí být definovány předem.

Syntaxe:

STYLE(Styl;Čas;Styl2)
Styl  je název stylu buňky, který je k buňce přiřazen. 
      Názvy stylů musí být v uvozovkách.

Čas   je nepovinný časový interval po který bude styl 
      aktivní. Je-li tento parametr vynechán, potom po 
      určitou dobu nebude moci být styl změněn.

Styl2 je nepovinný název stylu, který bude k buňce 
      přiřazen po uplynutí určitého časového intervalu. 
      Není-li tento parametr zadán, použije se styl "Výchozí".

Příklad 1

=STYLE("Neviditelný";60;"Výchozí")

použije pro buňku po dobu 60 sekund (po načtení a přepočítání dokumentu) neviditelný formát a po uplynutí zadané doby použije opět výchozí formát. oba styly formátu buňky musí být zadány předem. To se dá použit pro zdůraznění změn některých výsledků

Příklad 2

=A1+1+STYLE(IF(CURRENT()>200;"seda";IF(CURRENT()>170;"zluta"; IF(CURRENT()>130;"zelena";IF(CURRENT()>100;"oranzova"; IF(CURRENT()>80;"modra";IF(CURRENT()>60;"cervena"; IF(CURRENT()>30;"cerna";"Výchozí"))))))))

vzorec je na jednom řádku, zde byl rozdělen z důvodu místa

Styly, které chcete použít musí být předem definované, viz Nápověda/Rejstřík - heslo 'Styly a formátování'. Lze to sice použit pouze na numerické hodnoty, ale i tak je to podmíněné formátování pro více než tři hodnoty.

Příklad 3

=DATE(YEAR(NOW());1;1)+STYLE(IF(WEEKDAY(CURRENT())=1;"cervena"; IF(WEEKDAY(CURRENT())=7;"modra";IF(DAY(CURRENT())<11;"seda"; IF(DAY(CURRENT())<21;"zluta";"oranzova")))))

=A1+1+STYLE(IF(WEEKDAY(CURRENT())=1;"cervena"; IF(WEEKDAY(CURRENT())=7;"modra";IF(DAY(CURRENT())<11;"seda"; IF(DAY(CURRENT())<21;"zluta";"oranzova")))))

Když první vzorec vložíte do buňky A1, druhý vzorec do buňky A2 a potom potáhnete vzorec z A2 až do A366, dostanete nekonečný kalendář, ve kterém budou soboty zbarveny modře, neděle červeně, ostatní dny z první dekády šedě, ostatní dny z druhé dekády žlutě a třetí dekáda oranžově.
Asi to není moc užitečný příklad, ale kdysi jsem něco podobného v Excelu musel vyřešit makrem. Samozřejmě, že styly musíte mít dopředu nastavené a barvičky si vyberete dle svého citu. Opět jsou vzorce na jednom řádku.

Funkce STYLE se dá kombinovat s pomíněným formátováním, přičemž podmíněné formátování má přednost. Pokud však v podmíněném formátování použijete styl 'Výchozí' použije se formátování z funkce STYLE. Toto lze využít pro různé sloupcové indikátory, kdy sloupec mění svou výšku podle hodnoty a svou barvu dle přednastavených mezí.



Poslední slovo - vzoreček

Původně jsem měl tento příspěvek připraven jako komentář k článku. V časopise LinuxExpres č. 7/2006 vyšel článek s názvem 'Funkce v OpenPffice.org Calc - vypsání posledního slova' jehož URL je www.linuxexpres.cz/06v7. Bohužel se mi tam nepodařilo přihlásit ani ve spolupráci s administrátorem serveru, tak se vykecám aspoň tady.

Autor v článku popisuje jak přišel k megavzorci:

=MID(SUBSTITUTE(A2;" ";"^";LEN(A2)-LEN(SUBSTITUTE(A2;" ";"")));
 FIND("^";SUBSTITUTE(A2;" ";"^";LEN(A2)-LEN(SUBSTITUTE(A2;" ";""))))
 +1;256)

Ve stručnosti: vzorec v pamětí pomoci SUBTITUTE zruší mezery a pak odečte velikost nového textu od původního, tím získá počet mezer v původním textu. Pomocí SUBTITUTE nahradí poslední mezeru speciálním znakem "^" a pomocí FIND najde pozici tohoto znaku. Nakonec pomocí MID odseparuje poslední slovo.
Sotva jsem do-obdivoval tuto konstrukci, napadlo mne, že to je přesně úloha pro regulární výrazy.

Mezitím se na URL článku objevily reakce. Protože autor to popisoval na příkladu oddělení popisných čísel od ulice v adrese, první příspěvek reagoval tak že vytvořil vzorec na získání popisného čísla:

=MID(TRIM(A1);SEARCH("[0-9/]+$";TRIM(A1));256)
s tím, "že není nutné vymýšlet složité řešení oklikou."

Druhý příspěvek podstatně zjednodušil původní vzorec, přičemž vzorec pracuje na úplně stejném principu - dokonalé:

MID(A4;FIND("^";SUBSTITUTE(A4;" ";"^";LEN(A4)
 -LEN(SUBSTITUTE(A4;" ";""))))+1;256)

Mým zamýšleným příspěvkem byly nasledující vzorečky s využitím regulárních výrazů, ale pro nalezení posledního slova, ne jen pro popisné číslo:

=MID(A2;SEARCH(" [^ ]+$";A2)+1;256)

" "       hledej mezeru
" [^ ]+"  za níž následuje alespoň jeden znak, mimo mezery
" [^ ]+$" a to vše se nachází na konci
SEARCH najde pozici a MID to odseparuje
tento vzorec pracuje stejně jako autorův původní tzn., že zhavaruje pokud je původní výraz jednoslovný(jedno slovo, taky poslední slovo), nebo pokud je na konci výrazu mezera vrátí tuto mezeru. Nápravou je následující modifikace vzorce:
=TRIM(MID(A2;SEARCH(" *[^ ]+ *$";A2);256))
tento vzorec již pracuje dle mých představ, ale pokud je vstupem prázdný řetězec oznámi chybu. V některých případech to nemusí být vhodné, takže ošetříme i toto pomocí IF:
=IF(A2="";"";TRIM(MID(A2;SEARCH(" [^ ]+ *$";A2);256)))
Takže nakonec máme tři stupně složitosti jednoho vzorce, dle toho jaké parametry budou mít vstupní data.

K názoru, "že není nutné vymýšlet složité řešení oklikou" v OOo bych chtěl říct, že existuje alespoň jeden důvod proč takové řešení vymýšlet i v OOo. Ať se to komukoli líbí či ne, musí spousta lidí používajícich OOo spolupracovat s lidmi, kteří výhradně používají Excel. V okamžiku, kdy jste z jakýchkoli důvodů nucení uložit sešit ve formátu .xls, zapomeňte na regulární výrazy.

Proto zde uvedu ještě maticový vzorec, který používám v Excelu a převedl jsem jej do Calcu:

{=MID(A2;SUM(IF(ISERR(SEARCH(" ";A2;ROW($A$1:$A$265)));0;1))+1;256)}

ROW($A$1:$A$265)
  poskytuje vektor pro postupné zkracování výrazu
SEARCH(" ";A2;ROW($A$1:$A$265))
  hledá mezeru v postupně se zkracujícím výrazu
ISERR(SEARCH(" ";A2;ROW($A$1:$A$265)))
  pokud se vyskytne chyba, vratí true. To nastane pokud už ve 
  zkráceném výrazu není žádná mezera
IF(ISERR(SEARCH(" ";A2;ROW($A$1:$A$265)));0;1)
  převede chyby na 0, ostatní na 1
SUM(IF(ISERR(SEARCH(" ";A2;ROW($A$1:$A$265)));0;1))
  spočítá počet 1, což je vlastně pozice poslední mezery
MID(A2;SUM(IF(ISERR(SEARCH(" ";A2;ROW($A$1:$A$265)));0;1))+1;256)
  odseparuje slovo za poslední mezerou
vzorec zvládá jednoslovné a prázdné vstupy. Pokud však vstup končí mezerou vrací tuto mezeru.


vgraf2@cbox.cz

23.09.2006

stránky

hlavní stránka

Calc


odkazy

Československé

Zahraniční