To je o hodně lepší ! Jenom se nesměle ptám: o co kvalitnější výsledek poskytuje vzorec v buňce I2 proti prostému =Suma(H:H) ?
Abych tady nebyl za plného ignoranta přes vzorečky, pokusil jsem se vyřešit zadání s předchozím uspořádáním po svém. Militantně nesnáším supervzorce a v boji proti nim používám tzv. pojmenované vzorce. V příloze je původní sešit od Elninoslov s přidaným listem ode mne pro srovnání.
Je ovšem samozřejmé, že vystěhování celkového obratu za tabulku, jak je to uděláno v druhé verzi, situaci řádově zjednodušuje. Elninoslov tímto krokem skvěle potvrdil moji dřívější větu:
"Nepokládám za rozumné vytvářet zbytečně složité vzorce jen proto, že si úlohu málo rozmyslím..."
Pokud předložený převod vzorců opravdu pochází z dílny Lašáků (nemám důvod pochybovat), pak mne překvapuje ta hloupá chyba převodu, na kterou jsem narazil a kterou jsem již popsal. Lašáka osobně pokládám za mimořádně gramotného autora a chyba toho typu mne v jeho případě překvapuje.
Smekám před těmi vzorci i jejich autorem! Vzorec v buňce C1 je zvlášť vykutálený. Takové vzorce psát neumím a ani to nechci umět. Konstrukce tohoto typu pokládám za nevysvětlitelné a neudržovatelné, i když třebas pracují správně. Určitě bych něco podobného do svého sešitu nevložil. Jako ukázka, co všechno vzorec dovoluje, je to ovšem obdivuhodné.
Klobouk dolů, to muselo dát hrůzu práce! Vůbec se proto nedivím, když můj první pokus o překlad vzorce
=když(A1>0;1;2) do angličtiny dopadl následovně:
=If(AND1>0,1,2)
To se dá jistě opravit. Já pro ten účel používám okno Immediate z vývojového prostředí. Český vzorec do angličtiny převedu dotazem
?selection.formula, když do vybrané buňky napřed vložím české znění vzorce.
Okno Immediate mi odpoví anglickým vzorcem.
Překlad anglického vzorce do češtiny získám např. tak, že anglické znění vložím do buňky povelem
selection.formula=<anglický vzorec> a následně se zeptám
?selection.formulalocal
Okno Immediate mi odpoví českým zněním vzorce.
Co je zvláštní, ještě jsem nepotkal nikoho, kdo by tuto výbornou schopnost okna Immediate využíval.
To zadání mi připadne trochu nedomyšlené: co se má počítat při zadání "leden" a "únor"? Bude se vůbec nějak řešit přechod roků (může tabulka obsahovat stejné měsíce pro různé roky)? Nepokládám za rozumné vytvářet zbytečně složité vzorce jen proto, že si úlohu málo rozmyslím...
Mám dvě poznámky k tématu:
1. Konstanta 65000 je hrozný pozůstatek z Excelu XP (přesněji 65535), kdy to znamenalo max. počet řádků na listu. Ribbonový list jich umí víc než milion, takže 65 tisíc je velmi nedostatečné číslo. Dobře je UsedRange.Rows.Count od Opičáka, který ale určuje LastUsedRow, nikoliv FirstFreeRow!
2. První volný řádek má tedy o jedničku vyšší číslo než poslední obsazený. Existuje ale ještě jiný typ volného řádku, pokud mohou v obsazení řádků vznikat díry. Najít první díru je jiná úloha!
Úloha vypadá řešitelně, ale bez znalosti toho, jak vypadají data, nelze poradit, jak s nimi nakládat.
Modifikace vzdálené adresy do zavřeného sešitu není možná ani pomocí funkce NEPŘÍMÝ.ODKAZ, ani POSUN. Použít funkci ZVOLIT mne nenapadlo.
V příloze je řešení, které dovoluje zadáním adresy buňky (v notaci A1) vyvolat obsah této buňky na listu ve vzdáleném (třebas i zavřeném) sešitu.
Omlouvám se, četl jsem nepozorně dotaz (možná i proto, že ve vzorečku chybí jedna zavírací závorka) . Modifikovat vzdálenou adresu pro zavřený sešit s použitím funkce NEPŘÍMÝ.ODKAZ i u mne dopadá špatně, podobně jako pokus o použití funkce POSUN. Zabralo mi až makro pro změnu vlastnosti Formula. To samozřejmě lze změnit na uživatelsky definovanou funkci, kterou pak lze použít ve vzorci místo funkce NEPŘÍMÝ.ODKAZ. Ta UDF by ale měla vědět, jakou podobu má mít změna zapsaného odkazu. Když to budu vědět, mohu takovou UDF dodat.
Už jsem to dávno nedělal, ale snad si to ještě pamatuji: dělám to tak, že pro napsání vzorce otevřu i ten "vzdálený" sešit, ve vzorci se odkážu na potřebnou buňku ze vzdáleného sešitu prostým ukázáním na ni a psaní vzorce dokončím. Když pak vzdálený sešit zavřu, změní se automaticky volání vzdálené buňky na propojovací odkaz s úplnou cestou ke vzdálené buňce, což je podstatné a nutné pro její volání v zavřeném sešitu. Jinými slovy NEPŘÍMÝ.ODKAZ pro získání hodnoty buňky ze zavřeného sešitu nepotřebuji.
Pokládám za škodu, že Dialog.Show nepatří mezi běžně používané techniky VBA. Vestavěné dialogy jsou vesměs užitečné, stručné a hlavně funkční.
Pro ty, kterým se víc líbí můj první postup, posílám upravené a komentované znění té procedury do knihovničky k archivaci:Sub Pokus()
'**********************************************************
' fyzické vložení obrázku do listu bez linku na zdroj
'
' pro následné úpravy obrázku je vhodné pro tento sešit
' upravit Možnosti / Upřesnit / Velikost a kvalita obrázku:
' - zahodit data úprav - zaškrtnout
' - nastavit výchozí cílový výstup do 220 / 150 / 96 ppi
'**********************************************************
Dim Jmeno As String, Temp As String
' možné koncovky souborů: .jpg, .gif, .png
Jmeno = Application.GetOpenFilename("Obrázky JPG (*.jpg), *.jpg")
With ActiveSheet
.Pictures.Insert(Jmeno).Select ' link na obrázek
Temp = Selection.Name
.Shapes(Temp).Copy
.PasteSpecial Format:=1 ' 1-JPG; 2-GIF; 3-PNG
Selection.Name = "Obraz" ' obrázek bez linku
.Shapes(Temp).Delete ' smazání linku
End With
ActiveWindow.RangeSelection.Select
End Sub
Hezký den!
Přesto, že můj kód z předchozího vstupu funguje jak má, nikdy se mi moc nelíbil, protože je to řešení hodně přes ruku. Před chvílí mne napadlo vyzkoušet jiný postup, který jsem úspěšně otestoval a který pokládám za daleko čistší. Navíc jde o jednořádkový kód:
Application.Dialogs(xlDialogInsertPicture).Show
Vybraný obrázek z vyvolaného dialogu se automaticky do listu vloží jako Shape.
Po delším pátrání ve svém archlívu jsem objevil, jak jsem se se sejným problémem vypořádal:
Jmeno = Application.GetOpenFilename("Obrázky JPG (*.jpg), *.jpg")
With ActiveSheet
.Pictures.Insert Jmeno
.Shapes(1).Copy
.PasteSpecial Format:="Obrázek (JPEG)", _
Link:=False, DisplayAsIcon:=False
.Shapes(1).Delete
.Shapes(.Shapes.Count).Name = "Obraz"
End With
Pokud chci následně obrázek ořezat a nepotřebných ořezů se zbavit, je ještě nutné v Možnostech dovolit odstranění ořezaných částí.
I když se tady žádná přímá odezva neodehrála, dost jsem pokročil. V první řadě mi kamarád Igor poslal výborně napsaný rozsáhlý manuál v pdf od autora Pitonyaka (vznik únor 2015). Obrácenou stranou mince je 650 stran textu v angličtině. Našel jsem ale i starší manuál ve slovenštině (250 stran) i ještě starší stručný porovnávací přehled v dokumentu VbaStarBasicXref.pdf (eng., 60 stran).
Za velmi zajímavý pokládám převodník kódu VBA na OO Basic, který je zdarma k dispozici na adrese www.business-spreadsheets.com/vba2oo.asp. Ten (spolu s převodníkem jednotlivých obratů) mi ukázal, že převést VBA na OO Basic zdaleka není triviální úlohou: zatímco samotné VBA a OO Basic jsou téměř identické, práce s objekty se liší velmi významně. Převod metod pro objekty z VBA do OO Basicu vypadá podle použitého převodníku "horribly, terribly, nepředstavitelnělibly" složitě.
Vámi zaslaný soubor při pokusu o jeho zprovoznění protestuje, že jednak nemá propojení, jednak že nemůže najít nějaký textový soubor. Jinými slovy mi je ten sešit k ničemu, zejména ne k tomu, abych pochopil, co se má dít. Za druhé nerozumím tomu, že oneskorenie potřebujete použít v nějakých buňkách. Prodleva se může týkat nějakého děje, a ne buněk. Omlouvám se, ale na dotazy, kterým nerozumím, nemohu ani odpovídat.
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.