Fórum pro uživatele kancelářského balíku OpenOffice | LibreOffice
 

#1 16. 11. 2010 20:52:26

AIN
Člen
Místo Plzen
Registrace: 26. 3. 2010
Příspěvků: 22

Skládání řetězců

AHoj,
potřeboval bych si poskládat řetězec písmen jako je to běžně v programovacích jazycích, ale nedaří se mi to pomocí dostupných funkcí v Calcu udělat.

Jde mi např. o to, abych číslo (např. čas ve f1)

1,20:418

uměl poskládat.

"1,"+"20:"+"418"

Pomocí plus to ale nejde.

Např. číslo 80,418 potřebuji poskládat do řetězce 1,20:418

Editoval AIN (16. 11. 2010 20:58:18)

Offline

#2 16. 11. 2010 21:16:14

hanus
Člen
Místo Olomouc
Registrace: 29. 11. 2006
Příspěvků: 573
Web

Re: Skládání řetězců

="1,"&"20:"&"418"
pokud máte ty konkrétní hodnoty v buňkách, řekněme v A1 je 1, v B1 je 20 a v C1 je 418, pak do D1 vložíte
=A1&","&B1&":"&C1


pokud budete mít v buňce A4 číslo 80,418 tak vámi požadovaný výstup dosáhnete např. pomocí vzorce
=TRUNC(A4/60)&","&TRUNC(MOD(A4;60))&":"&TRUNC((A4-TRUNC(A4))*1000)


Vypadá to složitě, ale jde o to získat z čísla počet minut, zbývající počet sekund nad celé minuty a desetinnou část a pak to pospojovat pomocí & a vložit mezi to tu čárku a dvojtečku. Možná se někomu ten vzorec podaří zjednodušit.

Editoval hanus (16. 11. 2010 21:27:55)

Offline

#3 16. 11. 2010 21:21:56

Ondra.kl
Člen
Registrace: 30. 9. 2008
Příspěvků: 933

Re: Skládání řetězců

"+" je matematický operátor pro sčítání, řetězce opravdu skládat neumí.
K tou slouží buďto funkce =CONCATENATE(), nebo operátor "&".

Viz rejstřík nápovědy (dle OOo 3.2.1):
- operátory;funkce vzorců
- functions;text functions

Offline

#4 16. 11. 2010 21:25:27

AIN
Člen
Místo Plzen
Registrace: 26. 3. 2010
Příspěvků: 22

Re: Skládání řetězců

hanus napsal(a)

="1,"&"20:"&"418"
pokud máte ty konkrétní hodnoty v buňkách, řekněme v A1 je 1, v B1 je 20 a v C1 je 418, pak do D1 vložíte
=A1&","&B1&":"&C1


Ano, děkuji moc! Funguje to.
Udělal jsem to jako:

="1,"&INT(E10-60)&":"&RIGHT(E10;3)

Přesně tak to má být. Zkoušel jsem to i pomocí CONCATENATE, ale tam se zdá, že nejde převádět číslo na text.

Offline

#5 16. 11. 2010 21:37:57

AIN
Člen
Místo Plzen
Registrace: 26. 3. 2010
Příspěvků: 22

Re: Skládání řetězců

Udělal jsem to sice trochu neelegantně, ale funguje to.

Nedá se tu náhodou vložit příloha? Přece jen jsem ještě nepřišel na to, jak udělat průběžné řazení.

Offline

#6 16. 11. 2010 21:52:29

hanus
Člen
Místo Olomouc
Registrace: 29. 11. 2006
Příspěvků: 573
Web

Re: Skládání řetězců

Přílohu do příspěvků nelze vložit, musíte dát odkaz na soubor umístěný někde jinde (na vašem FTP, webu či v úložně).

Průběžným řazením máte na mysli co? Bude to asi komplikovanější, přece jen vzorce mají jisté limity, protože v nich nemůžete používat klasické programovací struktury jako např. iterace (vlastně lze, ale oklikou a omezeně).

Offline

#7 16. 11. 2010 22:01:51

AIN
Člen
Místo Plzen
Registrace: 26. 3. 2010
Příspěvků: 22

Re: Skládání řetězců

OK, díky. Udělal jsem to zatím takhle, aby bylo zřejmé, o co mi jde.

http://profi.edisk.cz/stahnout-soubor/4 … .25KB.html

Je to vlastně pořadí časů a dole se počítá průměr časů. Ale jestli to nepůjde řadit, tak to zas tak nevadí. Nevím, jak si ale poradit s těmi neelegantními čísly napravo, můžu je samozřejmě zabělit, ale není to ono smile


P.S. Říkal jsem si, udělat třeba nějaké jednoduché makro na bublání, aby to průběžně řadilo ty časy, ale asi by to taky nebylo jen tak.

