Mehrere Excel-Dateien in PDF "drucken" mit Hilfe eines VBA Makros

29.08.2011
16:01

Mehrere Excel-Dateien in PDF "drucken" mit Hilfe eines VBA Makros

Wer regelmäßig mehrere Excel-Sheets (mit mehreren Tabellenblättern) in PDF-Dokumente zusammenfassen möchte, für den haben wir hier etwas: Ein kleines VBA Makro, dass das Erzeugen von PDFs aus mehreren Excels erleichtert.

Das Problem

Wir standen aktuell vor der Aufgabenstellung, dass wir mehrmals im Quartal einen Bericht über den Verlauf einer Dokumentation abgeben sollten. Für die Dokumentation haben wir uns für eine Excelstruktur entschieden.

Um nun nicht für jeden Zwischenbericht etliche Excel-Sheets ausdrucken zu müssen (Stichwort Green-IT und Kostenreduktion) haben wir uns für die PDF-Variante entschieden. Was für die Papierform noch einfach geht (alles Markieren -> rechte Maustaste -> Drucken) geht für die PDF-Version schon nicht mehr so einfach. Nach kurzer Suche in Excel und im Netz stellte sich raus: Ein Makro muss her! Leider haben wir auf Anhieb kein funktionierendes gefunden. Also haben wir kurzerhand selbst eines geschrieben.

Das VBA Makro

Mit diesem VBA Makro müsst Ihr nicht mehr jedes einzelne Excel zum Drucken oder Veröffentlichen öffnen und es wird auch nicht mehr gefragt ob man die Änderungen speichern möchte, nur weil man den "Drucker" auf PDF umgestellt hat.

Sub AlleDrucken()

    'Aus welchen Zellen werden die Informationen bezogen
    'Verbessert die Struktur des Excel-Makros, eigene Modifikatioen sind leichter einzupflegen
    Const z_Pfad As String = "C3"       
      'in dieser Zelle stehen die Angaben zum Pfad, an welcher Stelle die Quell Excels liegen
    Const z_Filter As String = "C4"     
      'in dieser Zelle stehen die Angaben zum Filter, welcher eine Einschränkung der betrachteten Dateien ermöglicht
    Const z_Endung As String = "C5"     
      'in dieser Zelle stehen die Angaben zur Endung der Quelldatei
    
    'Konstante
    Const c_OutOrdnerName As String = "PDF" 
      'Hier kann der Name eingestellt werden wie der Zielordner heißen soll + Datum und Uhrzeit
      
    'Variablen
    Dim v_AktuelleDatei As String       
      'Name der aktuelle Datei
    Dim v_Output As String              
      'Pfad der für die Ausgabe der PDFs zusammen gebaut wird
    Dim v_OutOrdner As String           
      'Name des neu anzulegenden Ordners (im Quellordner) für die Ausgabe
        
    'Main
    Application.ScreenUpdating = False  
      'schaltet die Aktualisierung des Inhalts der Excel ab
    
    v_OutOrdner = "PDF_" & Format(Time, "YYYYMMDD-hhmmss") & "\" 
      'ergänzt den Zielordner um das aktuelle Datum und Uhrzeit
    
    MkDir (Range(z_Pfad).Value & v_OutOrdner) 
      'Erstellt den Ordner für die Ausgabe im Quellverzeichnis

    v_AktuelleDatei = Dir(Range(z_Pfad).Value & Range(z_Filter).Value & Range(z_Endung).Value) 
      'Gibt den ersten Dateinamen wieder, der auf die angegebenen Filterkriterien passt
    
    
    While v_AktuelleDatei <> "" 
      'Eine Schleife die so lange läuft bis kein weiteres Excel mehr auf die Filterkriteren zutrifft
         
         OutFile = Range(z_Pfad).Value & v_OutOrdner & Replace(v_AktuelleDatei, Range(z_Endung).Value, ".pdf") 
           'Pfad und Endung für die Ausgabe der Datei werden angepasst
         
         Workbooks.Open Filename:=Range(z_Pfad).Value & v_AktuelleDatei, UpdateLinks:=False 
           'Öffnen der zu druckenden Excel ohne den Inhalt zu aktualisieren

         ActiveWorkbook.ExportAsFixedFormat Type:=xlTypePDF, Filename:=OutFile 
           'Export der Excels als PDF. Hier wären auch alternative "Druck" bzw Export Optionen einzustellen
         
         ActiveWorkbook.Close savechanges:=False 
           'Excel ohne zu speichern schließen
         
         v_AktuelleDatei = Dir 
           'Übergibt den Dateinamen der nächsten Excel die auf die Filterkriterien zutrifft
         
    Wend

   Application.ScreenUpdating = True 
      'Ab hier werden Änderungen in der Excel wieder angezeigt
   
