Acronis

Programovanie makier v LibreOffice: Podmienky (1)

LO.png Týmto článkom započnem sériu dielov o cykloch a podmienkach. V minulých častiach som spomínal, že funkcie a príkazy delíme podľa ich použiteľností. Cykly a podmienky patria do sekcie riadenie chodu makra.  

Riadenie chodu makra

Predstavte si situáciu, že potrebujete do každej bunky tabuľky zapísať nejaké hodnoty. Tabuľka má povedzme 100 políčok. Klasickou cestou by ste pri tvorbe makra museli pracne zapísať každú akciu s tabuľkou. Len si pomyslíte, koľko príkazov by ste museli zapísať.

Najprv sa musíte presunúť do danej bunky tabuľky, napísať do nej hodnotu a presunúť sa do ďalšej bunky tabuľky. Nemusíte sa báť z toľkej práce. Už pri zrode programovacích jazykov sa dbalo na podporu cyklov a podmienok.

Prikazy If, ElseIf, Else a End If

Všetky príkazy uvedené v názve tejto podkapitoly majú za úlohu vetviť program na základe splnenia/nesplnenia podmienky.

Kedy môžeme použiť podmienky? Všade tam, kde potrebujeme vyhodnotiť nejaký výraz. Napríklad máme porovnanie dvoch čísel: 5>10. Ak platí táto podmienka, choď ďalej v programe, ak nie, tak zobraz chybu a ukončí program. To je slovný popis jednej z možných situácii, ktorú môžete naprogramovať.

Ukážme si zaujímavý príklad, kde si ukážeme podmienky v praxi.

Príklad 1: makro na kontrolu vstupného údaju

Sub KontrolaVstupu REM začiatok procedúry/makra
Dim sprava As String REM deklarácia premennej
Vstup = InputBox("Zadajte hodnotu", "Hodnotenie vstupu") REM vytvorenie okna, 
v ktorom zadáme hodnotu
Cislo = IsNumeric(Vstup) REM test, či premenná je číselná hodnota
Datum = IsDate(Vstup) REM test, či premenná je dátum
If Vstup = "" Then REM zisťovanie typu premennej po testovaní
sprava = "Nezadaná žiadna hodnota"
Elseif Cislo = True Then 
sprava = "Bola zadaná číselná hodnota"
Elseif Datum = True Then
sprava = "Bol zadaný dátum"
Else
sprava = "Bol zadaný text"
End If REM výsledok sa vypíše
Print sprava REM výpis výsledku
End Sub REM koniec procedúry

Výsledok:

Zadanie číselnej hodnoty a stlačenie tlačítka OK Zadanie číselnej hodnoty a stlačenie tlačítka OK

Výsledok Výsledok

Popis makra: v makre využijeme funkciu InputBox. Po zobrazení dialógového okna makro čaká na vstupný údaj. Po zadaní údaju klikneme na tlačidlo OK a zadaná premenná bude priradená premennej Vstup. Premennú Vstup testujeme, či je číslo alebo dátum pomocou funkcii IsDate a IsNumeric.

Teraz chceme zobraziť výsledok. Použijeme podmienky If, ElseIf, Else a koniec častí podmienok End If.

Prečo píšeme toľko typov podmienok? Pretože ako vidíme, program najprv otestuje, či vôbec je nejaká premenná na vstupe. Ak nie, tak kontroluje ElseIf. Ak funkcia IsDatum zistí, že premenná je dátum alebo IsNumeric, že je číslo, návratová funkcia bude 0, čo je v logickej reči vo Visual Basicu True (pravda). Podľa návrhu makra je posledná podmienka Else, pretože ak všetky doterajšie podmienky boli nesplnené, nastane už len posledná možnosť.

Pri If a ElseIf píšeme podmienky. Pri Else nie. Pretože Else považujeme za východiskovú podmienku, ktorá vždy nastane, ak ostatné nenastali. Takže máme tri stratégie pri používaní podmienok If, Else a ElseIf. End If berieme ako štandardné ukončenie tela podmienok.

