OpenOffice.org Calc pod drobnohľadom (11) - Ukážka makra

06.03.2008 12:00 | Články | Július Pastierik
Potrebujete napríklad vyfarbiť bunky tabuľky podľa určitých podmienok? Dnes si ukážeme makro, ktorým rozšírime minule vytvorený kalendár o možnosť vyfarbovania buniek napríklad podľa zadaných sviatkov.

V predchádzajúcom dieli sme si ukázali, ako dokážeme využiť niektoré dátumové funkcie pri tvorbe kalendára. V základnej verzii sme však nepočítali so sviatkami, pretože tie sa postupne posúvajú – ako sa posúvajú dni. Okrem toho máme aj pohyblivý sviatok – Veľkú noc.

Zadanie sviatkov

Napriek týmto rôznorodostiam dokážeme do kalendára automaticky vyznačiť aj sviatky a to vrátane Veľkej noci bez toho, aby sme museli každoročne manuálne zadávať jej dátum. Do zošita „Kalendar“, ktorý sme si vytvorili minule pridáme tretí list „Sviatky“. Aby nás list „Pomocne“ nemýlil, schováme ho (menu „Formát – List – Skryť“).

Na liste „Sviatky“ si teraz musíme zadefinovať viacero údajov. Pretože pri tvorbe nového kalendára zostanú vyfarbené dni z minuloročného kalendára, budme musieť najprv všetky dni nastaviť na „základné“ farby a až potom budeme môcť vyfarbovať vlastné sviatky.

Pri vyfarbovaní musíme brať do úvahy dva údaje – farbu textu a farbu pozadia. Niektorí si možno budú chcieť osobitne (napríklad jemnejšom odtieňom) vyfarbiť aj tie dni v týždni, v ktorých nie sú žiadne „dátumy“. Napríklad, pondelok budú chcieť mať na zelenom odklade, ale ak začína mesiac neskôr ako v pondelok, tak dni, ktoré vlastne patria do iného mesiaca chcú vyfarbiť svetlejšou zelenou farbou.

Preto si do prvých dvoch riadkov napíšeme dvakrát dni pondelok až nedeľa. V prvom riadku nastavíme pre príslušné dni také farby textu a pozadia, ktoré chceme použiť pri príslušných číselných údajoch. V druhom riadku si nastavíme pozadie buniek, akými chceme tieto dni vyfarbiť v prípade, že číslo dňa tam nie je (farba textu preto nemá význam).


Zadefinovanie sviatkov a farieb dní“

Ďalej si do stĺpca „A“ zapíšeme všetky sviatky či iné dni, ktoré chceme v kalendári špeciálne vypísať. Aby sme urobili makro čo najuniverzálnejšie, pre každý z týchto dní si môžeme nastaviť inú farbu textu a inú farbu pozadia. Dátumy musíme naformátovať na tvar DD.MM.RR – teda musia začínať dňom a potom mesiacom. Rok nie je dôležitý, pretože sa neberie do úvahy, je však dobré ho ponechať, aby sme si mohli overiť údaje pri Veľkonočných sviatkoch. Dátumy musia byť zadané kontinuálne za sebou, pretože makro ukončí svoju činnosť na prvej prázdnej bunke.

Teraz cez „Nástroje – Makrá – Usporiadať makrá… – OpenOffice.org Basic…“ otvoríme okno „Makrá v OpenOffice.org Basic“. V ľavej časti vyhľadáme v zozname súbor s kalendárom (bude na konci zoznamu), cez rozbalovacie tlačidlo „+“ ho otvoríme, prejdeme na položku „Standard“ a nakoniec stlačíme tlačidlo „Nový“.


Vytvorenie prázdneho makra v kalendári“

Vlastné makro pre zafarbenie buniek

OpenOffice.org sa nás opýta na názov modulu (štandardne ponúkne „Module1“). Po potvrdení tohto názvu (alebo zadaní vlastného) sa nám otvorí editor makier OpenOffice.org. Tu nájdeme zadané tieto tri riadky (je to vlastne prázdne makro):

REM ***** BASIC *****
Sub Main
End Sub


Automaticky vytvorené prázdne makro v kalendári“

Text vymažeme, vložíme tam tieto funkcie (sú čiastočne okomentované a preto ich nebudeme bližšie vysvetľovať) a nakoniec uzavrieme editor makier:


Makro pre zafarbovanie buniek v editore“

function daj_stlpec (mesiac as double) as double
' Určenie prvého stĺpca mesiaca
if (mesiac mod 2)=0 then
' párne mesiace – február, apríl,…
daj_stlpec=8
else
' nepárne mesiace – január, marec
daj_stlpec=0
end if
end function

function daj_riadok (mesiac as double) as double
' Určenie prvého riadku mesiaca
' január, február – 4
' marec, apríl – 13
' máj, jún – 22
' júl, august – 31
' september, október – 40
' november, decemnber – 49
dim pom as double
daj_riadok=4
pom=mesiac-2
do while pom>0
daj_riadok=daj_riadok+9
pom=pom-2
loop
end function

Sub zafarbi_bunky
' Vlastné zafarbenie buniek kalendára
dim dokument, list_kalendar, list_sviatky, bunka as object
dim datum as string
dim den_sviatku, den, mesiac, tyzden as double
dim stlpec, riadok, sviatky as double
dim farba_pozadia_1, farba_pozadia_2, farba_textu as long

