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

#1 Re: Calc » Skládání logických funkcí u filtru » 11. 7. 2022 17:44:55

lp.

Tak jsem se na to podíval...

ID lze filtrovat ve filtru pole, výdaje s podmínku NEBO ve filtru dat.
Dohromady to dá potřebnou podmínku AND.

#2 Re: Calc » Skládání logických funkcí u filtru » 11. 7. 2022 00:09:38

lp.

Tip jen z hlavy, tohle jsem zatím nezkoušel.

výdaj1 <> 0 NEBO výdaj2 <> 0 AND ID = zadané číslo

nebo "roznásobení":

výdaj1 <> 0 AND ID = zadané číslo NEBO výdaj2 <> 0 AND ID = zadané číslo

#3 Re: Calc » Skládání logických funkcí u filtru » 9. 7. 2022 22:55:58

lp.

Moc to nechápu, tak jen k logice.

ludviktrnka napsal(a)

Tedy ID=číslo AND (Výdaj1 <> 0 OR Výdaj2 <> 0). Právě nevím jak nastavit tu závorku, tedy vkastně pořadí vyhodnocení. Samozřejmě to lze snadno vyřešit pomocným sloupcem Výdaj3 = (Výdaj1 + Výdaj2) <> 0, ale rád bych se tomu vyhnul, pokud to jen trochu půjde. Zkusil jsem různé pořadí, ale nedaří se.

Pokud mi nevychází priorita operací, tak doplním závorky:
(ID=číslo) AND ( ( Výdaj1 <> 0 ) OR ( Výdaj2 <> 0 ) )

ludviktrnka napsal(a)

EDIT: Ještě doplňuji, má to fungovat tak že pokud výdaj1+výdaj2 = 0 tak se řádek nezobrazí.

Tohle funguje jen, když mají oba výdaje stejné znaménko, Tedy pokud to má být ekvivalent logické alternativy. Jinak se mohou potkat výdaje s opačným znaménkem...

#4 Re: Calc » změna adresy buňky ve vzorci - VYŘEŠNO » 1. 5. 2022 21:52:05

lp.

Pokud potřebujete poslední číslo ve sloupci s čísly, tak se dá použít funkce vlookup:

=VLOOKUP(1e307;B:B;1;1)

Hledané číslo musí být hodně velké.

#5 Re: Calc » Rozložení textu z buňky do více buněk » 10. 1. 2022 14:41:48

lp.

Zkuste použít funkci FILTERXML - dělá do zjednodušeně "text do sloupců", jen vzorcem.

Tady je jen jeden oddělovač - mezera: 

=FILTERXML("<t><y>"&SUBSTITUTE(TRIM(A1);" ";"</y><y>")&"</y></t>";"/t/y")

Více oddělovačů - buď regulární výraz nebo vícekrát substitute - pro ilustraci je to nepřehledné.

Položky v řádku - funkce TRANSPOSE


Pokud máme pole, získat z něho jednu hodnotu je snadné (choose, index, ...), tady je použit index a vybrána poslední hodnota:

=INDEX(FILTERXML("<t><y>"&SUBSTITUTE(TRIM(A1);" ";"</y><y>")&"</y></t>";"//y");COUNTA(FILTERXML("<t><y>"&SUBSTITUTE(TRIM(A1);" ";"</y><y>")&"</y></t>";"//y")))

A tady je druhá hodnota:

=INDEX(FILTERXML("<t><y>"&SUBSTITUTE(TRIM(A1);" ";"</y><y>")&"</y></t>";"//y");2)

#6 Re: Calc » Soubor *.ods konvertovaný do *.xls - VYŘEŠENÉ » 6. 1. 2022 18:35:40

lp.

vlookup v excelu neprovádí automatickou konverzi typu. Je tedy nutné hodnoty ošetřit na listu nebo provést konverzi přímo ve vzorci tak aby se shodoval type hodnoty v tabulce a hledané hodnoty.


O tom, který přístup lepší, by se mohla vést dlouhá debata. Automatické konverze nemám rád a navíc někdy je těžké je obejít - pracuji dost s 18ti číselnými identifikátory - automatická konverze výpočty zmrší a ve funkcích typu sumif, coutif o ní moc lidí ani neví.


