Neuigkeiten:

Wenn ihr euch für eine gute Antwort bedanken möchtet, im entsprechenden Posting einfach den Knopf "sag Danke" drücken!

Mobiles Hauptmenü

Serienbrief in Word aus Access heraus steuern

Begonnen von Ubbo, Januar 12, 2015, 15:15:54

⏪ vorheriges - nächstes ⏩

Ubbo

Hallo alle zusammen
Ich habe folgende Frage.

Eine Access Adressdatenbank in der ich für einen Serienbrief die Adressen aufbereite
und in einem separatem Formular ausgebe.
Von hier sollen die Adressen in ein Word Dokument mit Formularfeldern übertragen und dann
nacheinamder gedruckt werden.
Das Aufrufen und Eintragen der Adressdaten funktioniert mit dem folgenden Skribt:

Private Sub cmd_Serienbr_drucken_Click() 'Serienbrief mit WORD drucken
    Dim word As Object
    On Error GoTo WordStarten
    'Der Versuch eine bestehende Instanz von WORD zu nutzen
    Set word = GetObject(, "word.application")
    If Not word Is Nothing Then
        'Nach erzeugen der Objektinstanz wird der gewünschte Report geladen
     word.Visible = True
        word.Documents.Open FileName:=Pfad_Serienbrief    'Dateipfad und Name des Word Dokuments
        'jetzt werden die Dateifelder gefüllt
        word.ActiveDocument.FormFields("Anrede").Result = Anrede.Value
        word.ActiveDocument.FormFields("Name1").Result = Name1.Value
        word.ActiveDocument.FormFields("Name2").Result = Name2.Value
        word.ActiveDocument.FormFields("Ortsteil").Result = Ortsteil.Value
        word.ActiveDocument.FormFields("Straße").Result = Straße.Value
        word.ActiveDocument.FormFields("PLZ").Result = PLZ.Value
        word.ActiveDocument.FormFields("Wohnort").Result = Wohnort.Value
        word.ActiveDocument.FormFields("Vorname").Result = Vorname.Value
    End If 
    word.ActiveDocument.FormPrint    'ein Versuch den Druck auszulösen (leider mit Fehlermeldung
Exit Sub
WordStarten:
    If Err = 429 Then
        'Die Instanz war nicht vorhanden,wir müssen Word starten..
        Set word = CreateObject("word.application")
        GoTo Ausstieg
    End If
    'Err 13 kommt wenn ein Feld des Wordfoemulars nicht mit Daten besetzt werden kann
    If Err <> 13 Then
        'Word konnte nicht gefunden werden
        MsgBox " Es ist ein Fehler aufgetreten!! ;-( !!" & vbCrLf & vbCrLf & "Err = " & Err
    End If
Ausstieg:
    Resume Next
End Sub


Wie kann ich den Direktdruck in Word starten und wie kann ich dann die nächsten Datensätze
aus dem Access Formular verarbeiten?

Der Skribt stammt (dort in einfacherer Form) aus dem Buch Programmier-Rezepte Access von
Walter Doberenz u. Thomas Gewinnus

Schon Im Voraus Dank für die Hilfe!
Ubbo

MaggieMay

Hallo,

warum nimmst du nicht eine Serienbriefvorlage, dann brauchst du nicht jeden Datensatz einzeln zu übertragen.
Freundliche Grüße
MaggieMay

Ubbo

Danke für den Tip
Da ich mich mit Serienbriefen in Word nicht auskenne folgende Nachfrage.
Die Adressdaten als ganzes,vermutlich mit Komma oder Semikolon separiert in eine Datei ausspielen, die dann von Word zu Serienbriefen verarbeitet wird?
Ist das so gemeint?
Gruß Ubbo

MaggieMay

