Jste zde: Úvodní stránka » excel » vba-soubory » tisk-do-pdf-excel-vba
Tisk do *.pdf - Excel VBA makro
... jak automaticky tisknout v MS EXCEL do pdf ...
Doplněno: 15.2.2012 - na základě dotazů.
Úvod
Někdy je potřeba z Excelu exportovat výsledky, aniž zašlete klientovi přímo excelovský soubor. Vytisknout a poslat poštou je pracné a nákladné, udělat „print screen“ obrazovky neprofesionální. Proto využijme možnost a výsledek exportujeme do *.pdf formátu. Jelikož jsme líní a nechceme to dělat ručně, využijeme v Excelu VBA makro. Příklady jsou pro Excel 2007 a Excel 2010.
„Strejda google“ našel složité postupy tisku přes Adobe Reader nebo externí pdf tiskárnu, u čehož vidím nevýhodu v nutnosti instalovat další program(y) (z nichž některé jsou placené), pak komplikovaně po tisku tyto programy uzavírat. Proto jsem se rozhodl využít k uložení do *.pdf vnitřní funkci excelu – ulož jako pdf (což novější verze Excelu umí). Kdo má starší verzi doporučuji kopit novější.
Syntaxe - teorie
Jak vypadá syntaxe ExportAsFixedFormat
ExportAsFixedFormat(Type, Filename, Quality, IncludeDocProperties, IgnorePrintAreas, From, To, OpenAfterPublish, FixedFormatExtClassPtr)
Popis:
- Type - povinné - typ exportovaného dokumentu (xlTypePDF nebo xlTypeXPS)
- Filename - volitelné - jméno pod kterým se ukládá
- Quality - volitelné - kvalita dokumentu (xlQualityStandard nebo xlQualityMinimum).
- IncludeDocProperties - volitelné - (TRUE - FALSE)
- IgnorePrintAreas - volitelné - (TRUE - FALSE)
- From - volitelné - od které stránky
- To - volitelné - do které stránky
- OpenAfterPublish - volitelné - zobrazit po zpracování (TRUE - FALSE)
- FixedFormatExtClassPtr - volitelné
První makro Excel VBA tisk do pdf
Otestujeme si na jednoduchém příkladu, že nám vše chodí.
Sub TiskDoPdf()
ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, Filename:= _
"E:\pokusy-www\excel-VBA-tisk-do-pdf.pdf", Quality:= _
xlQualityStandard, IncludeDocProperties:=True,
IgnorePrintAreas:=False, _
OpenAfterPublish:=True
End Sub
Toto makro vytvoří v adresáři E:\pokusy-www\ soubor: excel-VBA-tisk-do-pdf.pdf, takže ve svém PC musíte cestu upravit podle požadavku.
Poznámka: Pokud máte Excel 2007, musíte si podporu pro tisk do *.pdf zdarma nainstalovat z webu Microsoftu.
Další nastavení
Pokud nám první makro fungovalo, můžeme zkusit nastavit:
- Tisk z více listů (vybraných)
- Zobrazit
Sub TiskDoPdf 2()
Sheets(Array("List1", "List2")).Select
ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, Filename:= _
"E:\pokusy-www\excel-VBA-tisk-do-pdf.pdf", Quality:=_
xlQualityStandard, IncludeDocProperties:=True, IgnorePrintAreas:=False, _
OpenAfterPublish:=True
End Sub
Další nastavení:
Změna kvality:
Quality:= xlQualityMinimum
Tisk celého sešitu:
ActiveWorkbook.ExportAsFixedFormat
Po uložení nezobrazit pdf dokument:
OpenAfterPublish:=False
Závěr
A jaké jsou Vaše zkušenosti? Předpokládám, že máte Excel verze 2007 a vyšší. Jsme v roce 2012. Pro starší verze doporučuji hledat na google.
Článek byl aktualizován: 15.02.2012 11:02
Další články k tématu
- Zpracovatelné formáty souborů v Excelu
- Existuje soubor - adresář (složka)
- Vypis cesty k souboru
- Vypsat adresáře - soubory
- Je soubor otevřen
- Otevřít soubor s heslem
- Otevřít soubor a předat mu nějaký parametr
- Tisk do *.pdf - právě čtete
- Smazat soubor
- Vytvořit smazat adresář
- Kopírovat a přejmenovávat soubory
- Omezení platnosti souboru - dokumentu
- Kdo přistupuje do souboru
- Velikost souboru
- Je atribut souboru pouze pro čtení - VBA Excel
Komentáře
František
Přidáno: 07.01.12 05:41
Super, ale ještě by to chtělo, jestli to Excel umí, ten soubor *.pdf poslat mailem někam@seznam.cz.Nejlépe bez Outloku.
Pavel Lasák
Přidáno: 07.01.12 07:52
To František: Excel to umí. Jak na to bez Outloku je popsáno třeba na http://www.rondebruin.nl/cdo.htm
František
Přidáno: 07.01.12 18:46
Díky asi to fakt půjde,ale ne mě, neumím a nerozumím (učil jsem se ve škole akorát rusky,samouk doma německy,ale anglina nic moc): Pochopil jsem akorát kam dát mail.adresu odesilatele a adresáta.jinak nevím co a kam a jak!.Ale i tak dík.Kdyby byl náhodou čas a chtělo se Vám náhodou pomoci (f1f@seznam.cz).
Sub CDO_Mail_Small_Text()
Dim iMsg As Object
Dim iConf As Object
Dim strbody As String
' Dim Flds As Variant
Set iMsg = CreateObject("CDO.Message")
Set iConf = CreateObject("CDO.Configuration")
' iConf.Load -1 ' CDO Source Defaults
' Set Flds = iConf.Fields
' With Flds
' .Item("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2
' .Item("http://schemas.microsoft.com/cdo/configuration/smtpserver") _
' = "Fill in your SMTP server here"
' .Item("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = 25
' .Update
' End With
strbody = "Hi there" & vbNewLine & vbNewLine & _
"This is line 1" & vbNewLine & _
"This is line 2" & vbNewLine & _
"This is line 3" & vbNewLine & _
"This is line 4"
With iMsg
Set .Configuration = iConf
.To = "ron@debruin.nl"
.CC = ""
.BCC = ""
.From = """Ron""
Pavel Lasák
Přidáno: 08.01.12 10:54
To František: Osobně využívám Objekt Outlook, kde je již vše nastaveno (smtp server). Nemůžete využít alespoň Outlook Express? Budu-li mít trochu čas zkusím se podívat jak zprovoznit odesílání emailu s přílohou i bez Outlooku.
Roman
Přidáno: 12.02.12 10:28
zdarvim vas.. makra neovladam.. lze nejak toto makro upravit tak aby nazev souboru se menil podle bunky v listu? příklad d:\dokumenty\soubor-xxxxxx.pdf kde xxxxxx se meni podle obsahu nejake bunky. Diky za odpoveded.
Pavel Lasák
Přidáno: 12.02.12 14:04
To Roman: Lze jednoduše
a = Range("A1").Text
soubor = "d:\dokumenty\soubor-" & a & ".pdf"
´ ... Filename:= soubor ....
Raty
Přidáno: 12.02.12 21:38
Pane Lasák, úžasné stránky. Přesně toto dnes zkouším. Jen potřebuji ještě zpětnou vazbu, tj aby makro zkontrolovalo, zda se již nevyskytuje soubor téhož jména. Používáme jeden soubor, kde se mění jen několik základních údajů, ten se vytiskne, ale musí zůstat kopie pro kontrolní účely. Díky
Pavel Lasák
Přidáno: 13.02.12 08:57
To Raty: viz. http://office.lasakovi.com/excel/vba-soubory/excel-vba-soubor-slozka-adresar/
Raty
Přidáno: 13.02.12 11:35
Moc děkuji:-) Musí ty vaše stránky pořádně prohledat .
skaj
Přidáno: 15.02.12 09:12
Dobrý den,
shora uvedené makro převodu listu excel do formátu .pdf používám v jednom komplikovanějším projektu. Potřeboval bych ale poradit, a o to prosím,zda by bylo možné zobrazení dokumentu, vyvolané touto částí kódu:
OpenAfterPublish:=True
pozdržet s tím, že by mezi převodem listu excel a jeho zobrazením v novém formátu byla vložena zpráva pro uživatele.
Pro názornost, oč mi jde:
Sub TiskDoPdf 2()
Sheets(Array("List1", "List2")).Select
ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, Filename:= _
"E:\pokusy-www\excel-VBA-tisk-do-pdf.pdf", Quality:=_
xlQualityStandard, IncludeDocProperties:=True, IgnorePrintAreas:=False, _
Zde běh makra pozastavit na dobu, než uživatel přečte vloženou zprávu (MsgBox) čítající cca 3 řádky, poté teprve zobrazit dokument .pdf
OpenAfterPublish:=True
End Sub
Díky za pomoc.
Pavel Lasák
Přidáno: 15.02.12 10:40
To skaj:
OpenAfterPublish:=True
je součásti ExportAsFixedFormat (exportu do *.pdf). Nemůžete zobrazit hlášku napřed:
Sheets(Array("List1", "List2")).Select
MsgBox "Text"
Až poté publikovat do *.pdf se zobrazením daného dokumentu?
ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, Filename:= _
"E:\pokusy-www\excel-VBA-tisk-do-pdf.pdf", Quality:=_
xlQualityStandard, IncludeDocProperties:=True, OpenAfterPublish:=True
skaj
Přidáno: 15.02.12 16:55
Díky za rychlou reakci. Myslel jsem si to. Problémem celého projektu je, že hláška nemůže předcházet převodu formátu, takže je prozatímně umístěna až za převod listu (do .pdf). Na základě hlášení by však měl uživatel reagovat na text dokumentu PDF, což je problém: jakmile se převod dokončí, a to je mnohdy velmi rychle, překryje nově vzniklý otevřený dokument hlášení MsgBoxu. Protože uživatel musí reagovat na text PDF dokumentu, nemohu jej nechat po převodu uzavřený: OpenAfterPublish:=False Takže nastává manipulace s otevřeným dokumentem (shození na lištu atp.), dočtení hlášení MsgBoxu, otevření dokumentu .pdf, kontrola dle hlášení atp..atp.
skaj
Přidáno: 15.02.12 17:10
Dodatek:snad by pomohlo nějaké řešení, které by zaručilo, aby bylo hlášení MsgBoxu vždy "nahoře", tedy viditelné i po otevření převedeného dokumentu. Každopádně díky za zájem o položený dotaz.
Pavel Lasák
Přidáno: 15.02.12 17:59
To skaj: zajimavý dotaz, třeba mě nebo někoho z čtenářů něco napadne.
Jaroslav Petrovský
Přidáno: 22.03.12 08:25
Prosím jak udělat kód, abych mohl vytisknout oblast z jiného listu, než kde mám tlačítko.
Takto jak to mám já, to vytiskne pouze z aktuálního listu (ActiveSheet).
Děkuji moc.
Private Sub CommandButton1_Click()
'Tisk
ActiveSheet.PageSetup.PrintArea = "$B$9:$G$19"
'ActiveWindow.SelectedSheets.PrintPreview
Application.Dialogs(xlDialogPrint).Show
End Sub
Jaroslav Petrovský
Přidáno: 22.03.12 16:38
Dodatek k předešlému: udělal jsem to takto. Jenže já nechci, aby se na obrazovce zobrazil ten list z kterého se tiskne. Mělo by to být tak, že se klikne na tlačítko a objeví se dialog pro tisk, jak je napsáno, kde si může člověk dát náhled. A ještě navíc bych chtěl, aby ten list byl skrytý a pouze pro tisk se zviditelnil a potom zase zneviditelnil.
Private Sub CommandButton1_Click()
'Tisk
List13.Activate
ActiveSheet.PageSetup.PrintArea = "T!$B$9:$G$19"
'ActiveWindow.SelectedSheets.PrintPreview
Application.Dialogs(xlDialogPrint).Show
End Sub
Jaroslav Petrovský
Přidáno: 22.03.12 17:23
Ještě prosím o pomoc s tímto? Jak udělat kód ve VBA, aby se jedna tabulka pro tisk zobrazila vícekrát na straně. a) Chci tisknout jednu tabulku, která třeba zabere 1/3 strany A4, ale pro úsporu místa bych ji potřeboval nakopírovat pod sebe vícekrát (potřebuji více stejných kopíí, které se potom nastříhají). b) Chci tisknout více různých tabulek, které se nachází na různých místech jednoho listu.
Pavel Lasák
Přidáno: 26.03.12 18:32
To Jaroslav Petrovský: Tisk z jiného listu
Sheets(Array("List11", "List12")).Select
List se dá zobrazi a skrýt pomocí VBA kódu (změní se vlastnost Visible:
Sheets(1).Visible = xlSheetHidden
Tohle sjem nikdy neřešil. Osobně bych na dalším listě rozkopíroval danou tabulku.
Pavel Lasák
Přidáno: 26.03.12 18:41
To Jaroslav Petrovský: Nastavení oblasti tisku
´Sheet1.PageSetup.PrintArea
´například:
ActiveSheet.PageSetup.PrintArea = "$B$4:$H$16"
Připravím článek, jak nastavit a přizpůsobit oblast tisku.
Pavel Š.
Přidáno: 30.03.12 00:40
Dobrý den, tohle mi opravdu hodně pomohlo! Jenom mám takový problém, protože bych potřeboval přeskládat listy které se mi budou tisknout do onoho pdf. Aktuálně mi to bere listy tak jak jdou za sebou... P.
Pavel Lasák
Přidáno: 30.03.12 16:34
To Pavel Š: Jinak zajimavý dotaz. Doporučuji přeskládat listy:(
Sheets("List2").Select
Sheets("List2").Move Before:=Sheets(1)
Zkoušel jsem, a funguje nadefinovat oblastí pomocí Select, ale neprojde a prostě Excel tiskne jak jsou listy za sebou v sešitě Excel
Sheets(Array("List3", "List2", "List1")).Select
Pavel Š.
Přidáno: 30.03.12 20:48
Vyzkoušel jsem přeskládání listů ve VBA a funguje to skvěle. Netušil jsem, že to jde :-). Moc děkuji!
Pavel Lasák
Přidáno: 01.04.12 09:02
To Pavel Š. rádo se stalo.
Jaroslav Petrovský
Přidáno: 06.04.12 22:57
Děkuji moc, trápím se, trápím a nejde to.
Tisknu pomocí tlačítka ze sešitu pojmenovaného 3R (sešit 21). A nevím jak tam zakomponovat to, aby se mi to nikam nepřepínalo a nic neukazovalo, jak to kopíruje apod. Děkuji moc za pomoc
Co je to a musí to tam být:
ActiveWindow.SmallScroll Down:=6
Sub tlačítko307_Klepnutí()
'copy
Sheets("T").Select
Range("B566:C579").Select
Selection.Copy
Range("M461:N474").Select
ActiveSheet.Paste
Range("M476:N489").Select
ActiveSheet.Paste
Range("M491:N504").Select
ActiveSheet.Paste
ActiveWindow.SmallScroll Down:=6
Range("M506:N519").Select
ActiveSheet.Paste
Application.CutCopyMode = False
Sheets("3R").Select
'Tisk
List13.Activate
ActiveSheet.PageSetup.PrintArea = "T!$K$461:$R$519"
'ActiveWindow.SelectedSheets.PrintPreview
With ActiveSheet.PageSetup
.LeftMargin = Application.InchesToPoints(0)
.RightMargin = Application.InchesToPoints(0)
.TopMargin = Application.InchesToPoints(0.196850393700787)
.BottomMargin = Application.InchesToPoints(0.196850393700787)
.HeaderMargin = Application.InchesToPoints(0.31496062992126)
.FooterMargin = Application.InchesToPoints(0.31496062992126)
.PrintHeadings = False
.PrintGridlines = False
.CenterHorizontally = True
.CenterVertically = True
.Orientation = xlPortrait
.Zoom = False
.FitToPagesWide = 1
.FitToPagesTall = 1
End With
Application.Dialogs(xlDialogPrint).Show
Range("M461:N519").Select
Selection.ClearContents
Range("M461:N461").Select
List21.Activate
End Sub
Pavel Lasák
Přidáno: 11.04.12 21:31
To Jaroslav Petrovský:
Application.ScreenUpdating = True
....
Application.ScreenUpdating = False
nepomůže?
Jaroslav Petrovský
Přidáno: 12.04.12 08:30
ne - viz http://www.uschovna.cz/zasilka/H1395GG6TCGD5FJK-7UB děkuji moc za pomoc
Pavel Lasák
Přidáno: 15.04.12 18:06
To Jaroslav Petrovský: Co přesně potřebujete? Osobně bych makro napsal jinak.
Přidání nového komentáře
Za obsah komentářů neodpovídám, jelikož jsou komentáře publikovány ihned po jejich napsání čtenářem. Toto nemohu nijak ovlivnit. Přesto si vyhrazuji možnost jakýkoli neslušný komentář smazat bez udání důvodu.
Nejnovější článek
Z článku o
excel jsem jako poslední přidal či upravil článek
14.05.2012:
Kombinování funkcí - vzorců.
Nejčtenější článek
Excel
- Základy MS Excel
- menu Soubor
- Formát dat
- Vložit
- Grafy
- Vzorce (Funkce)
- Matice
- Data
- Revize (Nástroje)
- VBA Úvod a seznamy článků
- VBA Teorie základy
- VBA Buňky cell
- VBA Listy sheet
- VBA Práce se soubory
- Zpracovatelné formáty souborů v Excelu
- Existuje soubor - adresář (složka)
- Vypis cesty k souboru
- Vypsat adresáře - soubory
- Je soubor otevřen
- Otevřít soubor s heslem
- Otevřít soubor a předat mu nějaký parametr
- Tisk do *.pdf
- Smazat soubor
- Vytvořit smazat adresář
- Kopírovat a přejmenovávat soubory
- Omezení platnosti souboru - dokumentu
- Kdo přistupuje do souboru
- Velikost souboru
- Je atribut souboru pouze pro čtení - VBA Excel
- VBA Formuláře (UserForm)
- VBA Grafy
- VBA Application
- VBA Pás karet, Menu
- VBA Triky
- VBA praktické příklady kódu
- Praktické příklady
- Finanční poradce
- Šablony - Templates
- Testy
- Ostatní
Google+
Novinky
Matematické rovnice (vzorce) - Word 2010
Excel: 14.05.2012:
Kombinování funkcí - vzorců
Access: 28.04.2012:
VBA - Jak spustit v MS Access
Power Point: 25.04.2012:
SmartArt - PowerPoint 2010
Outlook 26.04.2012:
Outlook 2010 - jak vypadá
Project: 05.04.2012:
Kalendář ukázka
OneNote: 17.10.2010:
OneNote 2010 – popis obrazovky
Office 30.04.2012:
Kde hledat odpovědi na dotazy o MS Office
Poděkování
Translate
Stránky o MS Office produktu společnosti Micosoft. Neslouží jako technická podpora.
| Email na autora: lasak@centrum.cz | Copyright © : Pavel a Danka 2006 - 2012 |
| Doporučuji: Advokátní kancelář Brno - Dana Lasáková |
1595
Tento web zatím neprošel jazykovou korekturou. Beta verze redakčního systému.