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.
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.
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
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.
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
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