Obecně smíšené typy ve vyhledávacím klíči nejsou dobrým nápadem (nikde). Těch problémů je docela dost. Společným typem pro číslo i text je text, tj. pokud není klíč vždy číselný, hodnotu v tabulce převádím na text a hledanou hodnotu nastavuji ve vzorci (u klíčů typu '000121' záleží na okolnostech, obvykle preferuji textový tvar). Potom hledání vypadá:

VLOOKUP("'" & a1; b1:xxx ...)

nebo např. maticově:


index(d1:d50; match("'" & a1; b1:b50; 0)

Nevýhodou ale je, že pokud je požadována přibližná shoda, je pořadí řádků obecně závislé na prostředí.


Opačný přístup, tj. text nechat textem a číslo v textu převádět na číslo vede ke složitějším vzorcům. Funkce value text vyzmizíkuje a pak nic dobrého nenajdete.


Lze, ale nedoporučuji, nastavit obě strany, maticově, 


index(d1:d50; match("'" & a1; "'" & b1:b50; 0)

Při větší tabulce je to pomalé, konvertuje se větší objem dat v každém výpočtu,  obtížně se dá uhlídat pořadí v tabulce a pak je nezbytné použití sekvenční hledání (přesná shoda) místo rychlého binárního...

#7 Re: Calc » V buňce se zobrazuje #VALUE! Vyřešeno » 17. 12. 2021 01:12:18

lp.

Nenapsal jste odkud kopírujete. V některých výpisech (výpisy ČS neznám) bývají čísla proložena neviditelnými unicode znaky, někdy s nulovou délkou. viz např. wikipedie. Zkuste je najít a pak mazat.

Najít - může pomoci např. funkce mid, vyberte jednotlivé znaky podle pořadí třeba do sousedních buněk. Pokud bude některá buňka zdánlivě prázdná, můžete zviditelnit kód znaku v "prázdné" buňce - funkce asc, ...

#8 Re: Calc » Tipy na zrychlení makro výpočtů » 25. 8. 2021 23:17:55

lp.

Add třídění:
Doba potřebná na odstranění řádků závisí na počtu odstraňovaných souvislých bloků. Velikost bloku má podstatně menší vliv. Setřídění je pro mne nejjednodušší cestou, jak tyto nesouvislé řádky spojit do jednoho bloku. Tj. pokud se odstraňuje jen jeden řádek, tak se doba zvýší o režii třídění, pokud máme mnoho nesouvisejících řádků, tak naopak ušetříme. Na trik jsem přišel, když jsem dostal sešit, kde se střídaly řádky s daty s prázdnými.
Pomocí třídění můžeme dosáhnout dalšího zrychlení, např. lze mazané řádky přesunout na konec tabulky a blok hledat od konce - po smazání se nepřepočítávají odkazy na data na začátku tabulky a po odstranění bloku už další blok hledat nemusí.

add. zákaz aktualizace a přepočtu.
Záleží na okolnostech.
Při úpravě bloku bez propojení s výpočty je efekt minimální a po povolení přepočtu se přepočte sešit.
U větších tabulek s více výpočty může být efekt výrazný.

Používám u větších maker automaticky.

#9 Re: Calc » Tipy na zrychlení makro výpočtů » 23. 8. 2021 22:36:17

lp.

Vetšinou skoro automaticky používám:

	Doc = ThisComponent
	Doc.lockControllers()     ' zakáže aktualizaci obrazovky
	Doc.addActionLock()       ' zakáže přepočet

        ... výpočet ...

        Doc.removeActionLock()    ' povolí přepočet
        Doc.unlockControllers()   ' povolí aktualizaci zobrazení

Občas použiji také

        Doc = ThisComponent
        Doc.enableAutomaticCalculation(False)

        .................

        Doc.enableAutomaticCalculation(True)

(zakážu a povolím automatický přepočet)

Zamykání jednotlivých listů nepoužívám. (To byl překlep.)

#10 Re: Calc » Tipy na zrychlení makro výpočtů » 23. 8. 2021 00:17:34

lp.

Pár poznámek:

Pokud má makro běžet rychle, tak je nezbytné:
1) Přepnout přepočet na manuální (i při skrývání řádků se rozbíhají některé výpočty, při mazaní se přepočty rozběhnou jistě (tedy pokud je na oblast navázán výpočet), i když ke změně dojde na jiném listu,
2) zakázat aktualizaci listu ("aktivovat jiný list" dělá něco podobného, ale není tak účinné a je to zbytečná komplikace)
3) Pracovat s co největšími bloky dat.
4) Omezit počet přístupů k objektům calcu
5) Preferovat jednoduché proměnné