Editoval AIN (16. 11. 2010 22:04:01)

Offline

#8 16. 11. 2010 22:34:00

hanus
Člen
Místo Olomouc
Registrace: 29. 11. 2006
Příspěvků: 573
Web

Re: Skládání řetězců

Koukám, že zdrojová data jsou právě ve formě 1:20,418 a to převádíte na vteřiny, abyste to asi mohl seřadit a spočítat z toho průměr a pak zase asi převést zpět na původní formát?

Seřazení ručně pomocí Data-Řadit vám nevyhovuje? Musíte nejprve označit celou oblast dat, zde tedy A2:D9.

Koukám, že seřazení podle těch originálních hodnot ve formátu 1:20,418 dopadne stejně, takže pro řazení by ten pomocný sloupec nebyl potřeba. Teď ještě jak z těch originál hodnot spočítat průměr jedním vzorcem :-)

Offline

#9 16. 11. 2010 22:36:31

AIN
Člen
Místo Plzen
Registrace: 26. 3. 2010
Příspěvků: 22

Re: Skládání řetězců

hanus napsal(a)

Koukám, že zdrojová data jsou právě ve formě 1:20,418 a to převádíte na vteřiny, abyste to asi mohl seřadit a spočítat z toho průměr a pak zase asi převést zpět na původní formát?

Seřazení ručně pomocí Data-Řadit vám nevyhovuje? Musíte nejprve označit celou oblast dat, zde tedy A2:D9.

Koukám, že seřazení podle těch originálních hodnot ve formátu 1:20,418 dopadne stejně, takže pro řazení by ten pomocný sloupec nebyl potřeba. Teď ještě jak z těch originál hodnot spočítat průměr jedním vzorcem :-)

To řazení jak říkáte by vlastně šlo, nebyl by to problém. Převádím to jinak na ty vteřiny, abych mohl udělat průměr a pak to zpětně převést na ten základní formát, ale jak to udělat jedním vzorcem - nad tím právě koumám smile

Offline

#10 16. 11. 2010 23:32:34

hanus
Člen
Místo Olomouc
Registrace: 29. 11. 2006
Příspěvků: 573
Web

Re: Skládání řetězců

Tak už to mám dlouho, jen byla chyba v uzávorkování: z těch originálních hodnot vypočtete průměr pomocí maticového vzorce
=AVERAGE(VALUE(LEFT(B2:B9;1))*60+VALUE(MID(B2:B9;3;2))+VALUE(MID(B2:B9;6;3))/1000)
- vkládání ukončete pomocí CTRL+SHIFT+ENTER

Problémy:
1) výsledek je v sekundách, nikoli ve formátu 1,20:784
2) rozsah buněk musí odpovídat jen vyplněným, nesmí zahrnovat prázdné buňky, jinak vrátí chybu

Offline

#11 16. 11. 2010 23:35:36

hanus
Člen
Místo Olomouc
Registrace: 29. 11. 2006
Příspěvků: 573
Web

Re: Skládání řetězců

ad 2) vyřešeno přidáním podmínky:
=AVERAGE(IF(B2:B23<>"";VALUE(LEFT(B2:B23;1))*60+VALUE(MID(B2:B23;3;2))+VALUE(MID(B2:B23;6;3))/1000;""))

opět nutno vložit jako maticový vzorec

Offline

#12 16. 11. 2010 23:49:20

hanus
Člen
Místo Olomouc
Registrace: 29. 11. 2006
Příspěvků: 573
Web

Re: Skládání řetězců

ad 1) vyřešeno: výsledek se musí převést na dny (tj. výsledný průměr vydělit 60*60*24), aby šel na buňku použít formátovací kód vnitřní interpretace času:


=AVERAGE(IF(B2:B23<>"";VALUE(LEFT(B2:B23;1))*60+VALUE(MID(B2:B23;3;2))+VALUE(MID(B2:B23;6;3))/1000;""))/(60*60*24)


opět nutno vložit jako maticový vzorec + buňce nastavit vlastní formátování výstupu na formát
M,S:000
tj. přes Formát-Buňky-Čísla-Formátovací kód

Výsledek je zde: http://ooo.e-hanus.cz/kvalifikace.ods

Editoval hanus (17. 11. 2010 00:01:04)

Offline

#13 17. 11. 2010 00:05:16

hanus
Člen
Místo Olomouc
Registrace: 29. 11. 2006
Příspěvků: 573
Web

Re: Skládání řetězců

Tak koukám, že Calc po uložení a znovuotevření zprzní ten formát M,S:000 na M,S,000: takže jsem k formátování výstupu použil místo formátu buňky funkci TEXT a výsledná funkce má tedy tvar


