Programovanie makier v LibreOffice: Funkcie IIf a Choose

LO.png Čakajú nás funkcie IIf a Choose. Funkcia IIf je alternatívou k podmienke If-Else (alebo Select-Case) a funkcia Choose je viacmenej alternatíva k Select-Case, ale funkčne je mierne odlišná.  

Funkcia IIf

V niektorých prípadoch je nepraktické písať podmienky If-Else alebo Select-Case. Ak máme jednú podmienku, ale len odpovede typu ak jedno platí, inak druhé platí, tak je možné použiť funkciu IIf.

Syntax funkcie IIf:

lubovolnaPremenna = IIf (Podmienka, Ak je výraz pravdivý, Ak výraz nie je pravdivý)

Narozdiel od konštrukcie If-Else alebo Select-Case funkcia IIf vracia hodnotu.

1. príklad: Využitie funkcie IIf.

Sub Example   REM začiatok procedúry
             vek = InputBox("Zadajte svoj vek!")   REM vstup od užívateľa
 
             Dim boolValue As Boolean   REM deklarácie premenných
             Dim retazec As String
 
             REM použitie funkcie IIf a priradenie výsledku do reťazca
 
             retazec = IIf(CInt(vek) > 17, "V poriadku! Máš prístup k videám prístupné 
od 18 rokov", "Nemaš 18 rokov! A tak ti zamietam prístup k videám prístupné 
od 18 rokov!")
 
             MsgBox retazec   REM výpis reťazca
 End Sub   REM koniec procedúry

Vstup od užívateľa Vstup od užívateľa

Výsledok Výsledok

Rozbor makra: Po spustení makra užívateľ zadá svoj vek. Následne využijeme funkciu IIf a rozhodneme, či vek je vhodný pre videa vhodné od 18 rokov. Prvý argument funkcie IIf je podmienka. Druhý argument sa vykoná vtedy, ak je podmienka pravdivá. Ak je podmienka nepravdivá, vykoná sa tretí argument. Následne funkcia po vyhodnotení podmienky vráti jednú z týchto argumentov. Funkcia IIf vráti v našom prípade reťazec a odovzdá ho premennej retazec,ktorá sa vypíše na obrazovku. 

Funkcia Choose

Funkcia Choose pracuje s listom. List je zoznam a podobá sa na pole. Ale narozdiel od poľa má iné indexovanie prvkov a vieme bez problémov jednotlivé položky zoznamu pridávať a mazať.

Funkcia Choose nám umožní rýchly prístup k jednotlivým prvkom zoznamu a vykonávať ďalšie operácie. Avšak, list v Choose je využitý pre príkazy alebo premenné a nie ako samostatný list, ktorý si žije svojím „životom“. Choose sa napadne podobá konštrukcie podmienok Select-Case a je to tak. Choose je takou alternatívou k podmienkam, avšak s mierne odlišnou filozofiou použitia. 

Syntax funkcie Choose:

object = Choose(číslo indexu, Select s indexom 1, Select s indexom 2, 
Select s indexom 3,…,...)

Funkcia Choose vracia 0, ak číslo indexu je menšie ako 1. Inak funkcia Choose vráti Select s definovaným indexom. 

2. príklad: Využitie funkcie Choose

Sub Example
             Dim i As Integer   REM deklarácie premennách
             Dim retazec As String
             Dim a As Integer
             Dim b As Integer
 
             a = InputBox("Zadaj prvé číslo!")   REM vstupy od užívateľov
             b = InputBox("Zadaj druhé číslo!")
 
             For i = 1 To 4   REM cyklus
              retazec = retazec & Choose(i, Scitanie(a,b), Odcitanie(a,b), Nasobenie(a,b), 
Delenie(a,b)) & Chr(10)
             Next
 
             MsgBox retazec
 End Sub
 
 
 REM definovanie funkcii
 
 Function Scitanie(a, b) As String
             Dim vysledok As Integer
 
             vysledok = a + b
 
             Scitanie = "Vysledok sčitania čísla: " & a & " a " & b & " je: 
" & vysledok 
End Function
 
 
 Function Odcitanie(a, b) As String
             Dim vysledok As Integer
 
             vysledok = a – b
 
             Odcitanie = "Vysledok odcitania čísla: " & a & " a " & b & " je: 
" & vysledok  
End Function
 
 
 Function Nasobenie(a, b) As String
             Dim vysledok As Integer
 
             vysledok = a * b
 
             Nasobenie = "Vysledok násobenia čísla: " & a & " a " & b & " je: 
" & vysledok  
End Function
 
 
 Function Delenie(a, b) As String
             Dim vysledok As Integer
 
             vysledok = a / b
 
             Delenie = "Vysledok delenia čísla: " & a & " a " & b & " je: 
" & vysledok 
End Function

Vstup od užívateľa Vstup od užívateľa

Vstup od užívateľa Vstup od užívateľa

Výsledok  Výsledok 

Rozbor makra: Užívateľ zadá dve čísla a následne sa spustí cyklus For. V cykle For sa nachádza i celé logika funkcie Choose. Premenná i je postupné zvyšovaná o hodnotu 1 a určili sme, aby premenná i určovala hodnotu indexu listu funkcie Choose. Táto hodnota indexu rozhodne, ktorá funkcia bude vykonaná. Zvyšok by už by mal byť jasný.

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

Komentáře

user avatar neutr
Odpovědět
Programovanie makier v LibreOffice: Funkcie IIf a Choose
19. 04. 2017, 16:29:50
Postupy jsou správně, ale připomínám už podruhé, že číselné výstupy z InputBoxu umí sice Basic rozpoznat jako čísla, ale vždy to tak nebylo a také se to může znovu změnit.

S poměrně chaotickým rozvojem se objevují nejen nečekané chyby, ale také chyby staro-nové. Nyní se objevila chyba při použití "select" respektive "transferable". To už jsme také zažili. Chyba se projeví když načítáme ze zavřených dokumentů (ale zejména ze skrytých) listů aktuálního dokumentu.

Původně vyskočilo chybové hlášení, ale nyní bez jakéhokoliv varování (LO 5.3.2.2) funkce provede operaci na nejbližším otevřeném listu. Původně se to dalo najít jenom v případě použití UNO. Bez UNO to chodilo. Nyní mi to dělají i čisté basic kódy. Jen málokdo má představu co se musí udělat aby se taková chyba odladila.

Původně to šlo obejít například pomocí OnError GoTo - návěští, nebo nula ap. Nyní už chybová hláška nic nehlásí a tím pádem se nic neřeší a je to bez zkušeností prakticky neřešitelné.

Ale to je jenom na okraj proč doporučuji "zbytečnou" operaci.
user avatar lp.
Odpovědět
Programovanie makier v LibreOffice: Funkcie IIf a Choose
21. 04. 2017, 17:21:57
"Prvý argument funkcie IIf je podmienka. Druhý argument sa vykoná vtedy, ak je podmienka pravdivá. Ak nie je pravdivá, tak sa vykoná tretí argument."

Otestujete makro:

Sub Main
vek = 5
IIf(CInt(vek) > 17, _
msgbox ("V poriadku! Máš prístup k videám prístupné od 18 rokov"), _
msgbox ("Nemaš 18 rokov! A tak ti zamietam prístup k videám prístupné od 18 rokov!"))
End Sub

A vysvětlete chování.

IIF je dost nepříjemná funkce. Jen na jednoduché věci.
user avatar neutr
Odpovědět
Programovanie makier v LibreOffice: Funkcie IIf a Choose
21. 04. 2017, 22:19:18
Většinou vše hned testuji, ale nyní jsem to neudělal a tak jsem svou první poznámku asi neměl vůbec psát. S tím IIF je opravdu někdy obtížná práce. Já to vždy testuji jestli to funguje tak jak potřebuji. Právě tak jsem přišel na to, že místo CDbl, CInt a CLng bývá výhodnější hned výstup Inputboxu postavit jako Val a je po starosti.

S těmi příklady je to takto :
'---------------------------
Sub Main
vek = 5
MsgBox IIf(CInt(vek) > 17, _
"Máš prístup k videám prístupné od 18 rokov", _
"Nemaš 18 rokov! A tak ti zamietam prístup k videám prístupné od 18 rokov!")
End Sub
'---------------------------
Sub Main1_1 ' Chyba
vek = InputBox("Zdejte věk","Podmínka přístupu",5)
sVar = IIf(vek > 17, "ANO - Máš přístup", "NE - Nemáš přístup")
MsgBox sVar
End Sub
'---------------------------
Sub Main1_2 ' Správně
Dim vek%
vek = InputBox("Zdejte věk","Podmínka přístupu",5)
sVar = IIf(vek > 17, "ANO - Máš přístup", "NE - Nemáš přístup")
MsgBox sVar
End Sub
'---------------------------
Sub Main2 ' Správně
vek = Val(InputBox("Zdejte věk","Podmínka přístupu",5))
sVar = IIf(vek > 17, "ANO - Máš přístup", "NE - Nemáš přístup")
MsgBox sVar
End Sub
'---------------------------
Sub Main3 ' Správně
vek = InputBox("Zdejte věk","Podmínka přístupu",5)
sVar = IIf(CInt(vek) > 17, "ANO - Máš přístup", "NE - Nemáš přístup")
MsgBox sVar
End Sub
'---------------------------


Je to tak, že do výstupů funkce IIF nedávám například výpočtové operace. Dokonce nedoporučuji používat jinak nežli :
proměnná Var
Var = IIF(podmínka,nejlépe True,nebo False),
Funkce IIF nemusí "nabíjet" jenom proměnnou. Může sama přímo větvit ale v těchto případech je výsledek velmi nejistý. Je lepší :
Log = IIF(něco,True,False) nežli
IIF(něco,Log=True,Log=False)

Ještě jednou se omlouvám. To CInt jsem přehlédl, ale výstup Inputboxu se chová opravdu čas od času jinak nežli jsme zvyklí. Nyní zase čte string a ten se musí přetypovat. To je možné více způsoby.
user avatar lp.
Odpovědět
Programovanie makier v LibreOffice: Funkcie IIf a Choose
22. 04. 2017, 00:16:04
OK.

Tvrzení : "Prvý argument funkcie IIf je podmienka. Druhý argument sa vykoná vtedy, ak je podmienka pravdivá. Ak nie je pravdivá, tak sa vykoná tretí argument."

JE CHYBNÉ.

Ve funkci IIF se VŽDY vyhodnocují obě varianty a teprve potom se vrátí výsledek jedné z nich.

To v případě výrazů ve funkci Iif zbytečně prodlužuje dobu běhu makra a občas to vede k nečekaným chybám. Jak dopadne:

a = 0
var = iif(a=0, "NA", 5/a)

(dělení nulou)
user avatar Eduard Boldižár
Odpovědět
Re:Programovanie makier v LibreOffice: Funkcie IIf a Choose
22. 04. 2017, 12:46:32
Vďaka za podnetnú diskusiu, tvrdenie upravím.

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.

 
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.

 
 
 
woo jaw demo hz