V uvedených příkladu jsou všechny body opomíjeny.

Pokud je nutné smazat velký počet řádků, tak nejrychlejší je smazání v jednom bloku. Jeden blok se všemi řádky k smazání dostaneme jednoduše setříděním řádků podle sloupce s příznakem skrýt. (Je rozdíl mezi mazáním v jednom bloku a jedním příkazem. při mazání každého bloku dochází k přepočtu souvisejících adres a podle nastavení také k přepočtu vzorců.)




Jinak poslední ukázka obsahuje zbytečně moc proměnných pro hledání oblasti (Na těch pár řádcích není zřejmě dopad na výkon významný) :

dim iZac&, iPosun&, test as boolean, b as boolean

	rem hlavní smyčka

	b=false
	iPosun = i1 - lbound(data)

	for i=lbound(data) to ubound(data)

			rem ukazatel průběhu
			...  

		rem porovnávání hodnot a přidávání do oRanges

		test=data(i)(0) = aSkryt
		if test <> b then 'došlo ke změně v bloku
			b = test ' dál nám stačí jedna hodnota
			if test then ' začíná  blok pro skrytí (protože b bylo false)
				iZac = i ' uložíme začátek bloku
			else ' konec bloku pro skrytí (protože b bylo true, tak blok končí)
				with oRangeAddress 'řádky přidávaného rozsahu
					.StartRow=iZac + iPosun
					.EndRow=i+iPosun-1
				end with
				oRanges.AddRangeAddress(oRangeAddress,true) 'přidat rozsah
			end if
		end if
	next i
	if b then ' b je true, tj. poslední blok mažeme 
		... dokončit poslední blok

#11 Re: Calc » Odstranění dat na základě druhého sloupce » 27. 7. 2021 16:43:54

lp.

Na sloupce A a B zapnout automatický filtr, ve sloupci B vybrat neprázdné hodnoty, vymazat nebo zkopírovat A.

Z dotazu není zřejmé, jestli se mají odstranit hodnoty z A, které
+ mají v B nějakou hodnotu,
+ hodnota v B = A,
+ hodnota v A existuje někde ve sloupci B,
+ něco jiného.

Přečetl jsem si ještě druhý příspěvek. do C stačí

MATCH(A1;$B$1:$B$1000;0).

pokud by to hledalo dlouho, tak o hodně rychlejší je:
setřídit B,
do C: VLOOKUP(A1;$B$1:$B$1000;1) = A1

#12 Re: Calc » xml import do calc » 10. 6. 2021 10:17:38

lp.

xml je jedním z jazyků na popis strukturovaných dat. Formát xml tedy znamená, že v souboru jsou data popsána tímto jazykem. Pokud mají data nějakou konkrétní strukturu, mají zpravidla i koncovku odpovídající této struktuře (html, ods,  odt, svg, ...).

Import xml je fakticky pokus vydolovat data na základě běžných postupů. Pokud jsou data složitější, je nutné někde sehnat/napsat šablonu na zpracování takového souboru (.xslt), případně sehnat/napsat filtr na zpracování konkrétního souboru.

#13 Re: Calc » Podmíněné formátování CALC, více podmínek najednou. VYŘEŠENO » 8. 4. 2021 00:28:00

lp.

K té podmínce. Od té doby, co máme funkci MATCH, funkci OR a textové řetězce nepotřebuji. Tj. ve fomátu se testuje výsledek MATCH.

PS. Pokud hledáte jmen více, může testování podstatně zrychlit setřídění jmen a podmínka
např.
       jméno = lookup(jméno, seznam, seznam)

nebo jméno = vlookup(jméno, seznam,1, 1)
Kvůli řešení chyb typu  "nenalezeno" doporučuji na začátek seznamu umístit něco, co se najde vždy.

Mimochodem, match nebo vlookup v pomocném sloupci taky není k zahození, dá se pak např. filtrovat

#14 Re: Calc » vyhledávání/porovnávání více hodnot - VYŘEŠENO » 19. 12. 2020 00:31:18

