mark47
Goto Top

Serienbrief von EXCEL nach Word

Guten Abend ins Forum. Auf der Suche nach einem geeigneten VBA Kode für eine Serienbrieffunktion bin ich hier fündig geworden. Habe den Kode bei meiner EXCEL Datei in ein Modul eingefügt und wie ich glaube die entsprechenden Pfade abgestimmt. Bis dahin läuft auch alles, er meckert bei folgender Codezeile " With ThisDocument.MailMerge" mit dem Fehlertext: Laufzeitfehler 424, Objekt erforderlich. Könnte mich jemand bei der Fehlerkorrektur unterstützen? Danke, Mark

Sub MailMergeSaveAsSingleDocs()
    Dim strDatenquelle As String, i As Long, strFilenameDOCX As String, strFilenamePDF As String
    ' Ausgabepfad  
    ' Const outputpath = "C:\Daten\output"  
    Const outputpath = "C:\Users\Besitzer\Desktop\Dokument1.docx"  
    ' Datenquelle  
    strDatenquelle = "C:\Users\Besitzer\Desktop\5ter Serienbrief.xlsm"  ' "D:\Daten\datenquelle.xlsx"  
    'Screenupdating deaktivieren  
    Application.ScreenUpdating = False
     With ThisDocument.MailMerge

Content-ID: 521245

Url: https://administrator.de/contentid/521245

Ausgedruckt am: 25.11.2024 um 22:11 Uhr

cykes
cykes 03.12.2019 um 08:00:36 Uhr
Goto Top
Moin,

hast Du den VBA-Code schon mal in Word probiert? Der Seriebrief wird ja in Word generiert und die Excel-Tabelle nur als Datenquelle verwendet.
Außerdem ist in Zeile 05 der Ausgabepfad kein Pfad sondern eine Datei, dass dürfte auch nicht funktionieren - dort also ein Verzeichnis angeben.

Gruß

cykes
mark47
mark47 03.12.2019 um 14:42:57 Uhr
Goto Top
Hallo und Danke erstmal. Habe den Kode im WORD eingebaut. Leider Kommt ein Fehler in Zeile 14 :

.OpenDataSource Name:=strDatenquelle, Format:=wdOpenFormatAuto, Connection:="Provider=Microsoft.ACE.OLEDB.12.0

mit der Fehlermeldung: "Laufzeitfehler 9105, Die Zeichenfolge ist länger als 255 Zeichen". Kann mit dem so nichts anfangen, wie kann man das abstellen? Ich fürchte ich muß nochmal auf Unterstützung von eurer Seite hoffen. Gruß Mark

Sub MailMergeSaveAsSingleDocs()
    Dim strDatenquelle As String, i As Long, strFilenameDOCX As String, strFilenamePDF As String
    ' Ausgabepfad  
    ' Const outputpath = "C:\Daten\output"  
    Const OUTPUTPATH = "C:\Users\Besitzer\Desktop\Dokument1.docx"  
    ' Datenquelle  
    strDatenquelle = "C:\Users\Besitzer\Desktop\5ter Serienbrief.xlsm"  ' "D:\Daten\datenquelle.xlsx"  
    'Screenupdating deaktivieren  
    Application.ScreenUpdating = False
     With ThisDocument.MailMerge
        'Dokumenttyp festlegen  
        .MainDocumentType = wdFormLetters
        'Datenquelle öffnen  
        .OpenDataSource Name:=strDatenquelle, Format:=wdOpenFormatAuto, Connection:="Provider=Microsoft.ACE.OLEDB.12.0;User ID=Admin;Data Source=" & strDatenquelle & ";Mode=Read;Extended Properties=""HDR=YES;IMEX=1;"";Jet OLEDB:System database="""";Jet OLEDB:Registry Path="""";Jet OLEDB:Engine Type=37;Jet OLEDB:Database Locking Mode=0;Jet OL", SQLStatement:="SELECT * FROM `Tabelle1$`", SQLStatement1:="", SubType:=wdMergeSubTypeAccess  
        'Datensätze sollen in neuen Dokumenten laden  
        .Destination = wdSendToNewDocument
        .SuppressBlankLines = True
        'Führe folgende Aktionen für jeden Datensatz der Datenquelle durch.  
        For i = 1 To .DataSource.RecordCount
            'Datenquelle auf aktuellen Datensatz beschränken  
            With .DataSource
                .FirstRecord = i
                .LastRecord = i
                .ActiveRecord = i
                'Dateinamen für DOCX und PDF zusammenbauen  
                strFilenameDOCX = Format(Date, "yyyyMMdd") & "_" & .DataFields("Vorname").Value & "_" & .DataFields("Nachname").Value & "_Test.docx"  
                strFilenamePDF = Format(Date, "yyyyMMdd") & "_" & .DataFields("Vorname").Value & "_" & .DataFields("Nachname").Value & "_Test.pdf"  
            End With
            'Mailmerge für aktuellen Datensatz ausführen  
            .Execute Pause:=False
            ' Dokument des aktuellen Datensatzes  
            With ActiveDocument
                ' Speichern als DOCX  
                .SaveAs2 OUTPUTPATH & "\" & strFilenameDOCX  
                'Speichern als PDF  
                .ExportAsFixedFormat OUTPUTPATH & "\" & strFilenamePDF, wdExportFormatPDF  
                'Dokument schließen  
                .Close False
            End With
        Next
    End With
    'Screenupdating aktivieren  
    Application.ScreenUpdating = True
