< návrat zpět

MS Excel


Téma: Přehled zaokrouhlovacích funkcí Excelu rss

Zaslal/a 9.9.2015 17:45

V diskusi o zaokrouhlování se tady objevilo několik nepřesností při popisu funkcí listu pro zaokrouhlení. Vzhledem k tomu, že tyto funkce (s výjimkou ZAOKROUHLIT) prakticky nepoužívám, začal jsem mít z té diskuse v hlavě guláš.
Pro vlastní archiv jsem si zpracoval tabulku toho, co Excel nabízí. Měl bych sto chutí napsat několik peprných slov jak na adresu Microsoftu, tak zejména pro naše lokalizátory. Když se tak na tu tabulku koukám, ani se nedivím, že ve hře mezi uživateli Excelu nepanuje jasno.
Tabulka je v příloze. Je interaktivní, takže každý si může ověřit, jak které zaokrouhlování funguje. Komentář ponechám na vás.

Příloha: zip26779_testyzaokrouhleni.zip (9kB, staženo 49x)
Zaslat odpověď >

Strana:  « předchozí  1 2 3 4   další »
#026846
avatar
to elCHa:
>>>(RoundX) jsem integroval do souboru, který obsahuje desetitisíce výpočtů a události change a je prošpikován kódem. Tam už prohrála a to jsem musel počet cyklů snížit na 100 (oba spodní případy - u toho prvního jsem zapomněl změnit text).
To s naprostou jistotou není způsobeno tou funkcí samotnou, ale jejím nevhodným použitím.
>>>Pokud toto někdo má, jedná se o pokročilého uživatele, který na to přijde, zjistí příčinu a opraví si. (Týká se změny chování funkce bez změny jejího jména)
To je chyba úvahy. Stovky mých sešitů běhají někdy už deset let po světě mezi jejich (často anonymními) uživateli a stále dobře slouží. Jak by tito uživatelé, postižení novým chováním funkcí, měli hledat, co se to stalo, že jim jejich starý dobrý sešit začal běhat za roh? Jednorázové psaní sešitů "sám pro sebe" je málo produktivní využití vývojářské práce.
>>>UDF je pomalejší, protože si ji musím napsat a odladit.
Pro jednorázové použití - naprostý souhlas. Pro úlohy s dlouhou životností - argument nanic. Čím víc uživatelů má úlohu používat a čím déle to mají činit, tím víc se vyplácí do úlohy vložit vývojářskou práci. Čas, ušetřený v provozu, by měl vždycky zaplatit čas vývojáře. Když mohu ušetřit stovky hodin v provozu, neměl bych se ohánět hodinovou vývojářskou pracností. Je to stejné jako s fixními a provozními náklady.
>>>UDF je nehorázně otravná a pomalá, když potřebuji ladit nějaký projekt (krokovat) a je v listu obsažena několikrát (mohou to být stovky - vlastní zkušenost).
Podobnou zkušenost jsem měl před lety taky. Pak jsem se zamyslel a našel jednoduchý způsob, jak ladit jeden samotný vzoreček: stačí na tu chvíli vypnout Volatile.citovat
icon #026848
eLCHa
;)))
Já už jsem napsal, vše co jsem chtěl. Jen poznámka k nevhodnému použití. Je fajn, že u mne předpokládáte nevhodné použití ;)) . Do jedné buňky jsem vložil vzorec a do druhé cyklem vkládal hodnoty. Jak byste to udělal vy? (nemusíte odpovídat ;)) )citovat
#026851
avatar
Přesto odpovím: přes hodnotové pole cca třicetkrát rychleji. Z toho JPG se nedalo vyčíst víc než výsledky, v žádném případě konkrétní způsob použití. Čísla ale říkají, že použití nebylo nejvhodnější. Zkušenost mne naučila, abych přestal říkat "líp to nejde", protože poctivější je říct "líp to neumím".citovat
#026852
avatar
K tomu cyklu.

Obvykle používám tabulku datcitovat
icon #026853
eLCHa
@Vovka
Dobrá - pro Vás ještě jednou - pokud chci otestovat vliv vzorce na kalkulace a události, tak ho musím do listu vložit. Vaše hodnotové pole mi s tím nepomůže. Nechci být nejrychlejší - já chci simulovat a testovat. Tady tedy dávám kód, kterým jsem to dělal (jen jsem upravil Váš a myslel jsem, že to není potřeba vkládat). Soubor Vám sem nedám, protože je to pracovní soubor.Sub test2()
Application.ScreenUpdating = False

Dim i As Long
Dim Cas1 As Single, Cas2 As Single, Cas3 As Single, Cas4 As Single

ActiveCell.FormulaR1C1 = "=CEILING(R[1]C,0.1)"
Cas1 = Timer
For i = 1 To 100
ActiveCell.Offset(1, 0).Value = 123.4 + i / 1000
Next i
Cas2 = Timer
ActiveCell.FormulaR1C1 = "=RoundX(R[1]C,0.1,1)"
Cas3 = Timer
For i = 1 To 100
ActiveCell.Offset(1, 0).Value = 123.4 + i / 1000
Next i
Cas4 = Timer
MsgBox "Jedno sto pro každou funkci:" & vbCrLf _
& "Ceiling (X, 0.1)" & vbTab & vbTab & Format(Cas2 - Cas1, "0.000") & " sec" & vbCrLf _
& "RoundX (X, 0.1, 1)" & vbTab & vbTab & Format(Cas4 - Cas3, "0.000") & " sec", _
vbInformation, "SROVNÁVACÍ VÝKONOVÝ TEST"

