Přeskočit navigaci | Přeskočit na novinky

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



| tisk stránky TISK | nahoru NAHORU |
| |

Další články k tématu




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"" " .Subject = "New figures" .TextBody = strbody .Send End With End Sub

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




(vlož číslo šest)

Z bezpečnostních důvodu dočasně nemůžete použít HTML značky a URL. Děkuji za pochopení.
Děkuji, za Vaše 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




Google+

  

Facebook

facebook  

Novinky

Word: 12.5.2012:
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í

Poděkování patří hlavně mojí nejbáječnější manželce.

LinkedIN

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.