Dostal jsem dotaz z jiného fóra. Tazatelka získává externí data v podobě csv souboru. Jde o tak velká čísla, že se v buňkách obrazují v matematickém (semilogaritmickém) tvaru, např. 8,456E+15. Hledala způsob rozumnějšího zobrazení takového čísla.
V Česku (i na Slovensku) se ten problém zpravidla řeší snížením řádu čísla jeho vydělením jedničkou s patřičným počtem nul. Velmi málo známé u nás je, že se to dá bez dělení přímo řešit pomocí formátu buňky.
Napsal jsem pro tazatelku instruktáž na toto téma. Třebas se hodí i některým z vás.
Pravděpodobně máte nastavenou vlastnost Application.TransitionKeys na hodnotu True. Když ji nastavíte na False, bude se zobrazovat pouze apostrof, a to jen tehdy, pokud ho sám před text umístíte. Tento apostrof se v buňce nezobrazuje a dovoluje vkládat texty s aritmetickými znaménky na prvním místě (jako když má buňka nastavený formát "@" - text). Ten znak se v buňce umisťuje do vlastnosti PrefixCharacter, která je ovšem "read-only", takže ho ve Vašem případě nelze mazat. Při vypnuté vlastnosti TransitionKeys se vložený apostrof objeví v řádku vzorců a lze ho smazat. Pokud se nemýlím, v Možnosti / Upřesnit je nastavení TransitionKeys předposledni z možných nastavení.
Lubo, dík za vzorec! Pokud máte víc takových lahůdek, pošlete mi je prosím na moji adresu. To se týká i ostatních, kteří by měli k dispozici nějaké vykutálené příklady vzorců. U těch maticových prosím o uvedení oblasti na listu, pro kterou vzorec platí. Poslouží mi k rozsáhlejším testům mého formátovacího algoritmu. Předem dík!
Efektivitu lze posuzovat z více pohledů. Pokud jde o dobu, potřebnou k vyřešení problému, je pro mne nepoměrně rychlejší napsat proceduru ve VBA, než vymýšlet složitý maticový vzorec. Věřím, že to mají jiní obráceně, ale já píšu VBA přibližně stejnou rychlostí jako dopis (asi se umím přepnout do módu VBA).
S rychlostí výpočtu jsou asi maticové vzorce rychlejší než VBA, i když jsem se dočetl, že moc rychlé zase nejsou. Zato přinášejí komplikace, pokud mají obsluhovat měnící se počet buněk.
S pochopitelností výpočtu to zase bude odlišné podle toho, komu se lépe čte vzorec a komu VBA. Mně určitě VBA.
Skončím konstatováním, že megavzorce (a zvlášť ty maticové) jsou nášlapné miny pro dědice po odešlých řešitelích. Vím o mnoha případech, kdy "nerozluštitelný" vzorec zabránil aktualizaci chování celého sešitu.
Tyhle problémy se netýkají nikoho z těch, kdo tady v tomto vláknu diskutují. Zato mají zásadní význam pro málo pokročilé vývojáře.
Vlákno bych rád uzavřel díkem místní elitě, která se diskuze zúčastnila. Překvapivě jednoduché řešení od elCHa dokládám v příloze pro porovnání s řešením od Johna Walkenbacha.
V žádném případě nezpochybňuji slova diskutujících ani nezkouším exhibovat. Jen se snažím poradit těm, kteří toho vědí ještě míň než já.
pro Luba: za dvacet let hrátek s Excelem jsem v žádné své aplikaci nepoužil ani jeden maticový vzorec. Původem jsem programátor, a kde obyčejné vzorce nestačily, ve 100% případů stačil VBA (někdy jako UDF). Jediný případ, kde ve vzorcích listu používám pole, je SOUČIN.SKALÁRNÍ. A ten mám rád zejména proto, že ho není nutné vkládat do maticového vzorce.
Teď si s maticovými vzorci hraju jen proto, abych je dokázal správně formátovat. Zjišťuji přitom, že mám ještě pár věcí, které musím dotáhnout. Můj obdiv k Walkenbachovu kalendáři vzbudilo právě to, že se mi konečně maticový vzorec odměnil hezkým výsledkem. Řešení od elCHa bez maticového vzorce je ale rovnocenné, takže můj potlesk jeho maticovému řešení lehce utichá.
pro Luba: vzorec není z internetu, ale z tištěné knihy od Walkenbacha (resp. z přiloženého CD). Když to bylo tak jednoduché, proč jste ten vzorec neopravil?
pro elCHa: nabídnuté řešení funguje, zejména proto, že v použitém vzorci nechybí u funkce DENTYDNE druhý argument pro určení týdne Po-Ne. To bylo podstatou chyby "neděle prvního", kterou objevil mepexg.
pro oba: nesnažím se ohromovat znalce. Hledám metody, které usnadňují život těm, kteří toho umějí mnohem méně, než vy dva.
pro všechny: v příloze je sešit s opraveným kalendářem
Už to mám! Nebudu ale kazit radost z hledání ostatním. Pokud ale do zítřka nikdo nezveřejní opravený kalendář, pak tu svoji opravu předvedu.
Vynikající postřeh! Nenapadlo mne zkoumat funkčnost vzorce, převzatého z knižního zdroje. V daném případě nejde přímo o Walkenbachův originál, kde týden začíná nedělí, ale o přídavek od českého překladatele knihy s týdnem od pondělí do neděle, jak je u nás zvykem.
Na druhé straně i chyba může být užitečná. Zkuste maticový vzorec upravit tak, aby ho zmíněná chyba "neděle prvního" přestala trápit! To není výzva jen pro mepexg, ale pro všechny, kteří na to mají!
Při hledání rozsáhlých maticových vzorců jsem narazil na velmi elegantní využití takového vzorce pro věčný měsíční kalendář. Nedalo mi a s malým grafickým vylepšením dávám tuto krásnou ukázku síly maticových vzorců do přílohy.
Nepochopil jsem, co máte na mysli s tou deformací. Skrývání řádků pod obrázkem nemá vliv na jeho deformaci, pokud u obrázku nastavíte jeho vlastnost "neměnit velikost s buňkami".
Když jsem z nástroje odstranil vracení formátovaného vzorce do zdroje, odstranil jsem s tím současně své problémy s maticovými vzorci. Teď by nástroj měl zvládat i tyto vzorce. Nástroj je v příloze.
Kromě několika stylistických změn jsem odstranil tabelační vadu, které jsem si všiml v příkladu od elCHa. Hlavní viditelnou změnou nástroje (vedle úbytku dvou tlačítek) je přidání "tabulátorů" do sformátovaného vzorce, jejichž cílem je zvýraznit hierarchické vztahy mezi součástmi vzorce.
Snad si v této podobě můj nástroj najde své příznivce mezi těmi, kteří jsou nuceni luštit cizí super/giga/mega vzorce.
Zkuste postup, který používám bez jakýchkoliv problémů:
- vyberte oblast buněk, které chcete využít,
- oblast vložte do schránky pomocí Ctrl+C,
- přemístěte se na cílový list a vyberte buňku pro levý horní bod,
- z nabídky Doma / Vložit z dolního řádku ikon možnost O (obrázek) nebo P (propojený obrázek).
Vznikne přitom objekt s obrazem vybrané oblasti. Ten můžete následně jak zvětšit nebo zmenšit, případně naplnit jeho pozadí nějakou barvou. Obrázek lze skrýt a zpátky zobrazit, případně přemístit. Při volbě propojeného obrázku se budou hodnoty buněk na obrázku dynamicky měnit podle změn v příslušných buňkách.
Mám zájem o každou odezvu v tomto vlákně. Proto děkuji. Ačkoliv uvedený příklad není moc úhledný, výsledek splňuje záměr, který bych očekával. Funkce NEBO má tři argumenty a sama je prvním argumentem funkce KDYŽ (jeho podmínka). Druhým argumentem funkce KDYŽ je "" (větev ANO) a třetím je IFERROR (větev NE). Prvním argumentem této funkce je ZÍSKATKONTDATA s 10 argumenty. Erorová větev pro IFERROR je "".
Nedoladěnost ve smyslu toho, že každá funkce nezačíná na vlastním řádku, byl můj záměr, který měl zabránit zbytečnému narůstání počtu řádků naformátovaného vzorce. Pokud to působí jako nedoladěnost, není problém výstup přizpůsobit.
Co se týká správného odsazování řádků, to je závislé na použití neproporcionálního písma (např. Courier New), které RefEdit v sešitě používá a ve kterém by měl být výsledek naformátování prezentován. Pro pochopení vnitřní struktury vzorce je zvolená forma jeho prezentování podle mého mínění dost názorná.
Tlačítka dělají to, co je na nich napsané. Opravdu je možné vzorec v rámci RefEditu upravit a opravdu je možné takto upravený vzorec vrátit do zdrojové buňky (včetně zachování jeho formátu). Vzorec samozřejmě napřed projde logickou kontrolou na formální správnost. To jsem skutečně pečlivě testoval a nenarazil jsem na chybu.
Služba, o které elCHa píše na závěr (vracení výsledků jednotlivých funkcí), je po mém soudu uspokojivě řešená v rámci standardní služby Vzorce / Vyhodnocení vzorce.
Za hlavní nedostatek svého nástroje pokládám to, že se zatím nevypořádá s maticovými vzorci. Na tom teď pracuji a až to dám dohromady, rozšířený nástroj opět zveřejním. Snad elCHa počká na tu rozšířenou verzi, k níž mu zašlu i slíbená hesla jako svůj dík.
Nedávno jsem tady otevřel vlákno Luštění megavzorců. V jeho diskuzi mne zaujal příspěvek, který zaslal Al s tím, že on v případě potřeby formátuje vzorec do řádků s odsazením. Ten postup jsem znal, ale zejména u cizích vzorců mi tato jejich manuální úprava, nápomocná pochopení vzorce, připadá nadměrně pracná.
Odsud už byl jen krůček položit si otázku, jestli takovou úpravu vzorce nelze provést pomocí makra. Odpověděl jsem si na ni sešitem, který je v příloze. Tento sešit se otevře a do popředí se umístí sešit se zkoumanými vzorci.
Označí se buňka se vzorcem a zkratkou Alt+h se zavolá jeho rozbor. Vzorec lze v této formě upravovat a výsledek po úpravách vrátit do zdrojové buňky. Na výběr je, jestli se vzorec vrátí v jednořádkovém provedení, nebo naformátovaný do řádků s odsazením.
Sešit posílám jako černou skříňku se zamčeným kódem. Potřebuji pomoci s testováním nástroje na vašich vzorcích. Pokud kdokoliv z vás zdokumentuje vadnou odezvu nástroje nebo přijde s nápadem, jak funkci nástroje zlepšit, rád mu pošlu hesla k listu i projektu VBA jako odměnu. Předem děkuji za spolupráci!
Oblíbený formulář Faktura byl vylepšen a rozšířen.
Více se dočtete zde.
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.