dokument=stardesktop.currentcomponent
list_kalendar=dokument.sheets(0)
list_sviatky=dokument.sheets(2)

' Vyfarbenie podľa dní v týždni
' Farby a pozadie je v prvom riadku, stĺpce A – G
for mesiac=1 to 12
' Cyklus pre všetky mesiace
stlpec=daj_stlpec(mesiac)
riadok=daj_riadok(mesiac)
for den=1 to 7
' Cyklus pre všetky dni v týždni
bunka=list_sviatky.GetCellByPosition(den-1,0)
farba_pozadia_1=bunka.cellbackcolor
farba_textu=bunka.charcolor
bunka=list_sviatky.GetCellByPosition(den-1,1)
farba_pozadia_2=bunka.cellbackcolor
for tyzden=1 to 6
' Cyklus pre všetky možné týždne v mesiaci
bunka=list_kalendar.GetCellByPosition(stlpec+den-1,riadok+tyzden-1)
if bunka.string<>"" then
bunka.cellbackcolor=farba_pozadia_1
bunka.charcolor=farba_textu
else
bunka.cellbackcolor=farba_pozadia_2
endif
next tyzden
next den
next mesiac

' Zoznam sviatkov začína na štvrtom riadku (adresuje sa od nuly, teda má číslo 3)
sviatky=3
' Cyklus sa opakuje dovtedy, kým v prvom stĺpci sú zadané nejaké dátumy
' Dátum musí byť vo formáte DD.MM.RR
do
bunka=list_sviatky.GetCellByPosition(0,sviatky)
datum=bunka.string
if datum<>"" then
' Ak je zadaný dátum
den_sviatku=val(mid(datum,1,2))
mesiac=val(mid(datum,4,2))
stlpec=daj_stlpec(mesiac)
riadok=daj_riadok(mesiac)
farba_pozadia_1=bunka.cellbackcolor
farba_textu=bunka.charcolor
for den=1 to 7
' Vyhľadanie, v ktorom dni týždňa sa nachádza príslušný sviatok
for tyzden=1 to 6
' Vyhľadanie, v ktorom týždni sa nachádza príslušný sviatok
bunka=list_kalendar.GetCellByPosition(stlpec+den-1,riadok+tyzden-1)
if val(bunka.string)=den_sviatku then
' Je to hľadaný sviatok
bunka.cellbackcolor=farba_pozadia_1
bunka.charcolor=farba_textu
endif
next tyzden
next den
endif
' Presun na ďalší sviatok
sviatky=sviatky+1
loop until datum=""
End Sub

Na záver si pridáme cez návrh formuláru do listu „Sviatky“ tlačidlo, ktoré pomenujeme „Vyfarbi kalendár“.


Vloženie a pomenovanie tlačidla do dokumentu“

V jeho vlastnostiach, na záložke „Udalosti“ priradíme k akcii „Stlačené tlačidlo myši“ makro „zafarbi_bunky“, ktoré sme práve vložili do dokumentu. Ukončíme návrh formulára a po stlačení tohto tlačidla sa na liste „Kalendar“ vyfarbia zadané dátumy (ktoré, samozrejme, nemusia byť iba sviatky). Ešte upozornime, že na poradí dátumov vôbec nezáleží, pretože sa netestuje ich postupnosť, ale každý sa vyhľadáva sám.


Priradenie makra k tlačidlu“

Pri otváraní tohto kalendára budeme upozornení, že obsahuje makrá a musíme povoliť ich spúšťanie. Preto musíme v nastaveniach OpenOffice.org (položka „Bezpečnosť“) nastaviť takú úroveň, aby sa nás OpenOffice.org aspoň opýtal, či môže toto makro spustiť.


Vlastný kalendár po vyfarbení sviatkov a dní“

Nabudúce: Štýly a formátovanie buniek.

Stránky OpenOffice.org: www.openoffice.sk

    • Otázka... 15.08.2008 | 11:16
      Avatar Lukáš Ubuntu 9.10  Používateľ
      Robím pokusy s macrami a naťukal som toto:
      Sub Kategoria_trafostanice

      Dim premenna As Integer ' This is a comment for variable A
      premenna = 9
      premenna = premenna * 9

      Dim dokument, listy, list_vi, bunka As Object
      'Dim list_vi As Object
      'Dim bunka As Object

      dokument = StarDesktop.CurrentComponent
      list_vi = dokument.Sheets(0)

      bunka = list_vi.getCellByPosition(6, 6)
      bunka.Value = 100

      End Sub

      Len riadok list_vi = dokument.Sheets(0)
      mi vždy pri spustení v tom editore (Open Office Calc 2.4) vyhodí chybu :
      Chyba pri behu.
      Vlastnost alebo metóda nepodporovaná.

      Čo robím zle?
      Juchúúú! Písmenkujem na lukas.cerro.sk
      • Re: Otázka... 16.03.2009 | 14:01
        Kvako   Návštevník
        Musíš tam napísať list_vi = dokument.GetBySheets(0)
        • Re: Otázka... 26.09.2011 | 15:44
          ViSoft81   Návštevník
          Vlastnost nebo metoda nenalezena: GetBySheets.