Du kannst als Datenquelle für den Serienbrief eine Access-Tabelle oder Abfrage einsetzen, sowie eine Textdatei oder auch Excel- oder Word-Tabelle.
Ich bevorzuge die Access-unabhängige Variante mit einer Excel-Tabelle, weil dann die Serienbriefvorlage auch leicht mal vom kundigen Anwender erstellt oder angepasst werden kann.
Die endgültige Vorlage wird von der Datenquelle getrennt und die Verbindung wird beim Aufruf des Serienbriefs aus Access heraus hergestellt.

Dies ist eine von vielen möglichen Varianten, die sich bei mir aber über die Jahre bewährt hat und am wenigsten Probleme bereitet.
Freundliche Grüße
MaggieMay

Ubbo

Hallo und danke für den Tip
Ich habe noch einmal in den hiesigen Analen gestöbert und bin auf einen schon etwas älteren Hinweis gestossen, den ich dann umsetzen konnte. Den Serienbrief kann jeder halbwegs kundige erstellen, er muß nur einige Formularfelder mit festen Namen einbauen. Wenn ein Feld nicht ausgegeben werden soll, so muß es vorhanden sein, kann aber weiss dargestellt werden, so das es nicht zu sehen ist. Die Serienbriefdatei kann an beliebiger Stelle abgelegt werden, da der Pfad dahin abgefragt wird.
Hier noch einmal der komplett Skript für die Umsetzung

Private Sub cmd_Serienbr_drucken_Click() 'Serienbrief mit WORD drucken
    Dim word As Object
    Dim Anzahl As Double
    Anzahl = zuDrAdr
    'MsgBox " Anzahl = " & Anzahl
    For i = 1 To Anzahl
        On Error GoTo WordStarten
        'Der Versuch eine bestehende Instanz von WORD zu nutzen
        Set word = GetObject(, "word.application")
        If Not word Is Nothing Then
            'Nach erzeugen der Objektinstanz wird der gewünschte Report geladen
            word.Visible = True
            word.Documents.Open FileName:=Pfad_Serienbrief
            'jetzt werden die Dateifelder gefüllt
            word.ActiveDocument.FormFields("Anrede").Result = Anrede.Value
            word.ActiveDocument.FormFields("Name1").Result = Name1.Value
            word.ActiveDocument.FormFields("Name2").Result = Name2.Value
            word.ActiveDocument.FormFields("Ortsteil").Result = Ortsteil.Value
            word.ActiveDocument.FormFields("Straße").Result = Straße.Value
            word.ActiveDocument.FormFields("PLZ").Result = PLZ.Value
            word.ActiveDocument.FormFields("Wohnort").Result = Wohnort.Value
            word.ActiveDocument.FormFields("Vorname").Result = Vorname.Value
        End If
        word.ActiveDocument.PrintOut
        'zum nächsten Datensatz gehen
        DoCmd.GoToRecord , , acNext
    Next i
   'Word beenden ohne das Dokument zu speichern
    word.ActiveDocument.Close SaveChanges:=wdDoNotSaveChanges
    word.Quit
    Set word = Nothing
    MsgBox " Alle Adressen gedruckt! "
    DoCmd.Close
Exit Sub
WordStarten:
    If Err = 429 Then
        'Die Instanz war nicht vorhanden,wir müssen Word starten..
        Set word = CreateObject("word.application")
        GoTo Ausstieg
    End If
    'Err 13 kommt wenn ein Feld des Wordfoemulars nicht mit Daten besetzt werden kann
    If Err <> 13 Then
        'Word konnte nicht gefunden werden
        MsgBox " Es ist ein Fehler aufgetreten!! ;-( !!" & vbCrLf & vbCrLf & "Err = " & Err
    End If
Ausstieg:
    Resume Next

Danke für die Ratschläge, auch wenn ich es anders realisiert habe.  :)

Ich finde hier klappt das mit der Hilfe fantastisch und ich werde in Zukunft öfter mal reinschauen.
Vielleicht kann ich auch einmal jemandem Helfen.
Viel Spass weiter mit Access und Gruß Ubbo