Komentáře Postřehy z konference InstallFest 2020

user avatar kamlan
Odpovědět
Název listu do buňky
13. 03. 2020, 13:04:09
S využitím vlastní fce to jde myslím jednodušeji, neboť v makru se lépe kouskuje řetězec, resp. ve vzorcích nejspíš musím vždy zadávat vícekrát název kouskovaného řetězce abych dostal nějakou jeho požadovanou část - např. jako je tomu uvedeno v příkladě, kde je třeba 2x CELL("Filename"). Kdežto když vytvořím vlastní vzorec tak tam onen parametr mohu zadat jen jednou a potřebné části z něj získám v makru.
Je však stále potřeba přidat i druhý parametr aby se vzorec aktualizoval např. při přejmenování listu -> a funkce RAND() na tu aktualizaci slouží skutečně asi nejlépe.
Takže výsledek může být třeba takto:


Function NAZEVLISTU(s$,a) as string 'vrátí část řetězce od prvního $ do části .$A$1
s=mid(s,inStr(1,s,"$",0)+1) 'název od prvního $
s=mid(s,1,inStr(1,s,".$A$1",0)-1) 'název až do .$A$1
if inStr(1,s,"'",0)=1 then s=mid(s,2) 'odstranit případnou první uvozovku
if inStr(1,s,"'",0)=len(s) then s=mid(s,1,len(s)-1) 'odstranit případnou poslední uvozovku
NAZEVLISTU=s
End Function


A do buňky se zadává: =NAZEVLISTU(CELL("Address";$List2.$A$1);RAND())

kde List2 je list jehož název chci dostat.
Jelikož jde jen o vypsání názvu listu a nezáleží tedy na kterou buňku je odkazováno, použil jsem část adresy .$A$1 pro stanovené kouskování řetězce v makru, čili tuto část ($A$1) tedy neměnit.

Kdyby přeci jen mělo (třeba někdy jindy) záležet na odkazované buňce, tak jiný způsob rozdělení řetězce by mohl být třeba podle poslední tečky v dané adrese, neboť listy lze pojmenovat s tečkou a výsledný řetězec ze kterého bych chtěl dostat název listu by mohl vypadat třeba takto: $'List.222'.$A$1 -> a pak by bylo potřeba zjišťovat třeba právě pozici poslední tečky (tedy až té před $A$1 a nikoliv té předešlé v List.222) a vrátit řetězec třeba opět od prvního $ až do té poslední tečky. Což není nic těžkého a dá se na to použít třeba kouskování řetězce i přes regulární výrazy, nicméně pro ukázku jsem uvedl snad to nejjednodušší :-) - ostatně vždy je snažší dělat něco pro jednoznačné zadání než se trápit pro rádoby univerzální řešení na další a další kombinace typu: "a co kdyby to bylo ještě takhle onakhle" ... "až nakonec úplně mákle".
user avatar kamlan
Odpovědět
Re:Název listu do buňky
13. 03. 2020, 13:35:55
Jen drobná úprava, vzpomněl jsem si že jsou i funkce LEFT a RIGHT a nikoliv jen MID a INSTR :-).


Function NAZEVLISTU(s$,a) as string 'vrátí část řetězce od prvního $ do části .$A$1
s=mid(s,inStr(1,s,"$",0)+1) 'název od prvního $
s=mid(s,1,inStr(1,s,".$A$1",0)-1) 'název až do .$A$1
if left(s,1)="'" then s=mid(s,2) 'odstranit případnou první uvozovku
if right(s,1)="'" then s=mid(s,1,len(s)-1) 'odstranit případnou poslední uvozovku
NAZEVLISTU=s
End Function
user avatar Petr Valach
Odpovědět
Re:Re:Název listu do buňky
12. 11. 2020, 17:04:10
Dodatečně díky za vaše příspěvky, díky též za vaši činnost na fóru i zde. Chtěl byste se trochu víc zapojit do LibreOffice? Dejte mi vědět na petr.valach(a)libreoffice.org. Děkuji!
user avatar kamlan
Odpovědět
Re:Název listu do buňky
14. 11. 2020, 21:03:15
Tak ještě čistě bez vlastní funkce :-). Jsou však dvě varianty. První je jednodušší, ale název listu vloží jen do jiných listů, do aktuálního listu (čili do listu "sebe samého") vkládá jen $A$10 případně nic. Autopřepočítávání je děláno funkcí RAND.

Zde to aktuálního listu vloží $A$10.
=REGEX(CELL("Address";$List1.$A$1) & TRUNC(RAND()-0,5);"\$'?(.+?)'?\.\$A\$1.*";"$1")

Zde to do aktuálního nevloží nic.
=REGEX(CELL("Address";$List1.$A$1) & RAND();"\$?'?(.*?)'?\.?\$A\$1.*";"$1")


Druhá varianta je univerzální a název listu vkládá do jakékoliv buňky, i v aktuálním listě. To je těžší a je tam podmínka kdy se testuje co vlastně CELL("Address";...) vrátila. Když vrátí $A$10 tak je buňka v aktuálním listu a název listu se vezme z CELL("filename") jako to je v článku; jinak vrátí adresu z reguláru jako v první variantě. Odkaz na buňku (List1.$A$1) se však do vzorce musí vkládat na dvou místech. Automatické přepočítávání vzorce zajišťuje funkce RANDBETWEEN(0;0), která takto vždy vrátí nulu.

=IF(CELL("Address";$List1.$A$1) & RANDBETWEEN(0;0)="$A$10";MID(CELL("filename");FIND("#$";CELL("filename"))+2;LEN(CELL("filename")));REGEX(CELL("Address";$List1.$A$1);"\$'?(.+?)'?\.\$A\$1.*";"$1"))
user avatar kamlan
Odpovědět
Re:Re:Název listu do buňky
14. 11. 2020, 22:31:38
Akorát mi nějak nedošlo že nejjednodušší způsob jak získat z RAND() nulu je 0*Rand(), proto předtím ten TRUNC a RANDBETWEEN, uviděl jsem to až na bugzille :-). Takže takhle:

=REGEX(CELL("Address";$List1.$A$1) & 0*RAND();"\$'?(.+?)'?\.\$A\$1.*";"$1")

=REGEX(CELL("Address";$List1.$A$1) & RAND();"\$?'?(.*?)'?\.?\$A\$1.*";"$1")

=IF(CELL("Address";$List1.$A$1) & 0*RAND()="$A$10";MID(CELL("filename");FIND("#$";CELL("filename"))+2;LEN(CELL("filename")));REGEX(CELL("Address";$List1.$A$1);"\$'?(.+?)'?\.\$A\$1.*";"$1"))
 
 
woo jaw demo hz