Application.ScreenUpdating = True
End Sub
Takže pokud je použití napsat vzorec s odkazem na hodnotu nevhodné...citovat
#026854
avatar
Chvíli mi opravdu trvalo, než jsem pochopil, co ta procedura dělá. Teprve nakonec mi došlo: v té proceduře strávíte 99,9% času tím nejpomaleji možným plněním buněk a jen její nepatrný zbytek bude počítat pomocí funkce, případně vzorce, zaokrouhlené hodnoty.
Toto není test na rychlost funkce, toto je test na pomalost práce s buňkami.citovat
icon #026855
eLCHa
Napsal jste funkci, o které tvrdíte, že je UDF. A pak ji testujete v prostředí jazyka VBA? Tedy vylučujete přístup z listu do VBA?
Ano, mohl jsem to vyzkoušet na čistém listu - nicméně pro mne to není korektní test.

Já Vám to tedy vysvětlím:
1 000 000x jste zavolal funkci a počítal v nepřirozeném prostředí VBA.
Já, protože tu fci nepovažuji za užitečnou jsem kvůli ni nevytvářel nějaký extra sešit, ale použil co mám. Proto jsem musel cyklus zkrátit na 100 kroků. Nejdříve jsem zadal 1. a pak 2. funkci - pro jednoduchost řekněme, že ty pomalé ostatní činnosti (zadání hodnoty, kalkulace, událostní procedury) trvaly 100s. Měřit to nebudu - v reálu to určitě bylo víc. Těch 100 s ale trvaly (v ideálním případě) v obou případech stejně - takže když je odečtu - mám co? Čas 100xvýpočtu volaného z listu v obou případech a můžu porovnat. 100 kroků je hodně málo na relevantní výsledek, ale i tak je něco vidět.

Nicméně tolik k testování. Diskutuji s Vámi o tom jen proto, že si to tu může přečíst někdo další a nabyde dojmu, že je zbytečné používat funkce a je lepší si vše napsat sám. Vás očividně nepřesvědčím a ani se o to nesnažím, je mi to jedno. Pro ostatní je ovšem lepší vědět, že to není tak jednoduché. O stovkách ušetřených hodin nemůže být v excelu ani řeč. Excel je operativní nástroj - tzn. to jak říkáte jednorázové použití je velice časté a nebojím se říci ve většině případů ("Tady máš data a potřebuji z toho zjistit to a to. Jo a mimochodem, potřebuji to hned"). Já mám několik souborů, které jsou jakžtakž stále stejné. Ale kolik jich vytvořím operativně? Jsem člověk s provozu - excel neučím, nevytvářím aplikace na zakázku. Tím pádem ani netvrdím, že nějaká koluje mezi anonymními uživateli i po 10ti letech a ti ji spokojeně používají dodnes. Já s excelem denně pracuji. Použití integrované funkce znamená použití normalizované syntaxe, která je všude stejná a tak, když si to otevře někdo jiný, nemusí přemýšlet co to je, protože to má v nápovědě.

Váš test dokázal, že při 1 milionu výpočtů neušetřím nic a musím funkci napsat. Můj test ukázal to samé. Kde je tedy přínos? Jednotná syntaxe? A nebo jen další funkce k zaokrouhlování. Já prostě použiju kolekci WorksheetFunction a mám to.

Pak jsem se zamyslel a našel jednoduchý způsob, jak ladit jeden samotný vzoreček: stačí na tu chvíli vypnout Volatile. Na jeden vzoreček nepotřebuji vypínat Volatile. Pokud je ovšem další průběh kódu závislý na výsledku UDF, je Vaše myšlenka k ničemu. Mimochodem stačí použít CTRL+F8 a nemusím nic vypínat. Nic to nemění na tom, že je to otravné.

K tématu UDF vs FCE ode mne už opravdu vše.citovat
#026857
avatar
Velmi vítám konec této velmi neblahé polemiky. Toto fórum má sloužit otázkám a odpovědím na praktické problémy, nikoliv žabomyší válce o počet andělů na špičce jehly. Tady mluví slepý k hluchému...
Howgh! 6citovat
#026858
avatar
Zkusil jsem to trochu jinak.

V souboru jsou v obou listech na 1. řádku číslo a vzorce =ZAOKR.NAHORU(A1;0,01) na listu CEILING
a =roundx(A1;0,1;1) na listu RoundX

Na řádku 200000 je zarážka, která usnadní zkopírování 1. řádku dolů.

Měřil jsem dobu přepočtu a úplného přepočtu obou listů s vyplněnými 200 tis. řádky. Přepočet se opakoval 5x a výsledkem je průměrný čas.

Výsledky:

List CEILING
Přepočet: 14,7 msec
Úplný přepočet: 36,9 msec

List RoundX
Přepočet: 3101,1 msec
Úplný přepočet: 3098,1 msec

Pro srovnání výsledek testu Vovky pro 200000 opakování:

Ceiling : 578 msec
RoundX : 703 msec

Můj závěr:

1. Metoda WorksheetFunction má o hodně vyšší režii, než volání funkce z listu.
2. Volání UDF z listu je o dost pomalejší než volání té samé funkce z listu.
Příloha: zip26858_funkceroundx-testy.zip (29kB, staženo 18x)
citovat
icon #026861
eLCHa
@lubo
K tomu cyklu. Obvykle používám tabulku dat

Toto by mně zajímalo. Mohl byste to rozvést?citovat

Strana:  « předchozí  1 2 3 4   další »

Uživatelské menu

Nejste přihlášen(a)
avatar\n

Menu

Formulář Faktura

Formulář Faktura IV

Oblíbený formulář Faktura byl vylepšen a rozšířen.
Více se dočtete zde.

Helios iNuvio

Používáte podnikový systém Helios iNuvio? Potřebujete pomoci se správou nebo vyvinout SQL proceduru? Více informací naleznete na stránce Helios iNuvio.

On-line nástroje