lp.

Pár vzorečků pro inspiraci (data jsem si vypůjčil od neutr):

Počet výskytů "N" a "D" (další značky se dají doplnit) v oblasti:

=SUMPRODUCT(COUNTIFS(B2:H11;{"D";"N"}))

Párové porovnání:

V oblasti s4:s13 jsou jména, v t3:ac3 také.

V t5 je vzorec:

=COUNTIFS(INDEX($B$2:$H$11; MATCH($S5;$A$2:$A$11;0);0);"D";
          INDEX($B$2:$H$11; MATCH(T$3;$A$2:$A$11;0);0);"D") + 

 COUNTIFS(INDEX($B$2:$H$11;MATCH($S5;$A$2:$A$11;0);0);"N";
          INDEX($B$2:$H$11;MATCH(T$3;$A$2:$A$11;0);0);"N")

Vzorec lze rozkopírovat do oblasti t4:ac13, případně (lépe) pod diagonálu oblasti.

Místo tabulky se dá použít i lineální uspořádání dvojic, vzorec zůstane prakticky stejný, jen je nutné ty dvojice vytvořit. stejný

#15 Re: Calc » Jak kopírovat vzorec buňky v celém sešitu jako u excelu » 19. 12. 2020 00:01:11

lp.

Dodám, že také lze vybrat vybrat oblast, přejít na buňku se vzorcem, F2, šipka vlevo, šipka vpravo a ctrl-shift-enter. Vzorec s vloží do vybrané oblasti. Myší lze vybrat i nesouvoslou oblast (klapkami taky, ale je to těžké)

#16 Re: Calc » calc - nekorektní výpočet R/O směny dle datumu » 30. 10. 2020 10:49:19

lp.
libor007 napsal(a)

Díky. To mne samozřejmě napadlo. Ale o co konkrétně jde, že to od 2021 nefunguje? Nějaký cyklus do určité doby? Nebo to s upraveným vzorcem pojede již "na furt"? Edit: upravený vzorec dle rady mi nefunguje. Vrací místo R/O znak ###

Podle iso normy je první týden v roce ten, ve kterém je 4. leden.

Některé roky zhruba po 5 letech (2020 např.) mají takto 53 týdnů, no a pak je 1. týden následujícího roku samozřejmě také lichý.

#17 Re: Calc » VYŘEŠENÝ - Zaokrouhlení na 1000 » 10. 3. 2020 13:50:59

lp.

Malá poznámka.

Funkce INT vrací největší celé číslo, které je menší než argument.
Tj. "zaokrouhlení" pomocí INT
a) usekne desetinnou část čísla
b) INT(1,5) = 1 a INT(-1,5) = -2. pokud sečteme "zaokrouhlené", dostaneme -1

Funkce ROUND vrací nejbližší číslo v zadané přesnosti.
Pokud jsou taková čísla 2 potom vrátí to, které je dále od nuly.
c) ROUND(1,5; 0) = 2 a ROUND(-1,5; 0) = -2.

Uživatelský formát x zaokrouhlování

V případě použití uživatelského formátu v tabulce nemusí odpovídat součty viditelných hodnot řádků a sloupců.
Zaokrouhlení vzorcem může tuto chybu korigovat (ne vždy snadno).

#19 Re: Calc » Filtr a přenos jeho zadání - VYŘEŠENO. » 14. 2. 2020 00:55:05

lp.

Pokud nemáte žádná omezení, tak do filtrovaného listu vložte indexový sloupec.
V cílovém listu najdete pomocí subtotal číslo řádku.
Pak je snadné hodnoty z nalezeného řádku přenést na cílový list (VLOOKUP, LOOKUP, INDEX, ...)

Pokud je index ve sloupci A:

vlookup(subtotal(5; A2:A1000); A2:A1000; 2) // data ze sloupce b,

