Office: VBA - Serienbriefe in einzelnen Dokumenten speichern

Helfe beim Thema VBA - Serienbriefe in einzelnen Dokumenten speichern in Microsoft Word Hilfe um das Problem gemeinsam zu lösen; Hallo, Ich möchte Serienbriefe mit Daten aus einem Excelsheet erstellen. Dann sollen die Briefe als einzelne Word-Dokumente in einem Ordner... Dieses Thema im Forum "Microsoft Word Hilfe" wurde erstellt von LiMa, 14. Oktober 2021.

  1. LiMa Neuer User

    VBA - Serienbriefe in einzelnen Dokumenten speichern


    Hallo,

    Ich möchte Serienbriefe mit Daten aus einem Excelsheet erstellen.
    Dann sollen die Briefe als einzelne Word-Dokumente in einem Ordner abgespeichert werden.
    Dazu soll ein Ordner, benannt mit dem tagesaktuellen Datum erstellt werden, in dem die Dokumente abgespeichert werden sollen.
    Das Ordner-Erstellen funktioniert schon ganz gut.
    Was nicht wirklich funktioniert ist das Abspeichern der Dokumente.
    Sie sollen gespeichert werden, wenn in der Excel-Tabelle das Feld "Vorname" und "Nachname" ausgefüllt ist.
    Momentan zeigt Word eine Fehlermeldung "Ein Problem wurde von Word festgestellt" an und erstellt auch, wenn das Feld "Vorname" oder "Nachname" nicht gefüllt ist, ein Dokument, das nicht im Ordner gespeichert wird und nur Serienbrief(Nummer) heißt.
    Ich möchte eigentlich nur, dass die Dokumente zuverlässig im Ordner abgespeichert werden und dass es keine Fehlermeldung gibt.
    Kann mir jemand weiterhelfen und mir evtl. sagen, wo der Fehler liegt?
    Ich poste unten, was ich bisher habe.
    Ich lerne das gerade noch, habe schon viele Tutorials angeschaut, komme hier nicht weiter und bin um jeden Rat sehr dankbar!

    Viele Grüße und herzlichen Dank :-)
    ~~~~~~~~~

    Sub briefe_erstellen()

    'String für Ordnerpfad definieren
    Dim strFolderPath As String
    Dim Datum As String
    strDatum = Format(Date, "JJJJ-MM-TT")
    strFolderPath = "C:\Users\equi\Documents\Divers\XX\Rechnungen\Rechnung_backup_" & Format(Date, "YYYY-MM-DD")
    ' Überprüfen, ob Ordner bereits existiert
    If Dir(strFolderPath, vbDirectory) = "" Then
    ' Ordner anlegen
    MkDir (strFolderPath)
    MsgBox "Ordner wurde angelegt!"
    Else
    MsgBox "Ordner ist vorhanden!"
    End If

    Dim nNachname As String
    Dim nVorname As String

    Dim Pfad As String


    nNachname = "Nachname"
    nVorname = "Vorname"

    Pfad = "C:\Users\equi\Documents\Divers\XX\Rechnungen\Rechnung_backup_" & Format(Date, "YYYY-MM-DD")

    ' Anwendung ausblenden für bessere Leistung
    MsgBox "Serienbriefe werden exportiert. Dieser Vorgang kann einige Minuten dauern - Microsoft Word wird während dieser Zeit ausgeblendet", vbOKOnly + vbInformation
    Application.Visible = False


    With ActiveDocument.MailMerge
    .DataSource.ActiveRecord = wdLastRecord
    anzahl = .DataSource.ActiveRecord
    flag = False
    For Each x In .DataSource.DataFields
    If x.Name = nEmail Then
    flag = True
    Exit For
    End If
    Next
    .Destination = wdSendToNewDocument
    For i = 1 To anzahl
    .DataSource.ActiveRecord = i
    dsname = Pfad & "\" & _
    .DataSource.DataFields(nVorname).Value & "_" & .DataSource.DataFields(nNachname).Value & "_" & Format(Date, "YYYY-MM-DD") & "_Rechnung.docx"
    .DataSource.FirstRecord = i
    .DataSource.LastRecord = i
    .Execute
    ActiveDocument.Range.Find.Execute findtext:="^b", replacewith:=""
    Set fs = CreateObject("Scripting.FileSystemObject")

    ActiveDocument.SaveAs FileName:=dsname, AddToRecentFiles:=False


    Next i

    End With
    End Sub
     
  2. Gerhard H Erfahrener User
    Hallo LiMa,

    du hast ein paar Ungereimtheiten in deinem Code:

    • Einige Variablen hast du deklariert, andere wieder nicht. Ich empfehle dir, alle Variablen zu deklarieren, damit es nicht zu unvorhergesehenen Resultaten kommt.
    • Unter den undeklarierten Variablen findet sich die Variable nEMail. Da ich nicht weiß, was sie enthalten soll, verstehe ich die Zeilen nicht:
    For Each x In .DataSource.DataFields
    'If x.Name = nEmail Then ...

    Sollte das die Prüfung auf Vor- und Nachname sein? Ich hab sie gestrichen und durch eine Variante ersetzt.​
    • Als Pfad hast du zwei Variablen im Code: strFolderPath und Pfad. Sie verweisen auf den gleichen Ordner. Vermutlich ein Versehen?
    • Ziemlich am Ende definierst du ein undeklariertes ScriptingFileSystem-Objekt, verwendest es aber nicht. Was ist der Sinn davon?
    • Wenn du Application.Visible = False setzt, solltest du es am Ende des Makros auf jeden Fall wieder auf True setzen, sonst siehst du ja nix. Besser noch eine Fehlerbehandlung machen, in im Falle eines Absturzes Visible trotzdem wieder auf True gesetzt wird.
    Ich hab das Makro gemäß der obigen Anmerkungen angepasst:
    Code:
    Sub einzeln()
    
    'Variablen deklarieren
    Dim strFolderPath As String
    Dim strDatum As String
    Dim nNachname As String, nVorname As String, dsName As String
    Dim i As Long, anzahl As Long
    
    strDatum = Format(Date, "JJJJ-MM-TT")
    strFolderPath = "C:\Users\equi\Documents\Divers\XX\Rechnungen\Rechnung_backup_" & Format(strDatum, "YYYY-MM-DD")
    nNachname = "Nachname"
    nVorname = "Vorname"
    
    ' Überprüfen, ob Ordner bereits existiert
        If Dir(strFolderPath, vbDirectory) = "" Then
            ' Ordner anlegen
            MkDir (strFolderPath)
            MsgBox "Ordner wurde angelegt!"
        Else
            MsgBox "Ordner ist vorhanden!"
        End If
    
    'warum nochmal - kann weg?
    'Dim Pfad As String
    'Pfad = "C:\Users\equi\Documents\Divers\XX\Rechnungen\Rechnung_backup_" & Format(Date, "YYYY-MM-DD")
    
    ' Anwendung ausblenden für bessere Leistung
    MsgBox "Serienbriefe werden exportiert. Dieser Vorgang kann einige Minuten dauern - Microsoft Word wird während dieser Zeit ausgeblendet", vbOKOnly + vbInformation
    Application.Visible = False
    
    
    With ActiveDocument.MailMerge
        .DataSource.ActiveRecord = wdLastRecord
        anzahl = .DataSource.ActiveRecord
        .Destination = wdSendToNewDocument
            For i = 1 To anzahl
            .DataSource.ActiveRecord = i
           
            'Prüfen, ob der Datensatz Nachname und Vorname enthält
                If .DataSource.DataFields(nNachname) <> "" And .DataSource.DataFields(nVorname) <> "" Then
                     dsName = strFolderPath & "\" & _
                     .DataSource.DataFields(nVorname).Value & "_" & .DataSource.DataFields(nNachname).Value & "_" & Format(strDatum, "YYYY-MM-DD") & "_Rechnung.docx"
                     
                     MsgBox dsName
                     .DataSource.FirstRecord = i
                     .DataSource.LastRecord = i
                     .Execute
                     ActiveDocument.Range.Find.Execute findtext:="^b", replacewith:=""
                     ActiveDocument.SaveAs FileName:=dsName, AddToRecentFiles:=False
                     
                     'vermutlich erwünscht: Dokument nach Speichern schließen:
                     ActiveDocument.Close
                End If
        Next i
    
    End With
    
    Application.Visible = True
    End Sub
    
     
    Gerhard H, 14. Oktober 2021
    #2
  3. LiMa Neuer User
    Hallo Gerhard, vielen, vielen Dank für diese ausführliche und konstruktive Antwort, das hilft mir sehr! Ich werde das morgen gleich mal ausprobieren! Grüße
     
