PDA

Vollständige Version anzeigen : Word-Serienbriefe mit Access erstellen


jb
25.01.2001, 13:10
Hallo!

Ich habe folgendes Problem: Ich habe eine Access97-DB, in der Personen verwaltet werden, an die ich vorgefertigte, und als Word-Datei abgespeicherte Serienbriefe schicken möchte. Wenn ich einen Datensatz aufgerufen habe, kann ich einen Brief auswählen (Typ 1 / Typ 2) und der Brief wird mit den Adressdaten dieser Person ausgedruckt. Eigentlich klappt auch alles ganz gut, das Problem ist jedoch, dass der PC für jedes mal eine neue Access-Session öffnet. Wenn ich also nacheinander 10 Briefe an 10 Leute schreiben, habe ich 11 mal Access geöffnet und das finde ich etwas ungeschickt. Hat jemand eine Idee, wie ich das erneute Öffnen von Access unterdrücken kann?

Danke für Eure Antworten
jan

Hans-Jürgen
25.01.2001, 14:23
Ich hab das mal auf folgende Weise gelöst:

Den Serienbrief habe ich auf der Grundlage einer Excel-Tabelle gestaltet und verknüpft (im Bsp. Druckdaten.xls).
Wenn ich jetzt auf den Druck-Button klicke, dann erstellt Access eine neue Abfrage aufgrund der Daten, die angezeigt werden,
exportiert die nach Excel, öffnet Word und erstellt den Serienbrief.

Viel Spaß!


Private Sub Drucken_Click()

On Error GoTo Err_Drucken_Click

Dim dbs As DATABASE
Dim rst As Recordset
Dim qdf As QueryDef
Dim intKundenNr as Integer
Dim strPfadWord, strPfadDok, strAppName, strAbfrage As String

Set dbs = CurrentDb()
Set rst = dbs.OpenRecordset("SELECT pfaddokumente, word FROM T_User")
rst.MoveFirst
strPfadDok = rst!pfaddokumente 'in der Tabelle T_User sind die Angaben über den Pfad der Serienbriefvorlage
strPfadWord = rst!word 'und Word gespeichert
rst.Close

intKundenNr = Me.Kunden_Nr 'aktuell angezeigter Datensatz
strAbfrage = "SELECT T_Firma.Firma, T_Firma.Straße, T_Firma.PLZ, T_Firma.Ort, T_Absender.Ansprechpartner, T_Absender.Abteilung, T_Absender.Telefon, T_Absender.Telefax,
"FROM T_Firma WHERE (((T_Firma.Kunden_Nr)=" & intKundenNr & "));" 'Abfrage definieren

DoCmd.DeleteObject acQuery, "A_Druckdaten" 'alte, falls noch vorhandene, Abfrage löschen
Set qdf = dbs.CreateQueryDef("A_Druckdaten", strAbfrage) 'Abfrage erstellen

DoCmd.TransferSpreadsheet acExport, 8, "A_Druckdaten", strPfadDok & "Druckdaten.xls", True
strAppName = strPfadWord & "Winword.exe " & strPfadDok
Call Shell(strAppName, 1)

DoCmd.Close

Exit_Drucken_Click:
Exit Sub

Err_Drucken_Click:

If Err.Number = 3021 Or Err.Number = 3011 Then Resume Next 'Fehler, falls Abfrage beim Löschen schon weg
MsgBox Err.Number & " " & Err.Description
Resume Exit_Drucken_Click

End Sub

Orca
25.01.2001, 14:38
Hi,

mache aus den Seriendruckvorlagen einfach wieder normale WordDokumente (mit dem Serienduckmanager)und schon bleibt nur noch einmal Access offen.

Stephan
25.01.2001, 19:53
Man kann auch (ähnlich wie Excel) unter Access97 ein Wordobjekt öffnen und dort eine Wordtabelle als Serienquelle generieren, die dann mit dem Hauptdokument veknüpft sein muß. Machen wir bei uns in der Firma mit bis zu 600 Datensätzen gleichzeitig.

Beispiel (bei uns):


Function dsbA4()
Dim wrd As Object
Dim spaltenanzahl As Long
Dim zeilenanzahl As Long

On Error GoTo error_dsbA4

Set db = DBEngine(0)(0)
Set rs = db.OpenRecordset("Selektion Serienbrief", dbOpenSnapshot)
If rs.RecordCount > 0 Then
spaltenanzahl = rs.Fields.Count
rs.MoveFirst
rs.MoveLast
zeilenanzahl = rs.RecordCount + 1
Set wrd = CreateObject("Word.Application")
help = benutzer_standard(10)
wrd.Application.UserName = help
help = benutzer_standard(1)
wrd.Application.UserInitials = help
wrd.Application.UserAddress = ""
wrd.Documents.Add
wrd.Documents(1).Activate
wrd.Documents(1).tables.Add Range:=wrd.Selection.Range, NumRows:=zeilenanzahl, NumColumns:=spaltenanzahl
For i = 1 To spaltenanzahl
help = rs.Fields(i - 1).Name
wrd.Documents(1).tables(1).Cell(1, i).Range.InsertAfter help
Next i
zaehler = 1
rs.MoveFirst
Do While Not rs.EOF
zaehler = zaehler + 1
For i = 1 To spaltenanzahl
If empti(rs.Fields(i - 1)) Then
help = Space(0)
Else
help = rs.Fields(i - 1)
End If
wrd.Documents(1).tables(1).Cell(zaehler, i).Range.InsertAfter help
Next i
rs.MoveNext
Loop
Set db1 = OpenDatabase(DatenPfad)
Set rs1 = db1.OpenRecordset("Zaehler", dbOpenTable)
rs1.MoveFirst
rs1.Edit
rs1("Briefnummer") = rs1("Briefnummer") + 1
Dokumentname = "SQ" & Format(Year(Date), "0000") & Format(Month(Date), "00") & Format(Day(Date), "00") & Format(rs1("Briefnummer"), "000") & ".DOC"
Dokumentname2 = "SB" & Format(Year(Date), "0000") & Format(Month(Date), "00") & Format(Day(Date), "00") & Format(rs1("Briefnummer"), "000") & ".DOC"
rs1.Update
rs1.Close
db1.Close
help = WinwordBriefPfad & Dokumentname
wrd.Documents(1).SaveAs Filename:=help
Dokumentname = "SerienQuelle.doc"
help = LWinwordVorlagenPfad & Dokumentname
wrd.Documents(1).SaveAs Filename:=help
wrd.Documents(1).Close
wrd.Documents.Add Template:=WinwordVorlagenPfad & "DSBA4.DOT"
wrd.Documents(1).Activate
help = Format(Date, "dd.mm.yyyy")
wrd.Documents(1).Bookmarks("Datum").select
wrd.Selection.typetext Text:=help
help = benutzer_standard(1)
wrd.Documents(1).Bookmarks("Kürzel").select
wrd.Selection.typetext Text:=help
help = benutzer_standard(10)
wrd.Documents(1).Bookmarks("Benutzername").select
wrd.Selection.typetext Text:=help
wrd.Documents(1).Bookmarks("Beginn").select
help = WinwordBriefPfad & Dokumentname2
wrd.Documents(1).SaveAs Filename:=help
wrd.Application.Visible = True
wrd.Application.WindowState = 1
AppActivate "Microsoft Word - " & Dokumentname2
End If
rs.Close
db.Close

ende_dsbA4:
Exit Function

error_dsbA4:
Resume ende_dsbA4

End Function


Dazu gehört natürlich die entsprechende Wordvorlage

Gruß Stephan