=TEXT(AVERAGE(IF(B2:B23<>"";VALUE(LEFT(B2:B23;1))*60+VALUE(MID(B2:B23;3;2))+VALUE(MID(B2:B23;6;3))/1000;""))/(60*60*24);"M,SS:000")


vloženo opět do buňky jako maticový vzorec pomocí CTRL+SHIFT+ENTER.

Editoval hanus (17. 11. 2010 00:13:12)

Offline

#14 17. 11. 2010 13:43:10

AIN
Člen
Místo Plzen
Registrace: 26. 3. 2010
Příspěvků: 22

Re: Skládání řetězců

Úžasný, opravdu to funguje! smile

Ty maticové vzorce mě nenapadly, ještě prozkoumám celý ten vzorec, abych se přiučil. Každopádně díky moc, dobrá práce, fakt geniální!! ;-)

Offline

#15 17. 11. 2010 14:19:57

lp.
Člen
Registrace: 24. 9. 2009
Příspěvků: 842

Re: Skládání řetězců

Pro převod čísla 80,418 na čas funkce existuje (čas je v sekundách): 

=TEXT(A4/(24*60*60);"[M],SS:000")

Převedení textové hodnoty '01:20,418 na čas provede funkce

=value("01:20,418")

Pokud správnou hodnotu maáte v buňce a potřebujete jen změnit formát, použijte uživatelský formát, třeba "[M],SS:000"

Tj. s buňkami není nuno manipulovat, stačí je uložit v normálním formátu času, zobrazení řeší uživatelský formát a průměry fungují normálně.

Editoval lp. (17. 11. 2010 14:20:17)

Offline

#16 17. 11. 2010 14:29:28

AIN
Člen
Místo Plzen
Registrace: 26. 3. 2010
Příspěvků: 22

Re: Skládání řetězců

lp. napsal(a)

Pro převod čísla 80,418 na čas funkce existuje (čas je v sekundách): 

=TEXT(A4/(24*60*60);"[M],SS:000")

Převedení textové hodnoty '01:20,418 na čas provede funkce

=value("01:20,418")

Pokud správnou hodnotu maáte v buňce a potřebujete jen změnit formát, použijte uživatelský formát, třeba "[M],SS:000"

Tj. s buňkami není nuno manipulovat, stačí je uložit v normálním formátu času, zobrazení řeší uživatelský formát a průměry fungují normálně.

Jo to je taky dobrý nápad, ono mě ale zmátlo to, že do funkce často nešlo vložit převod čísla na text a naopak.

Např. chová se divně: =TEXT(INT(COUNT(F2:F1000)/2))
zatímco =INT(COUNT(F2:F1000)/2) vrací opravdu počet výskytů mezi F2 a F1000. Proč to nejde kombinovat?

Editoval AIN (17. 11. 2010 15:23:58)

Offline

#17 17. 11. 2010 20:03:04

AIN
Člen
Místo Plzen
Registrace: 26. 3. 2010
Příspěvků: 22

Re: Skládání řetězců