1. stratégia: využitie If

If podmienka Then
príkaz 1
príkaz 2
…
End If

Upozornenie: príkazy za slovíčkom Then sa nepíšu! Musíte sa posunúť o riadok nižšie, inak vám neprejde kontrola makra. Avšak, existuje výnimka, kde to môže napísať jednoriadkovo. Ak ide len o jeden príkaz a bez použitia End If.

Syntax je nasledovná:

If podmienka Then príkaz

2. stratégia: Použitie If a Else

If podmienka Then
príkazy
…
Else
príkazy
…
End If

3. stratégia: Použitie If a ElseIf

If podmienka1 Then
príkazy
…
ElseIf podmienka2 Then 
príkazy
…
Else (tento príkaz nie je povinný v tretej stratégii, riaďte sa podľa vášho návrhu makra)
príkazy 
…
End If

Viaceré príkazy

Podmienky môžu mať tvár Čislo>133 ale aj tvár Číslo > 133 And Číslo < 222. Taktiež Visual Basic umožňuje vrstviť viacero príkazov.

If podmienka1 Then
If podmienka2 Then
If podmienka3 Then
príkazy
…
End If
End If
End If

Príkazy sa uskutočnia až po splnení všetkých podmienok.

Pokračovať v tejto téme budeme nabudúce.

(Jako ve škole) Průměr: 3.50 | Hodnotilo: 8
 

Komentáře

user avatar neutr
Odpovědět
Programovanie makier v LibreOffice: Podmienky (1)
4. 05. 2016, 11:48:10
Edo jen malý detail. InputBox je z principu typem proměnné string. InputBox to předá a sešit to vezme jako číslo - v textové podobě. Libre office umí i s takovým číslem počítat, ale když se zadá například do buňky přímo - například [i]Cell.Value = Vstup[/i] tak se objeví nula.

V tomto případě se to obchází dotazem, který to vyhodnotí správně jako IsNumeric(), ale aby to šlo použít musí být předeklarováno na číslo.
- Tedy buď Val([i]Vstup[/i]), nebo hned na začátku obalit InputBox
- Vstup = Val(InputBox("Zadajte hodnotu", "Hodnotenie vstupu"))

Potom již dotaz na typ není potřeba, ale někdy se hodí opravdu dodefinovat typ dodatečně. Datumové a časové funkce mohou být v textovém tvaru, ale jde z principu o čísla. Takže například
IF IsNumeric(Vstup) = true Then
cislo = Val(Vstup)
ElseIF ......
...
End If
user avatar Eduard Boldižár
Odpovědět
Re:Programovanie makier v LibreOffice: Podmienky (1)
4. 05. 2016, 18:52:49
ďakujem za reakciu, človek vždy všetko neošetrí a stále sa má čo učiť ;)
user avatar lp.
Odpovědět
Programovanie makier v LibreOffice: Podmienky (1)
4. 05. 2016, 13:31:48
Dovolím si trochu kritiky.

* Nějak jsem zatím neviděl zmínku o deklaraci

option explicit

Hodí se nejen začátečníkům.

* Bylo by možné ukázky maker odsazovat? Mizerně se to čte.

* Ukázky typu:

Cislo = IsNumeric(Vstup)
...
Elseif Cislo = True Then
...

se mi moc nelíbí.
- Proměnná Císlo neobsahuje číslo, ale boolovskou proměnnou. K čitelnosti to nepřispívá.
- Proč je tak častá touha vyhodnocovat booleovské proměnné testem True = True ?

Pro mne je výraz

Elseif IsNumeric(Vstup) Then

podstatně čitelnější.
user avatar Eduard Boldižár
Odpovědět
Re:Programovanie makier v LibreOffice: Podmienky (1)
4. 05. 2016, 18:35:36
O Option Explicit už som čitateľov oboznámil v tomto článku http://www.openoffice.cz/navody/programovanie-makier-v-libreoffice-deklaracie-premennych a v tomto dieli mi ako nutnosť použitia Option Explicit neprišla, mal som v pláne ukázať iné veci. Samozrejme, každá oblasť sa dá vysvetliť mnohými príkladmi, ale ďakujem za feedback. Áno, nabudúce už budem osadzovať
user avatar Petr
Odpovědět
Programovanie makier v LibreOffice: Podmienky (1)
26. 10. 2016, 19:59:09
Ahoj,

nějak mi ten příklad v počítači neběžel, tak jsem to zkusil trochu upravit:

Sub KontrolaVstupuReinvented
inpt = InputBox("Zadejte data")
nmbr = IsNumeric(inpt)
dt = IsDate(inpt)

Print "číslo = " + nmbr
Print "datum = " + dt 'POZOR: když nejsou zadáda žádná data, BASIC vyhodotí vstup jako datum!

If inpt = "" Then
Print "Nebyla zadána žádná data!"
Elseif nmbr = True Then
Print "Bylo zadáno číslo"
Elseif dt = True Then
Print "Bylo zadáno datum"
Else
Print "Byl zadán textový řetězec"
End If

End Sub

Nejvíc mě ale překvapilo, že se mi proměnná inpt, pokud nejsou zadána žádná data, vyhodnocuje jako datum. Nevíte někdo, proč to tak je?
user avatar j-pastierik
Odpovědět
Re:Programovanie makier v LibreOffice: Podmienky (1)
28. 10. 2016, 07:58:36
IsDate("") vracia hodnotu True, je to jej vlastnosť.
user avatar neutr
Odpovědět
Re:Programovanie makier v LibreOffice: Podmienky (1)
28. 10. 2016, 18:14:45
Tohle je dané nastavením buňky. jde o to, že můžete zasat "nic" s OK, nebo zrušit - pak by tam mělo být false, ale verze AOO/LO se mohou odlišovat. Dodnes některé funkce sešitu vrací FALSE = 0 a TRUE = 1, nebo FALSE = -1 a TRUE = 0. Inputbox by měl vracet -1/0.


Když tedy zaentrujete nic - je to nula, nebo jednička. Pak už stačí mít zapnuté automatické rozpoznávání formátu a hopne tam datum - nejspíš 31. prosinec 1899, nebo 1. leden 1900.


Ono stačí navolit čísla (volba "vše" udělá často datumy). Stane se někdy i při této volbě, že tam dříve datumy byly, obsah se smazal, ale formát zůstal. Takže se podívejte na FORMÁT > BUŇKY > ČÍSLA. Podobný problém Vás může potkat s logickou hodnotou. Když tam zapomenete logický formát který vznikl zejména chybným zadáním vzorců tak to vrací FALSE/TRUE. Když navíc budete mít úzké sloupce bude to vypadat jako chyba.
user avatar neutr
Odpovědět
Re:Re:Programovanie makier v LibreOffice: Podmienky (1)
28. 10. 2016, 18:26:11
To hlasní jsem vynechal - omlouvám se.

Jakmile byla proměnná dříve zadeklarovaná tak pochopitelně vrací datum vždy (datumy 0 a 1 jsou ta historická data přelomu 1899/1900).

To má ing Pastierik pravdu - chtěl jsem jen napsat že jste měl předeklarovat proměnnou stejně jako byste to musel udělat s formátem u buňky sešitu.

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.

 
Konstruktéři
Eduard Boldižár

Eduard Boldižár

Som redaktorom stránky astrotech.cz. Mám 24 rokov. Čas trávim v IT škole. Medzi moje záľuby patrí astronómia, sci-fi literatúra a programovanie.

 
GFI Unlimited
 
 
woo jaw demo hz