Ve spolupráci se SEDUO jsem vytvořil několik videokurzů:
Jak pomocí VBA makra v Excelu ukládat do xlsx, xlsm. Komplikace, možné problémy, jak je ošetřit. Předávat parametry, volit hesla.
Seznam kapitol v tomto článku:
Potřebujete-li pomocí VBA uložit soubor. Odpovídá klasickému Uložit jako
Upozornění: Provedením této metody se soubor uloží pod zadaným názvem a vy začnete pracovat v tomto novém souboru!
Díky za info Petr F.
Worksheet.SaveAs(Filename, FileFormat, Password, WriteResPassword, ReadOnlyRecommended, CreateBackup, AddToMru, TextCodePage, TextVisualLayout, Local)
Workbook.SaveAs(Filename, FileFormat, Password, WriteResPassword, ReadOnlyRecommended, CreateBackup, AccessMode, ConflictResolution, AddToMru, TextCodePage, TextVisualLayout, Local)
Typy souboru (tj. tabulka XlFileFormat) spolu s jejich kódem:
Další důležité csv, txt, pdf ...
A další kompletní seznam je na samostatný článek
Začneme úplně jednoduchým příkladem
ActiveWorkbook.SaveAs "C:\MujSoubor.xlsm"
Obdržíte dialogové okno, že soubor již je uložen pod stejným názvem (pokud jste jej již jednou ukládali). Nebo informaci, že nelze uložit, protože sešit obsahuje makra (zatím jste neukládali) a je přednastaven název, který novému sešitu dal Excel (Sešit 1.xlsx).
ActiveWorkbook.SaveAs "C:\MujSoubor.xlsm"
Soubor uložíme pod názvem MujSoubor.xlsm.
ActiveWorkbook.SaveAs Filename:="D:\test\test.xlsm", Password:= "AAA"
Sheets("List1").Select
ActiveSheet.Copy
ActiveWorkbook.SaveCopyAs Filename:="D:\revize\Pouze-list.xlsx"
ActiveWorkbook.Close (False)
Do názvu se vloží aktuální datum a čas
ActiveWorkbook.SaveAs Filename:="D:\test\Report" & Format(Now, "yyyymmdd") & ".xlsm"
Uložit s datem a jméno si zvolit zadáním hodnoty do buňky A1 a do buňky A2.
FJmeno = Sheets("List1").Range("A1").Text
FDoklad = Sheets("List1").Range("A2").Text
JmenosDatumem = FJmeno & FDoklad & Format(Now, "yyyymmdd")
Lepší úprava ukládaného souboru.
JmenosDatumem = FJmeno & "-" & FDoklad & "_" &Format(Now, "yyyymmdd") & ".xlsm", FileFormat:=52
Doplnit a rozšířit kód VBA.
Zjištění zda sešit obsahuje makra.
If .HasVBProject Then
VYsledek = ".xlsm"
Else
Vysledek = ".xlsx"
End If
Vypnutí zobrazování systémových hlášek.
With Application
.ScreenUpdating = False
.EnableEvents = False
End With
Opětovné zapnutí zobrazování systémových hlášek, jinak neodhalíte případné chyby (nezobrazí se) v jiných častech programu.
With Application
.ScreenUpdating = True
.EnableEvents = True
End With
Jak uložit pod do csv, txt, pdf bude předmětem jiných článků. Jak uložit do excelovský sešit do *.pdf jsem sepsal v článku Tisk do *.pdf - Excel VBA makro.
Problémy s ukládáním. Ukládáte pod názvem souboru, který je již otevřen a nelze do něj zapisovat, složka je nepřístupné, list obsahuje makra, která se nedají uložit do *.xlsx, potřebujete uložit do starší verze a máte formátování, která starší verze nepodporuje atd.
Další možnost jek ukládat je vytvořit kopií pomocí SaveCopyAs - pokud bude v komentářích zájem, pokusím se rozšířit i o tuto kapitolu.
ActiveWorkbook.SaveCopyAs "C:\MujSoubor.xlsm"
ActiveWorkbook.Close (FALSE)
nebo
ActiveWorkbook.Close SaveChanges:=True
nebo
Activeworkbook.Saved=True
ThisWorkbook.Save
Uložit kopií sešitu pos zvoleným nazvem i s datem.
FCesta = "C:\dokument"
FJmeno = Sheets("List1").Range("A1").Text
FCislo = Sheets("List1").Range("A2").Text
JmenosDatumem = FJmeno & FCislo & Format(Now, "dd.mm.yyyy")
ThisWorkbook.SaveCopyAs Filename:=FCesta & "\" & JmenosDatumem & ".xlsx" End Sub
Poznámka: Jedná se o jinou metodu takže nesmí obsahovat "FileFormat:=51".
Jak uložit jen jeden list, například Akvivní.
ActiveSheet.Copy
ActiveWorkbook.SaveAs Filename:="C:\MyFolder\MySubFolder\Test.xls"
ActiveWorkbook.Close
Tip nedotazovat se na ukládání:
Application.displayAlerts = False
Pokud potřebuji vyextrahovat samostatné listy (třeba jména lidi a jejich výsledky, které jsou na samostatných listech).
Dim sh As Worksheet
For Each sh In Worksheets
sh.Copy
' at se neptá na potvrzení uložení
Application.DisplayAlerts = False
' jména jednotlivých sešitu podle názvu listů
' Tip: Lze mít podmínku, pokud se jméno listu začíná: xy*
ActiveWorkbook.SaveAs Filename:="D:\smaz\" & sh.Name & ".xlsx"
Application.DisplayAlerts = True
'budu-li chtit ulozit i tento sešit
ActiveWorkbook.Close Savechanges:=False
Next
Soubor jak v VBA ukládat pomocí SaveAs (SaveCopyAs) ke stažení zdarma. Soubor využívá makra.
V případě potřeby postupně doplním o další VBA kódy.
Pro případné doplnění článku jsou komentáře.
Článek byl aktualizován: 19.09.2020 11:07
Ušetřil vám tento web čas, peníze? Pomohl vyřešit problém? Jste ochotni poskytnout symbolickou odměnu na další rozvoj? Vybrte si formu odměny, která vám vyhovuje.
Microsoft Office (Word, Excel, Google tabulky, PowerPoint) se věnuji od roku 2000 (od 2004 na této doméně) - V roce 2017 jsem od Microsoft získal prestižní ocenění MVP (zatím jsem jediný z ČR v kategorií Excel). Své vědomosti a zkušenosti dávám k dispozici i on-line ve videích pro SEDUO. Ve firmách školím a konzultuji, učím na MUNI. Tento web již tvořím přes 15 let. Zdarma je zde přes 1.000 návodu, tipů a triků, včetně přes 250 různých šablon, sešitů.
Přidáno: 25.09.12 16:27
Dobrý den, jsem exelista samouk, ale vyrobil jsem si formulář pro objednávky, kde název formuláře se skládá vždy z údajů ve formuláři.(rok, mesíc, den a název objednávky). Tento název je v jedné dané buňce. Lze udělat makro, kdy se mi vyplněný formulář po zmáčknutí tlačítka tisk (výstup) uloží do nového sešitu s tímto názvem? Děkuji za radu.
Přidáno: 25.09.12 18:24
To RomanP: Využít Workbook.SaveAs, kde Filename bude jméno z dané buňky (např. A1).
Sub SaveAsJmeno()
Dim FJmeno As String
Dim FCesta As String
FCesta = "C:\pokusy"
FJmeno = Sheets("Sheet1").Range("A1").Text
ThisWorkbook.SaveAs Filename:=FCesta & "\" & FJmeno
End Sub
Přidáno: 27.01.13 07:18
Dobrý den, potřeboval bych radu, jak mohu uložit kopii listu pomocí příkazu, který je uvedený pod uložit s datem, aby v názvu nebylo slovo Report, ale odkaz na určitou buňku v listu 1. Například z Listu1 & A1 & B3 & datum
Přidáno: 27.01.13 07:43
To HonzaV: Je udedeno v článku výše, opakování je matkou moudrosti ;-) využít funkce NYNÍ() ve VBA nutno zadat v angličtině NOW
FCesta = "D:\pokusy"
FJmeno = Sheets("List1").Range("A1").Text
JmenosDatumem = FJmeno & Format(Now, "yyyymmdd")
ThisWorkbook.SaveAs Filename:=FCesta & "\" & JmenosDatumem & ".xlsm", FileFormat:=52
FileFormat:=52 ... aby se ukládal soubor jako xlsm (tj. soubor s makry). Jen na doplnění. Nebo za použití DNES()
JmenosDatumem = FJmeno & Format$(Date, "mm-dd-yyyy")
PS: Nekontroluje, zda složka existuje, zda již existuje soubor s tímto názvem, zda není otevřen atd...
Přidáno: 27.01.13 10:52
Děkuji moc za pomoc. Tuto část jsem pochopil, ale nevím si rady s tím, jak přidat do pojmenování tu druhou hodnotu z té druhé buňky. Pro vysvětlení: potřebuji uložit vyplněnou fakturu, kde bych chtěl mít uložené údaje datum, číslo dokladu a jméno. Datum se napíše pomocí vašeho makra, číslo faktury bude např. A1, ale nevím, jak mám přidat tu druhou hodnotu z např buňky A2.
Přidáno: 27.01.13 11:59
To Honza V: Přidávání je přes & viz ukázka
FJmeno = Sheets("List1").Range("A1").Text
FDoklad = Sheets("List1").Range("A2").Text
JmenosDatumem = FJmeno & FDoklad & Format(Now, "yyyymmdd")
případně přidávat do názvu další znaky například pomolčky
JmenosDatumem = FJmeno & "-" & FDoklad & "_" &Format(Now, "yyyymmdd") & ".xlsm", FileFormat:=52
Přidáno: 27.01.13 17:27
Děkuji, vše jsem pochopil a celé to funguje, jak jsem potřeboval. Mám ještě jeden problém. List s fakturou, kterou ukládám do složky faktur mi přepíše název celého sešitu a když potřebuji uložit celý sešit, tak se mi automaticky uloží do poslední faktury (cestu a původní název mohu dopsat ručně). Potřebuji, aby se mi celý sešit uložil do původní složky, protože v ostatních listech mám další údaje, které postupně doplňuji a potřebuji, aby se uložily. Jedná se např. o list odběratelé atd.
Přidáno: 27.01.13 18:41
To Honza V: Uložit jako kopií (viz info výše) je jiná metoda
SaveCopyAs
Syntaxe je:
SaveCopyAs(Filename)
takže se ukládá naříklad:
ThisWorkbook.SaveCopyAs Filename:=FCesta & "\" & JmenosDatumem & ".xlsm"
nesmí být FileFormat:=52
Přidáno: 27.01.13 19:18
Sub ulozit()
FCesta = "C:\Documents and Settings\Plocha\s"
FJmeno = Sheets("List1").Range("A1").Text
FCislo = Sheets("List1").Range("A2").Text
JmenosDatumem = FJmeno & FCislo & Format(Now, "dd.mm.yyyy")
ThisWorkbook.SaveCopyAs Filename:=FCesta & "\" & JmenosDatumem & ".xlsx", FileFormat:=51
End Sub
Toto je celé makro, ale při spuštění se žlutě označí prví řádek se Sub ulozit () a označí se mi FileFormat. Vyskočí hlášení : Compile error: Named argument not found
Přidáno: 27.01.13 21:23
To Honza: Nesmí tam být "FileFormat:=51" viz předchozí komentář. Kde je syntaxe + příklad a poznámka že nesmí být ;-)
Sub ulozit()
FCesta = "C:\Documents and Settings\Plocha\s"
FJmeno = Sheets("List1").Range("A1").Text
FCislo = Sheets("List1").Range("A2").Text
JmenosDatumem = FJmeno & FCislo & Format(Now, "dd.mm.yyyy")
ThisWorkbook.SaveCopyAs Filename:=FCesta & "\" & JmenosDatumem & ".xlsx"
End Sub
Přidáno: 27.01.13 21:41
Děkuji, vše pracuje na 100%. Nepochopil jsem poznámku o FileFormat. Myslel jsem si, že tam nesmím napsat 52, ale mohu použít jiné označení. Už vím, že tam není žádný formát. Jsem opravdu jenom uživatel. Ještě jednou děkuji za pomoc.
Přidáno: 22.02.13 05:53
Zdravím pane Lasáku. Šlo by prosím přiložit soubor jako ukázku? Furt se s tím nějak peru a nejde mi to. Řeším první problém (viz RomanP) a to s ukládáním názvu souboru dle obsahu určitě buňky. Děkuji mockrát.
Přidáno: 23.02.13 09:22
To Petr G: Tak soubor je přiložen. Ukázku jsem doplnil do článku. Jde jen o ukládání (pomocí SaveAs a SaveCopyAs) s heslem, bez hesla, pevný název, název z buňky, doplnění názvu o čas.
Příklady již neřeší kontrolu, zda složka existuje, zda je možno do složky zapisovat, zda není soubor do kterého se zapisuje otevřen atd...
Přidáno: 25.02.13 13:41
K tématu chci jen uvést, že pokud provedete metodu "SaveAS" pak už automaticky pracujete na novém souboru! Je rozdíl proti "SaveCopyAs", kde lze definovat "FileFormat"(např. html, pdf...). Nejlépe to je vidět na krokování v debugu. Pokud pak píšete dál ve VBA, už jste v jiném souboru! Toto z článku není zcela jasné. Jinak pro mne je to velice cenný WEB. Díky, Pavle.
Přidáno: 25.02.13 20:30
To Petr F.: Děkuji za doplnění. Doplnil jsem také do článku , ať je pro další čtenáře jasnější jak funguje metoda SaveAs. Jsem rád že web pomáhá.
Přidáno: 21.03.13 16:00
Dobrý den pana Lasáku, jak prosím napsat skript, aby uživatel složku uložení kopie vybíral, nikoliv ji měl předem danou. Chtěl bych využít SaveCopyAs, kde bude definován formát pdf. A název souboru se bude skládat ze jména (u tabulky) a datem (rovněž z tabulky). Děkuji velice za přínosné stránky, jako samouk velice oceňuji.
Přidáno: 21.03.13 16:15
A ještě dovětek, jak zadám ukládání - saveAs pouze konkrétního listu nikoliv celého sešitu? Díky, díky
Přidáno: 22.03.13 10:01
Dobrý den, uložené PDF, ve Vašem vzorovém sešitu je vždy nečitelné. Nevíte, kde může být chyba, rád bych tuto možnost ve svém sešitu využil (viz. výše).
Přidáno: 22.03.13 20:23
To Pavel Hurt: Ukázkový soubor jsem upravil. Po testech funguje tvorba *.pdf bezproblemově.
Podrobněji o exportu do *.pdf jsem sepsal článek
export do *.pdf
Přidáno: 29.03.13 18:21
Dobrý den, chci se zeptat jestli při uložení excelu do formátu xlsm pomocí kódu ve VBA (viz výše), je možno zajistit, aby se kopírovaly i kódy napsané v sekci ThisWorkbook.(kopírují se mi jen kódy z listů).děkuji
Přidáno: 17.10.13 11:38
Děkuji za různé rady, potřebovala bych uložit do textového souboru data z tabulky QueryTable načtené na list v Excelu, nebo všeobecně oblast z listu kde jsou nějaká data. Děkuji za tipy
Přidáno: 11.11.13 11:37
Dobrý den, Kopírování dle vašeho návodu funguje bezproblémově. Uložení listu jako nový s vlastním názvem přímo do složky. Problém mám v tom, že se ukládá včetně vzorců, ale já bych to chtěl jako hodnoty a navíc i tak jak je nastaven filrt...
Přidáno: 10.02.14 14:50
Dobrý den, potřeboval bych uložit jako pdf w excelu 2010, to mi funguje, ale mám na stránce 3 dokumenty v jednom listu a potřeboval bych uložit pouze vždy jeden dokument a to zrovna ten, který chci. Něco jako oblast tisku při tisku. Jde to navolit při uložit jako ???? Děkuji
Přidáno: 15.04.14 07:11
Dobrý den, potřeboval bych poradit s makrem. Mám soubor "kontrola.xls", kde v buňce "E2" mám číselný kód např.: "001". Potřebuji složit makro, které mi daný sešit uloží do jasně specifikované složky (např.: C:\KONTROLA\) jako kopii, která bude mít název "E2"&DDMMYY. Toto vše se mi podaří, ale po uložení jsem v podstatě v tom uloženém excelu. Potřeboval bych, aby se mi uložilo na pozadí, ale stále zůstal otevřený ten původní excel "kontrola.xls" . Také bych potřeboval, aby se při každém uložení daná hodnota v buňce "E2" zvýšila o jedničku. Button pro uložení by měl být opodmínkovaný, že lze spustit pouze v případě, kdy v buňce "G8" je hodnota "v pořádku". Jsem excelista samouk, moc mě to baví, ale s tímto si nějak nevím rady. P.S. mám excel 2003 Předem děkuji za Váš čas. TV
Přidáno: 08.01.15 11:11
Dobrý den, poprosím o radu jak udělat z exel soubor CSV? nedaří se udělat ve správném formátu pro export na eshop. Dekuji za radu a pomoc . Děkuji, Petr Brno
Přidáno: 09.01.15 08:32
To Petr: -- pomocou "Uložit jako" nepostačuje? + v okne "Typ Souboru" vybrať: "CSV(MS-DOS)(*csv)"
Přidáno: 06.03.15 07:17
Ahoj, nepatří to tak úplně do metody "SaveAs", ale jde o ukládání souboru "Uložit jako" A protože by se toto mohlo někomu hodit, tak proč se nepodělit :) V sešitu (který je "jakoby" síťová šablona bez dat) dělám úpravy/aktualizace tabulek, ostatní uživatelé doplňují data. Takže xlt, nebo zaškrtnutá vlastnost souboru "Pouze pro čtení" je tak zase na obtíž pro mně (aktualizace jsou celkem časté), ale použil jsem "Private Sub Workbook_Open()", kde se může nadefinovat uživatel(é), který má soubor pro zápis a ostatní tak mají stejný soubor jen pro čtení Jenže tím by se stále ukládala každá případná kopie ostatním uživatelům stále pouze pro čtení, takže mě napadlo: rozhodnutí kdy/komu se soubor otevře pro čtení a kdy/komu pro zápis vytvořit v Modulu1: [code]Sub Auto_Open() Dim strUser As String strUser = Environ("USERNAME") Select Case strUser 'Full Access Case Is = "login uživatele s plným přístupem" If ActiveWorkbook.ReadOnly Then _ ActiveWorkbook.ChangeFileAccess Mode:=xlReadWrite, WritePassword:="admin" 'Limit Access Case Is <> "login uživatele s plným přístupem" If Not ActiveWorkbook.ReadOnly Then _ ActiveWorkbook.ChangeFileAccess Mode:=xlReadOnly, WritePassword:="admin" End Select End Sub[/code] a k tomu vytvořit Modul2, který v případě otevřeného souboru "pouze pro čtení" (tedy komukoliv kromě mě) nabídne "uložit jako" a zároveň v této uložené kopii zruší omezení z Modulu1 a zamete po sobě (ve vytvořené kopii smaže oba moduly) [code]Sub Auto_Close() Dim strUser As String strUser = Environ("USERNAME") Select Case strUser Case Is <> "login uživatele s plným přístupem" If strUser = Environ("USERNAME") Then Dim vbCom As Object Set vbCom = Application.VBE.ActiveVBProject.VBComponents vbCom.Remove VBComponent:=vbCom.Item("Module1") vbCom.Remove VBComponent:=vbCom.Item("Module2") End If End Select End Sub[/code] No u Modulu2 jsem se trochu zapotil. Podmínka měla být, pokud to jsem já, nedělej nic, jinak smaž moduly. Nakonec se zadařilo, ale je to trochu nelogické (na můj mozek). v akždém případě nejsem profík, určitě to jde i líp. Tak to berte s rezervou ...
Přidáno: 06.03.15 09:48
[code] tak teď netuším, proč nezafungoval v předchozím příspěvku "code" - omlouvám se ... [/code]
Přidáno: 06.03.15 09:51
už vidím chybu - místo "[" jsem dal "<" ... pardon ...
Ahoj, nepatří to tak úplně do metody "SaveAs", ale jde o ukládání souboru "Uložit jako" A protože by se toto mohlo někomu hodit, tak proč se nepodělit :) V sešitu (který je "jakoby" síťová šablona bez dat) dělám úpravy/aktualizace tabulek, ostatní uživatelé doplňují data. Takže xlt, nebo zaškrtnutá vlastnost souboru "Pouze pro čtení" je tak zase na obtíž pro mně (aktualizace jsou celkem časté), ale použil jsem "Private Sub Workbook_Open()", kde se může nadefinovat uživatel(é), který má soubor pro zápis a ostatní tak mají stejný soubor jen pro čtení Jenže tím by se stále ukládala každá případná kopie ostatním uživatelům stále pouze pro čtení, takže mě napadlo: rozhodnutí kdy/komu se soubor otevře pro čtení a kdy/komu pro zápis vytvořit v Modulu1: Sub Auto_Open() Dim strUser As String strUser = Environ("USERNAME") Select Case strUser 'Full Access Case Is = "login uživatele s plným přístupem" If ActiveWorkbook.ReadOnly Then _ ActiveWorkbook.ChangeFileAccess Mode:=xlReadWrite, WritePassword:="admin" 'Limit Access Case Is <> "login uživatele s plným přístupem" If Not ActiveWorkbook.ReadOnly Then _ ActiveWorkbook.ChangeFileAccess Mode:=xlReadOnly, WritePassword:="admin" End Select End Sub
a k tomu vytvořit Modul2, který v případě otevřeného souboru "pouze pro čtení" (tedy komukoliv kromě mě) nabídne "uložit jako" a zároveň v této uložené kopii zruší omezení z Modulu1 a zamete po sobě (ve vytvořené kopii smaže oba moduly) Sub Auto_Close() Dim strUser As String strUser = Environ("USERNAME") Select Case strUser Case Is <> "login uživatele s plným přístupem" If strUser = Environ("USERNAME") Then Dim vbCom As Object Set vbCom = Application.VBE.ActiveVBProject.VBComponents vbCom.Remove VBComponent:=vbCom.Item("Module1") vbCom.Remove VBComponent:=vbCom.Item("Module2") End If End Select End Sub
No u Modulu2 jsem se trochu zapotil. Podmínka měla být, pokud to jsem já, nedělej nic, jinak smaž moduly. Nakonec se zadařilo, ale je to trochu nelogické (na můj mozek). v akždém případě nejsem profík, určitě to jde i líp. Tak to berte s rezervou ...
Přidáno: 07.10.15 10:59
Dobrý den, pane Lasáku, mám problém, který výše popisujete jen slovně:"list obsahuje makra, která se nedají uložit do *.xlsx" ... jak lze toto vyřešit? Mám list na který aplikuji přes kód autofiltr a potřebuji druhým tlačítkem tyto vyfiltrované řádky (pouze je) uložit jako obyčejný xls., xlsx, bohužel se mi daří uložit jako pouze celý sešit, jakoby kopii původního. Snad jsem to popsal dostatečně. Sub tlačítko4_Kliknutí() FCesta = "C:\xxx" FJmeno = "xxx" JmenosDatumem = FJmeno & Format(Now, "dd.mm.yyyy") Sheets("SC").Select ActiveWorkbook.SaveCopyAs Filename:=FCesta & "\" & JmenosDatumem & ".xlsx" End Sub Děkuji za jakoukoli radu.
Přidáno: 10.10.16 18:56
Dobrý den, zkusil jsem "Uložit kopií sešitu pos zvoleným nazvem i s datem", ale ať dělám co dělám nemůžu tam narvat heslo pro úpravy. Jakmile tam přidám WriteResPassword hází to chybu. Bez hesla všecho jede. ThisWorkbook.SaveCopyAs Filename:=uloziste & "\" & rok_dochazky & " " & jmeno_z & ".xls" Prosím o pomoc.
Pomohl Vám návod? Sdílejte na Facebooku, G+ |
||
LinkedIn... |
Stránky o MS Office (Excel) produktu společnosti Microsoft. Neslouží jako technická podpora.
| Email na autora: pavel.lasak@gmail.com | Copyright © : Pavel Lasák 2004 - 2024 |