Příspěvky uživatele


< návrat zpět

Strana:  1 ... « předchozí  28 29 30 31 32 33 34 35 36   další »

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) 1 . 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.

V dotazu se orientuji jen stěží. Pokud ale jde o časovou prodlevu, během níž lze běžně manipulovat s daty na listu, používám s výhodou proceduru, jejíž modifikovanou podobu nabízí Help v Excelu:

Sub Prodleva(Delka As Single)
Dim Kon As Single
Kon = Timer + Delka
Do While Timer < Kon
DoEvents
Loop
End Sub

Delka je čas prodlevy v sekundách, nastavitelný rozumně cca od jedné tisíciny sekundy až po délku jednoho dne. V době prodlevy lze normálně se sešitem pracovat. Po dobu jejího běhu však je zastaveno provádění procedur VBA.

Pokud jsem správně pochopil Vaši potřebu, pak řešení najdete v příloze


Strana:  1 ... « předchozí  28 29 30 31 32 33 34 35 36   další »

Uživatelské menu

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

Menu

On-line nástroje

Formulář Faktura

Formulář Faktura IV

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

Aktivní diskuse