Kdyby to šlo nějak kombinovat, tak by bylo možný vypočítávat počet buněk.
Např. chci oblast A1:Ax z toho to X se musí vždy vypočítat. Jenže zápis např. A1:(INT(COUNT(B1:B20)) nefunguje.

Offline

#18 17. 11. 2010 20:29:19

lp.
Člen
Registrace: 24. 9. 2009
Příspěvků: 842

Re: Skládání řetězců

AIN napsal(a)

Např. chová se divně: =TEXT(INT(COUNT(F2:F1000)/2))
zatímco =INT(COUNT(F2:F1000)/2) vrací opravdu počet výskytů mezi F2 a F1000. Proč to nejde kombinovat?

Funkce text vyžaduje zadání formátu.

=TEXT(INT(COUNT(F2:F1000)/2);"0") funguje.

Offline

#19 17. 11. 2010 20:33:49

AIN
Člen
Místo Plzen
Registrace: 26. 3. 2010
Příspěvků: 22

Re: Skládání řetězců

lp. napsal(a)
AIN napsal(a)

Např. chová se divně: =TEXT(INT(COUNT(F2:F1000)/2))
zatímco =INT(COUNT(F2:F1000)/2) vrací opravdu počet výskytů mezi F2 a F1000. Proč to nejde kombinovat?

Funkce text vyžaduje zadání formátu.

=TEXT(INT(COUNT(F2:F1000)/2);"0") funguje.

Aha, opravdu, to jsem nevěděl. Ale co když chci teď určit toto číslo do rozsahu dat. Vím, že vyšlo 20, jak tedy zavést např. =AVERAGE(A1:A20) ?

Offline

#20 17. 11. 2010 20:36:21

lp.
Člen
Registrace: 24. 9. 2009
Příspěvků: 842

Re: Skládání řetězců

AIN napsal(a)

Kdyby to šlo nějak kombinovat, tak by bylo možný vypočítávat počet buněk.
Např. chci oblast A1:Ax z toho to X se musí vždy vypočítat. Jenže zápis např. A1:(INT(COUNT(B1:B20)) nefunguje.

použijte

OFFSET(A1;0;0;INT(COUNT(B1:B20));1)

nebo

A1:INDEX(A1:A20;INT(COUNT(B1:B20)))

(Pokud chcete používat operátor ":", musíte po obou stranách použít funkce, které vrací odkaz.)

Offline

#21 17. 11. 2010 20:44:26

hanus
Člen
Místo Olomouc
Registrace: 29. 11. 2006
Příspěvků: 573
Web

Re: Skládání řetězců

nebo např. =AVERAGE(INDIRECT("A1:A"&INT(COUNT(B1:B20))))

Offline

#22 17. 11. 2010 20:56:34

AIN
Člen
Místo Plzen
Registrace: 26. 3. 2010
Příspěvků: 22

Re: Skládání řetězců

lp. napsal(a)
AIN napsal(a)

Kdyby to šlo nějak kombinovat, tak by bylo možný vypočítávat počet buněk.
Např. chci oblast A1:Ax z toho to X se musí vždy vypočítat. Jenže zápis např. A1:(INT(COUNT(B1:B20)) nefunguje.

použijte

OFFSET(A1;0;0;INT(COUNT(B1:B20));1)

nebo

A1:INDEX(A1:A20;INT(COUNT(B1:B20)))

(Pokud chcete používat operátor ":", musíte po obou stranách použít funkce, které vrací odkaz.)

jj, zkouším, díky!
Ale pořád se mi nedaří dosáhnout toho konečného výsledku. Např. invariantní výsledek průměru.

Čísla začínají na A2.
Řekněme, že už je jich tam 10 (tj. A2:A11).
Průměr první poloviny je =AVERAGE(A2:A6), průměr druhé poloviny je =AVERAGE(A7:A11).
Teď připíšu další číslo na A12.
Oba průměry se změní, neboť se změní rozsah: =AVERAGE(A2:A7), průměr druhé poloviny =AVERAGE(A8:A11).
(lichý počet jsem eliminoval tím INT, neboť není úplně důležité mít to přesně, je to orientační vývoj.)
Takhle tam přibývají čísla a mění se současně rozsah dat obou průměrů.

Řešil jsem to pomocí toho COUNT a řekněme i toho OFFSET, ale výsledek pořád háže chybu. Je to už moc komplikovaný (?)

Offline

#23 17. 11. 2010 20:58:48

AIN
Člen
Místo Plzen
Registrace: 26. 3. 2010
Příspěvků: 22

Re: Skládání řetězců

hanus napsal(a)

nebo např. =AVERAGE(INDIRECT("A1:A"&INT(COUNT(B1:B20))))

Ano, to vypadá nadějně, už to prověřuji smile

Offline

#24 17. 11. 2010 21:03:59

hanus
Člen
Místo Olomouc
Registrace: 29. 11. 2006
Příspěvků: 573
Web

Re: Skládání řetězců

Co je tedy cílem cvičení? Vypočítávat průměr první a průměr druhé poloviny sady čísel dynamicky, podle toho, jak přibývají? Z výše popsaného je řešení jasné a existuje několik způsobů. Jen pro úplnost k práci se sudými a lichými čísly jsou funkce EVEN a ODD (kompatibilní s MS Office pak ISEVEN_ADD a ISODD_ADD, vizte help OOo)



POZOR! TOTO VLÁKNO JIŽ PŘETEKLO DO DVOU STRÁNEK! jen abyste si všimli, že jsou tam další příspěvky...

Editoval hanus (17. 11. 2010 21:34:30)

Offline

#25 17. 11. 2010 21:13:54

AIN
Člen
Místo Plzen
Registrace: 26. 3. 2010
Příspěvků: 22

Re: Skládání řetězců

hanus napsal(a)

Co je tedy cílem cvičení? Vypočítávat průměr první a průměr druhé poloviny sady čísel dynamicky, podle toho, jak přibývají? Z výše popsaného je řešení jasné a existuje několik způsobů. Jen pro úplnost k práci se sudými a lichými čísly jsou funkce EVEN a ODD (kompatibilní s MS Office pak ISEVEN_ADD a ISODD_ADD, vizte help OOo)

Ano, přesně, vypočítávat průměr první a druhé poloviny dynamicky podle toho, jak ta čísla přibývají. Ale na řešení jsem nepřišel. V zásadě jde o to, že si počítám některá svoje data a každý měsíc mi přibyde číslo, pak se ty dva průměry mění. Zatím jsem to počítal dosud ručně smile

Editoval AIN (17. 11. 2010 21:14:16)

Offline

Zápatí