Mám letitou zkušenost, že kruhy z obrazovky se tisknou v Excelu jako viditelné elipsy. Ještě jsem neměl tu čest potkat tiskárnu, která by to nedělala. Nikdy jsem ty rozměry nepřeměřoval na cm. Ale vertikálně byly vždy body hustší než horizontálně.
Popsal jsem jednu možnost, jak se chránit. Když nevyhovuje, lze to řešit jinak. Kdysi jsem např. řešil provádění inventury pomocí snímačů čárového kódu, kde to snímání bylo zdrojem četných chyb. Po diskusích se zadavatelem jsem začal jistit sběr dat ukládáním sešitu po každé zdařené transakci se sejmutím bar kódu. V tomto režimu byl sběr dat zadavatelem vyhodnocen jako stabilní a vyhovující.
Z vašeho zadání není patrné, proč hledáte postup právě pro své popsané řešení s MsgBoxem. Jeho smysl jsem moc nepochopil. Podivné chování OnTime v E-2016 je pro mne novinka, už léta jsem ten obrat nepoužil.
Pokud je smyslem celé akce pojistka proti ztrátě provedených změn za období delší pěti minut v důsledku nechtěného přerušení práce se sešitem, mohlo by pomoci nastavení času pro automatické obnovení:
Application.AutoRecover.Time = 5
Při novém otevření sešitu po výpadku se nabídne stav sešitu, který není starší než pět minut před výpadkem. Toto nastavení je možné provést také pomocí Soubor/Možnosti/Uložit/Ukládat informace pro automatické uložení
Zkuste změnit své "ThisWorkbook.Save" na "ActiveWorbook.Save". Pokud jsem správně pochopil smysl akce, mělo by to pomoci.
Před pár týdny byl na fóru dotaz, kvůli kterému jsem použil dvě tlačítka Start a Stop pro spuštění a zastavení makra. Jeho vtip je v tom, že se v prováděcím cyklu makra Start nachází DoEvents. Tento příkaz dovolí makru Stop, aby ukončilo průběh cyklu v makru Start. Další stisk tlačítka Start obnoví chod prováděcího makra. Myslím, že ukázka tohoto chování dobře dokumentuje, jak to funguje.
Řešení pomocí událostní procedury s tím, že lze obě hodnoty nazávisle na sobě měnit tak, že se ta druhá hodnota přizpůsobí - viz příloha.
Mně na to mazání funguje velmi prosté makro:
On Error Resume Next
ActiveSheet.UsedRange = ""
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.
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.