Thema:

VBA - Serienbriefe in einzelnen Dokumenten speichern

Die Seite wird geladen...
  1. VBA - Serienbriefe in einzelnen Dokumenten speichern - Similar Threads - VBA Serienbriefe einzelnen

  2. VBA Serienbrief in einzelne Ordner speichern

    in Microsoft Word Hilfe
    VBA Serienbrief in einzelne Ordner speichern: Moin, ich habe ein Serienbriefdokument. Derzeit ist es möglich, mit VBA alle Dokumente nach Nachnamen und Vornamen aus der Excelquelle einzeln zu speichern. Ich würde nun gerne auch das die...
  3. kleines Problem beim erstellen von serienbriefen per vba

    in Microsoft Excel Hilfe
    kleines Problem beim erstellen von serienbriefen per vba: Hallo Zusammen ich habe letztes Jahr mit Hilfe eines Forums einen VBA Code erstellt mit dem ich Serienbriefe aus einer Exceldatei erstellen kann. Jetzt habe ich das Sheet in Excel angepasst und...
  4. Über Access VBA ein Worddokument Datenquelle/Serienbrief erstellen

    in Microsoft Access Hilfe
    Über Access VBA ein Worddokument Datenquelle/Serienbrief erstellen: Hallo Leute, ich habe folgendes vor: Die Anwender haben bestimmte Worddokumente grafisch aufbereitet und ich möchte nun über Access dieses Worddokument (welches kein Serienbrief ist, ein ganz...
  5. Serienbrief mit zusätzlicher Tabelle als Anhang

    in Microsoft Word Hilfe
    Serienbrief mit zusätzlicher Tabelle als Anhang: Hallo alle zusammen, ich habe ein Serienbrief-Word-Dokument, mit welchem wir unsere Rechnungen generieren. Nun möchte ich eine zweite Seite erstellen, in der eine Tabelle als Anhang eingefügt...
  6. Serienbrief erstellen und Tabellen einzeln als Anhang einfügen

    in Microsoft Word Hilfe
    Serienbrief erstellen und Tabellen einzeln als Anhang einfügen: Hallo alle zusammen, ich habe folgendes Projekt bekommen und suche zur Zeit einen Lösungsansatz (keinen vollständigen Code): Es gibt eine Excel-Tabelle mit mehreren Anlagen. Jede Anlage hat...
  7. mit VBA eine Serienbrief-Mail mit mehreren Anhängen erstellen

    in Microsoft Word Hilfe
    mit VBA eine Serienbrief-Mail mit mehreren Anhängen erstellen: Hallo zusammen, ich habe die Anforderung eine Mail mit 3 Anhängen an ca. 900 Empfänger zu verschicken. Die Mailkontakte habe ich in einer Excel-Datei vorliegen. Ich hatte es über die...
  8. Feststellen, ob Worddokument Serienbrief ist

    in Microsoft Word Hilfe
    Feststellen, ob Worddokument Serienbrief ist: Hallo, ich durchsuche von Access aus verschiedene Dateien und prüfe, ob diese bestimmte Textmuster enthalten. Zu den durchsuchten Dateien gehören auch Worddokumente (2000 bis 2007). Wenn es...
Schlagworte:
  1. Diese Seite verwendet Cookies, um Inhalte zu personalisieren, diese deiner Erfahrung anzupassen und dich nach der Registrierung angemeldet zu halten.
    Auf dieser Website werden Cookies für die Zugriffsanalyse und Anzeigenmessung verwendet.
    Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden