Komentáře Programovanie makier v LibreOffice: Funkcie IIf a Choose

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.
 
 
woo jaw demo hz