ich arbeite noch nicht so lange mit VBA und nun möchte mein Chef das ich ihm ein Makro programmiere, womit er bei einem Sereinbrief für jeden Datensatz eine neue Datei als PDF speichert.
Nun habe ich begonnen mich langsam ran zu tasten und mich mit VBA (Word 2003) zu beschäftigen.
Ich habe es hin bekommen das er mir die Dateien als .doc Dateien speichert und nun nur noch meinen Quelltext anpassen, so das PDF Dateien gespeichert werden.
Nach deinen Anleitungen habe ich nun einen FM-Drucker angelegt. wenn ich nun mein Makro ausführe bekomme ich immer wieder die Fehlermeldung: Keine oder falsch betitelte PS-DAtei gefunden.
Hast du vlt. eine Idee wo das Problem liegen könnte?
Dim sName As String Dim Pfad As String Dim DName As String Dim Ordner As String
Dim straktuellerDrucker As String Dim PDFName As String Dim drName As String
If ActiveDocument.Saved = False Then Dialogs(wdDialogFileSaveAs).Show End If
DName = ActiveDocument.Name Dim arrName() As String arrName = Split(DName, ".") DName = arrName(0) Pfad = ActiveDocument.Path
Sprungziel: sName = InputBox("Geben Sie ein Serienfeld ein, an welches sie die Dateinamen binden möchten. Achten Sie dabei auf die KORREKTE Schreibweise", "Hinweis")
Ordner = Pfad & "" & DName If Dir(Ordner, vbDirectory) = "" Then MkDir Ordner End If
With ActiveDocument.MailMerge .DataSource.ActiveRecord = wdLastRecord anzahl = .DataSource.ActiveRecord flag = False For Each x In .DataSource.DataFields If x.Name = sName Then flag = True Exit For Else MsgBox ("Dieses Serienfeld existiert nicht! Überprüfen Sie die richtige Schreibweise.") GoTo Sprungziel: End If Next .Destination = wdSendToNewDocument For i = 1 To anzahl .DataSource.ActiveRecord = i dsname = Pfad & "" & DName & "" & _ .DataSource.DataFields(sName).Value & ".doc" .DataSource.FirstRecord = i .DataSource.LastRecord = i .Execute ActiveDocument.Range.Find.Execute findtext:="^b", replacewith:="" Set fs = CreateObject("Scripting.FileSystemObject")
drName = Pfad & "" & DName & "" & _ .DataSource.DataFields(sName).Value & ".ps" PDFName = .DataSource.DataFields(sName).Value & ".PDF" straktuellerDrucker = Application.ActivePrinter ActiveDocument.PrintOut OutputFileName:=drName, PrintToFile:=True, ActivePrinterMacGX:="FreePDF_Multidoc RPT1:" Shell ("D:ProgrammeFreePDF_MultidocFreePDF_Multidoc.exe /f " & PDFName & " /p " & Ordner) Application.ActivePrinter = straktuellerDrucker
ohne jetzt auf Deinen Code im einzelnen einzugehen, zu Word-Serienbriefen nur soviel:
1. Erstelle ein Serienbrief mit Anbindung an der Datenquelle 2. Anstelle der Ausgabe auf einen Drucker, wählst Du jetzt Ausgabe in neues Word-Dokument.
Damit werden alle Briefe in einem Word-Dokument übertragen. Diese werden aber per Abschnittswechsel voneinander getrennt. 3. Aufgrund der Tatsache, das jetzt alle Briefe in Abschnitte unterteilt sind, kannst Du diese einzeln Ausdrucken.
Public Function Print_Section(strPrinter As String) Dim i As Long
'Optional für die Verwendung der Printjobs.dll siehe auch Online-Hilfe 'Dim myDruckjobs As New Druckauftrag
For i = 1 To ActiveDocument.Sections.Count Application.PrintOut Range:=wdPrintRangeOfPages, Item:= _ wdPrintDocumentContent, Copies:=1, Pages:="S" & i, _ PageType:=wdPrintAllPages, _ Background:=True
Wenn Du die Printjobs.dll verwenden möchtest, dann lösche einfach das REM-Zeichen. Wie die dll eingebunden wird, findest Du auf meiner Webseite unter 4. Tools.
4. Da jetzt alle Ausdrucke einzeln erfolgten, kannst Du mit FreePDF_Multidoc und dem Schalter /e diese auch einzeln konvertieren. Vewendest Du die DLL nicht, dann musst du selber warten bis auch der letzte Ausdruck vollständig erledigt ist.
1 2 3 4 5
Shell ("D:ProgrammeFreePDF_MultidocFreePDF_Multidoc.exe /f " & PDFName & " /e /p " & Ordner)
Das war es.
Gruß Ahmed
FreePDF_Multidoc (PS2PDF mit vielen Optionen f. FreePDF) File2PDF (komplette Verzeichnisse auf einen Streich umwandeln) findest Du alles hier: http://amTools.de
Danke für deine Hilfe, an den Abschnitsswechsel im Serienbrief habe ich gar nicht mehr gedacht, das hätte es von Anfang an leichter gemacht ^^
Jedenfalls läuft das Programm jetzt ohne Probleme. Der einzige Markel den ich jetzt noch beheben müsste sind die Namen der PDF-Dateien.
LG Anja
wie Makel? Du kannst doch den Namen der PDF mit dem Schalter /f ... selbst bestimmen. Oder möchtest Du zusätzlich noch z. B. eine Kundennummer in dem Dateinamen haben?
Wenn ja, dann gäbe es hierfür zwei Möglichkeiten:
Variante 1: Du druckst den Abschnitt aus und führst sofort die Konvertierung aus. Dabei liest Du z. B. die KdNr. aus und verwendest diese dynamisch in dem Druckjob. Per VBA ist das kein Problem.
1 2 3
/f "Brief_" & KdNr
Nachteil: Es dauert halt etwas länger. Besser ist bei vielen Ausdrucken die Variante 2.
Variante 2: Erstelle Dir einfach eine sog. Serienbrief-Datei. In dem Dateinamen verweist Du stattdessen jetzt einfach auf diese Serienbriefdatei.
1 2 3
/f [c:...Serienbrief.txt] /e
Denn Aufbau und die genaue Verwendung habe ich in der Online-Hilfe (Druckjobeinrichtung) beschrieben. Diese Serienbriefdatei wird jetzt halt bei jedem Ausdruck des Abschnittswechsel ergänzt. Dazu werden halt alle Angaben in die Textdatei geschrieben.
In den VB-Programmbeispielen habe ich das einmal ein Beispiel für ein VBScript gemacht. Das in VBA so umzusetzen sollte dann kein Problem sein.
Schau einfach auch einmal in Word-VBA unter dem Stichwort Open .... For Output As ... nach.
Nachdem nun alle Ausdrucke erfolgt sind (und der Druckspooler leer ist) jetzt einfach den Batchaufruf mit der Seriendruckdatei.
Alle Ausdrucke werden jetzt der Reihe nach gem. Def. Seriendruckdatei konvertiert.
Gruß Ahmed
FreePDF_Multidoc (PS2PDF mit vielen Optionen f. FreePDF) File2PDF (komplette Verzeichnisse auf einen Streich umwandeln) findest Du alles hier: http://amTools.de
Danke für deine Hilfe, an den Abschnitsswechsel im Serienbrief habe ich gar nicht mehr gedacht, das hätte es von Anfang an leichter gemacht ^^
Jedenfalls läuft das Programm jetzt ohne Probleme. Der einzige Markel den ich jetzt noch beheben müsste sind die Namen der PDF-Dateien.
LG Anja
Nein, eine Exe kennt keinen Rückgabewert.
Dafür gäbe es aber auch wieder zwei Möglichkeiten.
1. Vor dem Ausdruck löscht Du die Printjob.log-Datei. Nachdem der Batchjob vollständig erledigt ist, wird diese nämlich neu erstellt. Hier ist der Batchaufruf enthalten.
Ist also die Printjob.log wieder da, ist die Konvertierung erledigt. Prüfen kannst Du das mit der Dir()-Funktion.
2. Du prüfst halt selbst mit der Dir()-Funktion, ob sich noch PS-Dateien im Druckverzeichnis vorliegen. Ist auch keine große Sache.
Gruß Ahmed
FreePDF_Multidoc (PS2PDF mit vielen Optionen f. FreePDF) File2PDF (komplette Verzeichnisse auf einen Streich umwandeln) findest Du alles hier: http://amTools.de