Nebo lépe někde sloupec spočtěte (třeba v buňce A1 listu s daty a pak se už opakovaně odkazujte na tuto hodnotu.

vlookup(a1; A2:A1000; 2) // data ze sloupce b,

#20 Re: Calc » Filtr a přenos jeho zadání - VYŘEŠENO. » 12. 2. 2020 09:52:36

lp.

Maticový vzorec.

Zhruba tak:

=INDEX($A$2:$L$1000;MATCH(1;SUBTOTAL(3;OFFSET($A$1;ROW($A$2:$L$1000)-ROW($A$1);0;1;1));0))

Ukládá se ctrl-shift-enter

Vrací první vybranou položku ve sloupci A

ps. píšu to z hlavy, netestoval jsem to.

#21 Re: Calc » Výpis hodnot vzorců? » 2. 12. 2019 01:06:42

lp.

Podívejte se na některé úřední výkazy k doplnění, tam najdete, jak na to.

Např. v levém sloupci tabulky jsou čísla 1, 2, 3, a pak je 1 + 2 + 3 (součet hodnot z řádků označených 1, 2, a 3

Předpokládám, že dotyčný úředník nemá čas luštit tabulku s daty a zjišťovat, jak běží výpočet.

Mimochodem, existence vzorce nic neznamená, stačí zapomenutý automatický přepočet, nevhodný formát dat, ...

#22 Re: Calc » Jak tisknout dlouhou tabulku do více sloupců výstupu? » 5. 11. 2019 23:34:38

lp.

Řada tiskáren "umí" více sloupců ve vlastní režii, obvykle je třeba nastavit vhodnou velikost stránky a tiskárna může tyto stránky umístit na papír třeba vedle sebe.

#24 Re: Base » SQL dotaz na prázdnou položku - VYŘEŠENO » 4. 11. 2019 16:29:53

lp.

Neuvedl jste, o jakou db, resp, jaký dialekt sql používáte,

hledejte tedy něco jako

select *
from tabulka
where sloupec is empty

(pokud má být sloupec prázdný)

#25 Re: Calc » Jak použít čas ve vzorci jako číslici? VYŘEŠENÝ » 9. 9. 2019 22:04:47

lp.
JirkaSulkov napsal(a)
lp. napsal(a)
JirkaSulkov napsal(a)

Moc děkuji, funguje to. A je to kratší.
Já jsem ještě laboroval s funkcemi a udělal tento vzorec:
D4=5; E4 = 00:15:00
=IF((HOUR(E4)*3600+MINUTE(E4)*60+SECOND(E4)/3600)<1;D4*((HOUR(E4)*3600+MINUTE(E4)*60+SECOND(E4))/3600);D4*(1/((HOUR(E4)*3600+MINUTE(E4)*60+SECOND(E4))/3600)))
Taky dá výsledek 20.


??? Nechápu.

Jinými slovy. Pokud je čas kratší než hodina, tak počet časem násobíte, pokud je delší než hodina, tak časem dělíte??? V kontextu předchozích příspěvků se mi to zdá jaksi zmatené.

Jako výsledek potřebuji kolik se vyrobí za hodinu.

1. A když za 15 min se vyrobí 5 ks, tak přece 15 min musím násobit čtyřmi abych dostal 1 hodinu. A tím pádem také počet výrobků musím násobit čtyřmi. Tu pomocnou čtyřku jsem dostal tak, že jsem 60 min dělil 15 min. Výsledek 20

2. A když za 4 hod se vyrobí 10 ks, tak přece 4 hod  musím dělit   čtyřmi abych dostal 1 hodinu. A tím pádem také počet výrobků musím dělit   čtyřmi. Výsledek 2,5.

Rozdělíme vzorev na 3 části
a) podmínka:

(HOUR(E4)*3600+MINUTE(E4)*60+SECOND(E4)/3600)

Hodnota je menší než pouze, když je čas kratší než jedna minuta. (Chybí závorky.)

b) výraz pro splněnou podmínku

D4*((HOUR(E4)*3600+MINUTE(E4)*60+SECOND(E4))/3600)

Výraz se ve výpočtu uplatní jen pokud je čas kratší než je minuta.
Pokud je čas 4 hod a počet 10, dá výraz hodnotu 40 (ne 2,5, ve vzorci těch 2,5, kvůli podmínce je výsledek spočten druhým výrazem).

c) výraz pro nesplněnou podmínku

D4*(1/((HOUR(E4)*3600+MINUTE(E4)*60+SECOND(E4))/3600))

Počítá správně pro libovolný čas. Ve Vámi citovaných příkladech byly výsledky získány tímto výrazem. Jen je zbytečně komplikovaný. Viz doporučení od neutr.

Zápatí

Používáme FluxBB