End Sub
cykes
cykes 03.12.2019 um 16:58:10 Uhr
Goto Top
Hi,

da hast Du meine obige Anmerkung bezüglich des Pfads ebenfalls nicht umgesetzt. Außerdem hättest Du mal die Quelle angeben können (>dieser Thread<). Natürlich kannst Du nicht einfach alles 1:1 kopieren, das muss schon Deiner Office-Version, sowie Deinen Randbedingungen angepasst werden. Vor 2,5 Jahren war das bestimmt noch eine andere Office-Version als die von Dir verwendete.
Versuch doch erstmal den Code von @colinardo zu verstehen anstatt ihn einfach nur zu kopieren und auszuführen, was in Deiner Umgebung auch schieflaufen muss.

Gruß

cykes
beidermachtvongreyscull
beidermachtvongreyscull 03.12.2019 aktualisiert um 17:24:37 Uhr
Goto Top
Kürze in Zeile 7 den String in der Variable soweit wie möglich.
Ferner stelle sicher, dass der ohne Leerzeichen auskommt.

Folgendes ist ein ungeprüfter Ansatz mit dem Du Zeile 14 alternieren könntest:

    .OpenDataSource bstrDataSource:="C:\tabelle.xlsm", bstrTable:="out_pub", fNeverPrompt:=True, fOpenExclusive:=True  

Ich hab jetzt nicht getestet, ob RecordCount dann ebenfalls funktioniert, wenn man eine Excel-Datei nicht über einen OLE-Provider öffnet.
141965
141965 03.12.2019 aktualisiert um 17:23:02 Uhr
Goto Top
"C:\Users\Besitzer\Desktop\5ter_Serienbrief.xlsm"
Sieht mir ganz schwer nach Leerzeichen-Problem aus, da in Zeile 14 keine Anführungszeichen um den Pfad gesetzt sind beschwert sich der Interpreter über einen String größer als 255 Zeichen, logisch face-wink.

