Příspěvky uživatele


< návrat zpět

Strana:  1 ... « předchozí  3 4 5 6 7 8 9 10 11   další » ... 37

Možná teď napíšu tajemství, ale opravdu stačí buňky vymazat (ne odstranit), aby se UsedRange zmenšila. Jen musím po vymazání tu novou UsedRange aktivovat, např. dotazem přes Immediate Window. Na svém testovacím příkladu jsem to provedl následovně:

range("A100:E1048576")=""
?activesheet.usedrange.address
$A$1:$E$99

Uložený sešit se z 37 MB scvrkl na 12 kB. Je ale pravda, že postup, který doporučil elninoslov, by měl poskytnout stejný výsledek.

Možná hledáte velmi jednoduchou příčinu pro velikost 80MB, která vznikla ze sešitu s velikostí 160 kB. List v E-2003 má 64 kilo řádků, v E2013 jich je 1 mega. Známým zlozvykem v starších excelech byla aktivace vzorců pro celé sloupce.
Udělal jsem malý pokus s prázdným sešitem. Prvních pět celých sloupců v listu E-2016 jsem naplnil vzorcem =Řádek() a sešit jsem uložil. Výsledkem je soubor o velikosti 37 MB!
Pokud ve svém sešitu najdete listy, na kterých po Ctrl-End skočíte na řádek milion a něco, pak jste u jádra pudla.
V takovém případě smažte nepotřebné řádky se vzorci a sešit uložte. Změnu velikosti souboru najdete v prohlížeči.

Chyba je v adrese, kterou jsem uvedl. Správný odkaz je
www.jkp-ads.com/Download.asp.
Nestudoval jsem doplněk od veny, jen jsem vycházel z popsaných příznaků. Pokud jde o popsanou vadu, pak ta se projevuje jak v E2013, tak v E-2016. V E-2007 a v E-2010 mi vše funguje, jak má. Jakmile zavolám doplněk z vyššího Excelu (13 nebo 16), začne se mi uživatelský formulář skrývat pro sešit, který je právě On Top. Procedura, uvedená v odkazu, toto nechtěné chování odstraňuje.

Domnívám se, že jde o stejnou příčinu, kvůli které mi přestaly fungovat všechny moje doplňky, postavené na komunikaci přes uživatelský formulář. Po mnohaměsíčním tápání jsem náhodně narazil na vysvětlení této záhady včetně jejího řešení na adrese www.jkp.com/Download.asp. Jde o změnu systému zobrazování v Excelu z MDI na SDI, která proběhla při zavedení Excelu ve verzi 2013 a která zřejmě zůstala v hlubokém utajení. S výjimkou citované adresy jsem o dané téma nikde nezavadil.

Poněkud kuriozní přání! Pro potřeby psaní vzorců existují funkce listu ŘÁDEK() a SLOUPEC(), což jsou čísla řádku a sloupce aktuální buňky. Je to, na co jste se ptala?

Pokud dokážete na ručně vyplňovaném listu identifikovat ty listy se vzorci, kterých se data z prvního listu dotýkají, můžete si vytvořit seznam takových "aktivních" listů. Tomuto seznamu pak můžete podřídit, zda se má list se vzorci tisknout, nebo ne.

Tak dlouhé čekání na odpověď tady není obvyklé. Proto odpovídám. Dalo by se to napsat stručněji, ale kvůli čitelnosti to je také okomentované. Proceduru KopieListu umístěte do standardního modulu ve zdrojovém sešitě.
Sub KopieListu()
Dim Venku As Workbook
Application.ScreenUpdating = False
' příprava přijímajícího sešitu
Workbooks.Open "S:\složka\nazev souboru.xlsm"
Sheets("TOTAL").Select
Range("A1").Select
Set Venku = ActiveWorkbook
' návrat do zdrojového sešitu pro obsah listu
ThisWorkbook.Activate
Sheets("SEND").Select
Cells.Copy
' přenos dat do přijímajícího sešitu
Venku.Activate
ActiveSheet.Paste
Range("A1").Select
' uložení a zavření přijímajícího sešitu
With Venku
.Save: .Close
End With
' úklid ve zdrojovém sešitě
ThisWorkbook.Activate
Application.CutCopyMode = False
Range("A1").Select
' zpráva o provedení
MsgBox "Přenos byl proveden"
End Sub

Podstatu vašich problémů vidím v tom, že neumíte rozlišit práci s objekty ThisWorkbook a ActiveWorkbook.
Pokud současně otevřete víc sešitů, pak každý z nich vidí (a může použít) makra ze všech otevřených sešitů. Makro, ze kterého se volá ThisWorkbook, bude spolupracovat s daty toho sešitu, ve kterém je umístěno dané makro. Makro, ze kterého je volán ActiveWorkbook, bude pracovat s daty toho sešitu, který je právě aktivní. Když není sešit uveden, rozumí se ActiveWorkbook. Toto rozlišení je zásadní např. pro psaní doplňků (a samozřejmě i pro váš případ). Při jednom otevřeném sešitu ThisWorkbook a ActiveWorkbook jsou totožný objekt.

V první řadě bez ukázky nevím, proč by to už nešlo změnit. Pokud to opravdu nejde (o čemž si u buněk, určených pro ukládání dat, nejsem vůbec jistý), pak rozdělení a následné sloučení buněk představuje několik málo příkazů VBA. Žádný jiný fígl pro ten účel neznám.

Pokud jde pouze o upozornění, kdy se má provést odstavení, měl by fungovat vzorec v pomocném sloupci B (k hodnotám ve sloupci A, počínaje druhou hodnotou ve sloupci A). Stačí rozkopírovat vzorec, zapsaný do B2:

=KDYŽ(CELÁ.ČÁST(A1/1000)<>CELÁ.ČÁST(A2/1000);"ODSTAVIT";"")
=IF(INT(A1/1000)<>INT(A2/1000);"ODSTAVIT";"")

Vnořené rozhodování funguje jednoduše: místo přímé hodnoty pro větev ANO (nebo NE) vložte kompletní vnořenou funkci KDYŽ, a nezapomeňte řádně závorkovat!

Dokud si ty své combo boxy nepropojíte s nějakou buňkou, jejíž hodnotu pak půjde testovat, nejspíš nic nepodchytíte. Ve vašem VBA jsem ale neobjevil, že byste se pokoušel testovat zvolený rok.

Zřejmě pracujete s Excelem 2007, který měl mnoho nedodělků, ke kterým patřilo právě to, že neuměl zpracovat kód pro grafy. V Excelu 2010 už to fungovalo. Na ukázku přikládám proceduru, která graf vytváří. Udělal jsem si ji před lety na zkoušku a dost dlouho jsme ji musel ladit.
Sub VykresliGraf(Start As Date)
Dim N As Long
With Cells(2, 2).CurrentRegion
N = .Row + .Rows.Count - 1
End With
ActiveSheet.Shapes.AddChart.Select
With ActiveChart ' typ grafu a zdroj dat
.ChartType = xlXYScatterLinesNoMarkers
.SetSourceData Source:=Range("K3:P" & N)
End With
With ActiveSheet.ChartObjects(1) ' jméno grafu, polha a rozměry
.Name = "Kumulace"
.Left = Cells(2, 18).Left
.Top = Cells(2, 18).Top
.Width = 700: .Height = 420
End With
With ActiveSheet.Shapes("Kumulace").Fill ' výplň rámu pro graf
.Visible = msoTrue
.ForeColor.ObjectThemeColor = msoThemeColorBackground1
.ForeColor.TintAndShade = 0
.BackColor.ObjectThemeColor = msoThemeColorAccent1
.BackColor.TintAndShade = 0
.TwoColorGradient msoGradientHorizontal, 1
End With
With ActiveChart
.SeriesCollection(5).Format.Line.ForeColor.RGB = RGB(255, 0, 0) ' barva pro 5.datovou řadu
.SetElement (msoElementChartTitleAboveChart) ' název grafu (nad grafem)
Selection.Caption = "Časové vyhodnocení výnosů z vyhraných dražeb k " & Format(Now, "d/m/yyyy")
.SetElement (msoElementPrimaryCategoryAxisTitleAdjacentToAxis) ' titulek vodorovné osy
Selection.Caption = "Čas ve dnech od " & Format(Start, "d/m/yyyy")
.SetElement (msoElementPrimaryValueAxisTitleRotated) ' titulek svislé osy (otočený)
Selection.Caption = "Finanční objem v Kč"
.HasAxis(xlValue) = True ' nastavení tloušťky os
.Axes(xlCategory).Format.Line.Weight = 1.5
.HasAxis(xlValue) = True
.Axes(xlValue).Format.Line.Weight = 1.5
.SetElement (msoElementPrimaryValueGridLinesMinorMajor) ' nastavení mřížky hodnot
.Axes(xlCategory).HasMajorGridlines = True
.Axes(xlCategory).MajorGridlines.Format.Line.Weight = 1.5
.SetElement (msoElementPrimaryCategoryGridLinesMinorMajor) ' nastavení mřížky kategorií
.Axes(xlValue).HasMajorGridlines = True
.Axes(xlValue).MajorGridlines.Format.Line.Weight = 1.5
End With
ActiveSheet.ChartObjects("Kumulace").Activate ' výplň oblasti dat
ActiveChart.PlotArea.Select
With Selection.Format.Fill
.Visible = msoTrue
.ForeColor.RGB = RGB(255, 255, 153)
.Solid
End With
End Sub

Zpravidla se vytvoří ručně sada grafů, u nichž se pak přes VBA mění zdroj dat, obsažených v připojených a měnících se tabulkách. Vytváření samotných grafů pomocí VBA je samozřejmě možné, ale dost náročné. Asi nejlepší a nejjednodušší je pomocí záznamníku maker zapsat si ruční vznik grafu a vzniklý kód pak přizpůsobit specifickým požadavkům. Pokud se v tom neutopíte, pusťte se do vlastní tvorby. Je to dobrá hračka, plná různých překvapení...

Tak tady je zase obrázek z mých šachů s rozehranou partií. Hlídá to pořadí a oprávněnost tahů včetně šachů, rošád a braní mimochodem. Umí měnit pěšce za figuru. Partii je možno vrátit o libovolný počet tahů zpět. Může posloužit jako šachy pro dva hráče i pro analýzu šachových úloh. Hru proti počítači to neumí.

Já tento případ vyhodnocuji jako závažnou chybu chování Excelu. Rozkopírování vzorce by mělo ve všech případech vést na úplnou kopii vzorce pro zápis v notaci R1C1. V tomto případě zní rozkopírované vzorce pro B1:B5 následovně:
=SUM(RC1:R2C[-1])
=SUM(RC1:R2C[-1])
=SUM(R2C1:RC[-1])
=SUM(R2C1:RC[-1])
=SUM(R2C1:RC[-1])
Počínaje vzorcem v B3 se zápis R1C1 mění, což je jasné porušení pravidla o rozkopírování vzorců. S tím jsem se zatím nikde nepotkal.


Strana:  1 ... « předchozí  3 4 5 6 7 8 9 10 11   další » ... 37

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