End Sub

Das VBA Makro ist für Office 2010 mit VBA 7.0
Sub AlleDrucken()

    'Zellen
    Const z_Pfad As String = "C3" 
    Const z_Filter As String = "C4" 
    Const z_Endung As String = "C5"

    'Konstante
    Const c_OutOrdnerName As String = "PDF" 

    'Variablen      
    Dim v_AktuelleDatei As String      
    Dim v_Output As String             
    Dim v_OutOrdner As String       
        
    'Main
    Application.ScreenUpdating = False
    v_OutOrdner = "PDF_" & Format(Time, "YYYYMMDD-hhmmss") & "\"
    MkDir (Range(z_Pfad).Value & v_OutOrdner)
    v_AktuelleDatei = Dir(Range(z_Pfad).Value & Range(z_Filter).Value & Range(z_Endung).Value)
     
    While v_AktuelleDatei <> "" 
         OutFile = Range(z_Pfad).Value & v_OutOrdner & Replace(v_AktuelleDatei, Range(z_Endung).Value, ".pdf")
         Workbooks.Open Filename:=Range(z_Pfad).Value & v_AktuelleDatei, UpdateLinks:=False
         ActiveWorkbook.ExportAsFixedFormat Type:=xlTypePDF, Filename:=OutFile 
         ActiveWorkbook.Close savechanges:=False
         v_AktuelleDatei = Dir 
    Wend

    Application.ScreenUpdating = True 
 
End Sub

Ohne Kommentare
Das Excel

Wichtig wäre noch zu erwähnen, dass der Pfad (C3) mit einem "\" enden sollte. Das Layout könnt Ihr dank z_Pfad, z_Filter und z_Endung leicht nach eurem Geschmack anpassen.

2 Kommentar(e)

Gravatar: SebastianSebastian
24.04.2012
16:06

Vielen Dank für das Skript. Es funktioniert genau wie beschrieben. Besteht noch die Möglichkeit dem Skript beizubringen, dass er nur z. B. die ersten drei Tabellenblätter druckt? Gruß, Sebastian

Sascha Becker
03.05.2012
15:48
kleine Erweiterung

Hi Sebastian,

es freut mich sehr das mein kleines Script Anwender findet!

Hier mal eine schnelle Lösung für deine Frage:
In Zeile 46(kommentierte Fassung) bitte folgende Codezeile ergänzen:
ActiveWorkbook.Sheets(Array("Tabelle1", "Tabelle2")).Select

In Zeile 47(kommentierte Fassung) muss folgendes ersetzt werden:
ActiveWorkbook.ExportAsFixedFormat
wird zu
ActiveSheet.ExportAsFixedFormat

Wir wählen also die Tabellen aus bevor der "Druck"-Befehl kommt.
Hier "Tabelle1" und "Tabelle2" die durch ein Komma getrennt werden (lässt sich auch beliebig erweitern).
Den "Druck"-Befehl ändern wir so ab, dass lediglich ausgewählte Tabellen (ActiveSheet) zum "Drucken" angesprochen werden und nicht mehr die ganze Arbeitsmappe (Workbook).

VORSICHT: Bei dieser "quick and dirty" Variante ist sicherzustellen, dass die Tabellennamen in allen, mit diesem Script angesprochenen Dateien, vorhanden sind.

Bei entsprechendem Bedarf scripte ich aber auch gerne eine ausgefeiltere Variante.

Beste Grüße
Sascha Becker

Mein Kommentar zum Beitrag

Ich möchte über jeden weiteren Kommentar in diesem Post benachrichtigt werden.

Zurück zur Listenansicht

Meist gelesene Beiträge

Lightboxeffekt in Typo3 mit Perfect Lightbox
665 times viewed
19.09.2011 16:30
Mehrere Excel-Dateien in PDF "drucken" mit Hilfe eines VBA...
628 times viewed
29.08.2011 16:01
Tutorial: Web 2.0 Buttons mit Hilfe von CSS3
613 times viewed
08.08.2011 12:01
Wann ist Weblogscreening sinnvoll?
425 times viewed
11.08.2011 15:32

Letzte Kommentare

kleine Erweiterung
03.05.2012 15:48
Vielen Dank für das Skript. Es funktioniert genau wie...
24.04.2012 16:06
G+ schafft es nicht
26.03.2012 12:14
Lightbox ohne Extension
21.09.2011 13:46

Social Bookmarking

Bookmark bei: Mr. Wong Bookmark bei: Webnews Bookmark bei: Yigg Bookmark bei: StumbleUpon Bookmark bei: Google