Also Zeile 14 einfach noch weitere Anführungszeichen um den Pfad einbauen dann sollte er dort zufrieden sein:
 .OpenDataSource Name:=strDatenquelle, Format:=wdOpenFormatAuto, Connection:="Provider=Microsoft.ACE.OLEDB.12.0;User ID=Admin;Data Source=""" & strDatenquelle & """;Mode=Read;Extended Properties=""HDR=YES;IMEX=1;"";Jet OLEDB:System database="""";Jet OLEDB:Registry Path="""";Jet OLEDB:Engine Type=37;Jet OLEDB:Database Locking Mode=0;Jet OL", SQLStatement:="SELECT * FROM `Tabelle1$`", SQLStatement1:="", SubType:=wdMergeSubTypeAccess  
mark47
mark47 04.12.2019 um 18:34:30 Uhr
Goto Top
Danke, mit dem Einbauen weiterer Anführungszeichen läuft der Prozess weiter stockt allerdings mit folgender Fehlermeldung in Zeile 14:

Laufzeitfehler 438, Objekt unterstützt diese Methode oder Eingenschaft nicht. Hat da vielleicht noch jemand eine Lösung für mich parat?

.SaveAs2 OUTPUTPATH & "\" & strFilenameDOCX  

Gruß Mark
cykes
cykes 04.12.2019, aktualisiert am 05.12.2019 um 00:10:27 Uhr
Goto Top
Zitat von @mark47:

Danke, mit dem Einbauen weiterer Anführungszeichen läuft der Prozess weiter stockt allerdings mit folgender Fehlermeldung in Zeile 14:
Laufzeitfehler 438, Objekt unterstützt diese Methode oder Eingenschaft nicht. Hat da vielleicht noch jemand eine Lösung für mich parat?

.SaveAs2 OUTPUTPATH & "\" & strFilenameDOCX  
Hast Du den outputpath inzwischen korrekt zugewiesen? Oder steht der nach wie vor auf "C:\Users\Besitzer\Desktop\Dokument1.docx" ?
Das geht nämlich nicht, da das einen Datei und kein Pfad ist. Also auf bspw. "C:\Users\Besitzer\Desktop" kürzen, dann sollte es klappen.

Gruß

cykes
141965
141965 04.12.2019 aktualisiert um 22:38:12 Uhr
Goto Top
Tja das kommt vom stumpfen Copy n Paste und ohne Verstand und Beitrag lesen, zumal sich der User ja extra die Zeit genommen hat jede Zeile extra noch mit einem Kommentar zu versehen 🙄....
mark47
mark47 05.12.2019 um 21:13:16 Uhr
Goto Top
Danke an alle. Habe nochmal eure Hinweise gelesen.
Ich verwende Office 2007 und die Microsoft Word x.y Object Library kann bei mir nicht aktiviert werden, weil nicht vorhanden. Kann das vielleicht
ein Hemmnis sein?
Weiterhin hatte ich den Pfad korrigiert, der Fehler erscheint aber weiterhin unverändert. Was ich jetzt auch nicht verstehe ist, das ein Serienbrief1 aktiviert wird, den ich aber nirgends anvisiere? Gruß Mark
cykes
cykes 06.12.2019 um 07:44:27 Uhr
Goto Top
Zitat von @mark47:

Danke an alle. Habe nochmal eure Hinweise gelesen.
Das ist schon mal ein Anfang, aber hast Du den Code und unsere Hinweise auch verstanden?
Ich verwende Office 2007 und die Microsoft Word x.y Object Library kann bei mir nicht aktiviert werden, weil nicht vorhanden. Kann das vielleicht
ein Hemmnis sein?
Dann läuft der OLE-Aufruf vermutlich schief.
Weiterhin hatte ich den Pfad korrigiert, der Fehler erscheint aber weiterhin unverändert. Was ich jetzt auch nicht verstehe ist, das ein Serienbrief1 aktiviert wird, den ich aber nirgends anvisiere?
Sei mir nicht böse, aber so wird das nichts, wir sehen hier nicht was Du wo genau tust und nur anhand der Fehlemeldungen lässt sich die Ursache aus der Ferne nicht ermitteln. Auch kennen wir den Inhalt Deiner Dateien (Datenquelle und Word-Datei nicht, inbesondere ob die Feldnamen korrekt sind und die Daten auch in den korrekten Spalten/Zeilen stehen) nicht.

Vielleicht wäre es besser, wenn Du etwas kleiner anfängst mit einer kleineren Datenquelle mit bspw. 5 Adressen, den Code neu schreibst und Dich dann langsam hochhangelst. So lernst Du etwas dabei.
Mit der aktuellen Vorgehensweise hast Du nach einiger Zeit vergessen, woran es nun genau gehangen hat und kannst nicht mehr nachvollziehen, was Du genau wo anpassen musst.

Gruß

cykes