Hallo Otto,
ich habe das mal fertig überarbeitet. Die Kommentare sollten das Ganze erklären. Du musst ein paar Variablen auf Dein System anpassen. Die habe ich alle direkt unter die Variablendeklaration geschrieben und mit dem Hinweis Anpassen versehen. Die Pfade zu den PDF-Dateien müssen mit in den Zellen stehen. Der Vorteil ist, dass man so auch PDFs aus unterschiedlichen Verzeichnissen mergen kann. Der Nachteil ist, man muss eben alle Pfade mit einfügen. Das kannst Du ggf. ja umschreiben, wenn Du es anders brauchst.
Noch ein wichtiger Hinweis:
Das Makro fügt die angegebenen PDFs nur bei jedem zweiten Lauf zusammen. Ansonsten wird immer nur das erste PDF genommen. Ich habe keine Ahnung warum. Beendet man Excel nach dem ersten Lauf und startet es wieder, läuft auch das Makro direkt wieder korrekt. Vielleicht ist das auch nur auf meinem Rechner so. Ich verwende Windows 10 (aktueller Patchstand) und Excel 2016 in der 32 Bit Version.
Sub DateienMergenZuPDF()
'Das Makro wurde mit dem PDFCreator 3.5 entwickelt
'Verwendet wird die COM-Schnittstelle des PDFCreator:
'https://docs.pdfforge.org/pdfcreator/latest/de/pdfcreator/com-interface/
'
'Der PDFCreator muss auf dem Rechner installiert sein, auf dem das Makro ausgeführt wird
'Es reicht die kostenfreie Version
'Der PDF-Architect muss nicht installiert sein
'https://www.pdfforge.org/de/pdfcreator/download
Dim pdfCreator As Object
Dim pdfCreatorQueue As Object
Dim PDFs As Long
Dim startZeilePDFnamen As Long
Dim letzteZeilePDFnamen As Long
Dim quellTabelle As String
Dim quellSpalte As Integer
Dim ausgabePfad As String
Dim ausgabePDFname As String
quellTabelle = ActiveSheet.Name '<-- Anpassen, wenn es eine feste Tabelle sein soll
quellSpalte = 1 '<-- Anpassen, voreingestellt ist Spalte A
ausgabePfad = "E:\" '<-- Anpassen, auf abschließenden Backslash achten
ausgabePDFname = "Zusammengefasst.pdf" '<-- Anpassen, auf abschließendes .pdf achten
startZeilePDFnamen = 2 '<-- Anpassen, ab welcher Zeile die PDF Namen in der Tabelle stehen
'Feststellen wieviele Zeilen in der festgelegten Spalte der festgelegten Tabelle belegt sind
letzteZeilePDFnamen = Sheets(quellTabelle).Cells(Rows.Count, quellSpalte).End(xlUp).Row
'Einleitend eine grundsätzliche Erklärung zur Verwendung der COM-Schnittstelle
'des PDFCreators. Die API-Dokumentation ist für V2, das Makro ist aber bereits
'für den PDFCreator 3.5 geschrieben
'
'Auszug unter der Überschrift "Modularität" aus:
'https://docs.pdfforge.org/pdfcreator/latest/de/pdfcreator/com-interface/user-manual/basics/workflow-comparsion-v1-7-v2/
'
'Im Vergleich dazu hat die COM Schnittstelle des neuen PDFCreators (v2.*) fünf
'verschiedene Objekte: das Queue Objekt, das PrintJob Objekt, das PDFCreatorObj
'Objekt, das Printers Objekt, das OutputFiles Objekt. Der Fokus liegt hierbei
'auf den drei ersten Objekten, da diese ausreichen, um den prinzipiellen Ablauf
'zu beschreiben. Das Queue Objekt fungiert als Behälter für alle Druckaufträge,
'die konvertiert werden sollen. Durch das Queue Objekt hat man die volle Kontrolle
'über diesen Behälter. Jeder einkommende Druckauftrag wird gewrappt und
'repräsentiert durch ein PrintJob Objekt, das es ermöglicht, spezielle
'Einstellungen für einen Druckauftrag zu setzen, wie z.B. unter welchem Profil
'dieser Druckauftrag konvertiert werden soll. Das PDFCreatorObj Objekt ermöglicht
'das Erfragen von Informationen zur PDFCreator Instanz, ob beispielsweise die
'PDFCreator Anwendung gerade läuft oder nicht.
'
'Wir setzen die beiden benötigten der 5 möglichen Objekte zum Mergen von Druckaufträgen
Set pdfCreator = CreateObject("PDFCreator.PDFCreatorObj")
Set pdfCreatorQueue = CreateObject("PDFCreator.JobQueue")
'https://docs.pdfforge.org/pdfcreator/latest/de/pdfcreator/com-interface/reference/queue/
'sagt, Initialize() muss aufgerufen werden:
'"Zusammenfassung: Um das erzeugte COM-Objekt nutzen zu können, muss als aller erstes diese
'Methode aufgerufen werden."
'(Unter dem Link sieht man übrigens unter der ersten Überschrift "Die Queue" und hinter
'dem Wort "ProgID" darunter, genau den Schriftzug, den wir für die Initialisierung des
'benötigten Queue-Objektes weiter oben verwendet haben.)
Call pdfCreatorQueue.Initialize
'Die zusammenzuführenden Dateien in die Queue schieben
'Laut Referenz funktioniert das nur mit PostScript Dateien
'Das geht in der Version 3.5 aber auch mit PDF-Dateien
'https://docs.pdfforge.org/pdfcreator/latest/de/pdfcreator/com-interface/reference/pdfcreator/
'Unter der letzten Überschrift "void AddFileToQueue(string path)" steht:
'Zusammenfassung: Fügt eine Datei direkt zur Queue hinzu, ohne dass gedruckt werden muss.
'Momentan können jedoch nur .PS Dateien direkt hinzugefügt werden, dies könnte sich mit
'den nächsten Versionen der COM-Schnittstelle ändern.
'path: Der Pfad zur Datei, die hinzugefügt werden soll.
'
'Schleife über alle PDF-Dateinamen mit Pfad zum Erstellen der Druckjobs
'Das Makro geht also davon aus, dass der Pfad mit in den Zellen steht
For PDFs = startZeilePDFnamen To letzteZeilePDFnamen
Call pdfCreator.AddFileToQueue(Sheets(quellTabelle).Cells(PDFs, quellSpalte).Value)
Next PDFs
'Wir bewegen uns in der Dokumentation jetzt wieder hier:
'https://docs.pdfforge.org/pdfcreator/latest/de/pdfcreator/com-interface/reference/queue/
'Jetzt unter der Überschrift "void MergeAllJobs()"
'Wir fügen also alle bisher erstellten Druckjobs zu einem zusammen
Call pdfCreatorQueue.MergeAllJobs
'Den "Druck" als PDF-Datei in den oben definierten Ausgabepfad unter dem
'oben definierten PDF-Ausgabenamen durchführen
Call pdfCreatorQueue.NextJob.ConvertTo(ausgabePfad & ausgabePDFname)
'Aufräumen
'COM freigeben
'Unter der letzten Überschrift "void ReleaseCom()" den Kasten beachten:
'https://docs.pdfforge.org/pdfcreator/latest/de/pdfcreator/com-interface/reference/queue/
Call pdfCreatorQueue.ReleaseCom
Set pdfCreatorQueue = Nothing
Set pdfCreator = Nothing
End Sub
Viele Grüße,
Zwenn
|