PDA

Vollständige Version anzeigen : Serienbrief aus Access Mailmerge


Litotes
18.01.2008, 07:23
Hallo Leute,

in einer Access-DB rufe ich über einen oder mehreren listeneinträgen eine Parameterabfrage aus. Ein Makro öffnet eine Wordvorlage und füllt in dem Dokument die Bookmarks (Textmarken) mit den Werten der Abfrage aus.

Code:

With objWordDoc.MailMerge
.OpenDataSource name:=strDBName, _
LinkToSource:=True, _
Connection:=strConnection

With .Fields
objWordDoc.Bookmarks("a0").Select
.Add Range:=objWordApp.Selection.Range, name:="a0"


Mit Office 2000 funktioniert das auch prima, leider nur nicht mit Office 2003. Es erscheint die Fehlermelung, dass Word die Datenquelle nicht öffnen könnte.
strConnection ist ein String, der die Abfrage enthält.
Hat da jemand einen Lösungsansatz? Brauche ich andere Methodenaufrufe oder ists eine Einstellung im Word? Alles was ich bisher dazu gefunden habe, brachte keine Lösung.

Gruß Litotes

Smaug
18.01.2008, 10:01
Wenn Du aus Access heraus nur Word öffnest und dort Textmarken in einer Dokument-Vorlage öffnest dann frage ich mich was die Serienbrief-Funktionaliät (MailMerge) damit zu tun hat ?? Diese wird dazu überhaupt nicht benötigt.
Dim wdApp as Word.Application
Dim wdDoc as Word.Document
Dim wdBM as Word.Bookmark
Set wdApp = GetWordApp
Set wdDoc = wdApp.Documents.Open ("C:\Pfad\WordVorlage.doc")
wddoc.Bookmarks("a0").Range.Text = "TextZuweisungAusAccess-Feld"
....PS: Wenn die Bookmark-Namen mit den Formularfeldnamen aus Access übereinstimmen dann kann man alles in einer Schleife abarbeiten

Anne Berg
18.01.2008, 12:59
Davon abgesehen - möglicherweise hat das etwas hiermit (http://support.microsoft.com/default.aspx?scid=kb;de;825765)zu tun.

Aber: Bist du sicher, dass du die Abfrage überhaupt an Word übergeben musst?
Setzt du sozusagen einen "Mixed-Mode" ein, Textmarken + Seriendruckfelder?

Litotes
18.01.2008, 14:37
Hallo Smaug,

ich habe Deinen Vorschlag mal eingebaut, aber bei der Zeile
.Bookmarks("a0").Range.Text = a0
bleibt die Textmarke leer. Muss ich das Feld irgendwie aneres ansprechen (a0 ist nur ein Alias aus der Abfrage)? Könntest Du mir vll. noch ein Beispiel liefern, wie du das mit der Schleife meinst?

@ Anne Berg
Nein, damit hat das nichts zu tun, denn ich habe das SQLState ja nicht in dem Worddokument hinterlegt.

Gruß Litotes

Anne Berg
18.01.2008, 14:40
Witzbold! Aber du übergibst die Abfrage doch beim Öffnen!

Smaug
18.01.2008, 14:44
Was der Inhalt von a0 sein muss und woher das kommt musst Du eigentlich am besten wissen. Handelt es sich um einen Wert aus einer Abfrage kannst Du diesen evtl. mit DLookup o.ä. ermitteln. Aber das ist alles spekulativ da wir ja Deine Daten nicht sehen. Die Schleife würde etwa so aussehen:
For Each Formularfeld in Formularname (bzw. Me)
If wd.Bookmarks(Formularfeldname).Exists Then
wd.Bookmarks.Range.Text = Me!Formularfeldname
End If
Nextzumindest so sinngemäss

Anne Berg
18.01.2008, 14:49
With .Fields
objWordDoc.Bookmarks("a0").Select
.Add Range:=objWordApp.Selection.Range, name:="a0"Daraus schließe ich auf das Vorhandensein eines geöffneten Recordsets. ;)

Aber auch auf die Gefahr hin, dass ich nerve: Ein wesentlicher Unterschied zwischen Word 2000 und 2003 wird in dem Link beschrieben, auf den ich verwiesen habe. Das sollte man nicht einfach so abtun!

Litotes
18.01.2008, 15:26
Hallo Anne,

Du nervst doch nicht. Den Key habe ich auch gesetzt hat aber leider nix gebracht. Die Fehlerbeschreibung passt auch nicht zu meinen Symptomen.

Gruß Litotes

Anne Berg
18.01.2008, 15:33
Fehlerbeschreibung? Welche wäre das denn? Und wie ist überhaupt der genaue Wortlaut der Fehlermeldung?
Vielleicht kommen wir ja damit weiter.

Vielleicht solltest du aber auch die Sache mit dem Mailmerge und der Abfrage einfach noch einmal überdenken. Die Antworten auf diesbezügliche Fragen fehlen auch noch.

Litotes
18.01.2008, 15:34
@ Smaug,

auch auf die Gefahr hin, dass ICH nerve (stehe wahrs. total aufm Schlauch)..
ich bin ein bisschen wg. den Formualrfeldnamen irritiert. Den Eintrag wähle ich ja aus einem Listenfeld aus und durch druck auf nen Button wird ein Makro ausgelöst. Kann ich dass dann trotzdem so realisieren?

Gruß Litotes

Litotes
18.01.2008, 15:36
Gibts hier eigentlich kein Edit-Button:

@Anne
Die Abfrage ist eine Parameterabfrage die die Werte aus dem
selektierte Listeneinträgen übernimmt. Wenn ich die Prozedur ausführe,
erscheint ein kleines fenster "Tabelle auswählen" in dem Views, Tables
und Querys aufgelistet sind. Wenn ich da nochmal die Abfrage aussuche
öffnet sich das Worddokument und die Textmarken werden durch die
Seriendruckfelder wie geplant ersetzt. Allerdings werden die Felder
nicht mit Werten befüllt und ich habe in dieser Ansicht des
Worddokuments keine Möglichkeit z.B. Seriendruck zusammenführen
auszuwählen oder ähnliches. Alle Menu usw. sind dort ausgeblendet.
Ich habe das ganze auch mit Office 2000 versucht und da funktioniert
es einwandfrei nur eben unter 2k3 nicht.

Anne Berg
18.01.2008, 15:42
Gibts hier eigentlich kein Edit-Button:Nicht für Gäste, nehme ich an. :pdie Textmarken werden durch die Seriendruckfelder wie geplant ersetzt.Das ist mit Verlaub Unfug. Offensichtlich arbeitest du mit Textmarken, das sind keine Seriendruckfelder!

Zeig uns doch mal die komplette Prozedur, dann kann man den Ablauf vielleicht besser nachvollziehen. Ich sehe so auf Anhieb keinen Grund (außer dem bereits erwähnten) warum etwas aus Office 2000 in 2003 nicht mehr laufen sollte.

PS: Es fehlt noch die Fehlermeldung!

Litotes
22.01.2008, 07:17
Dim objWordApp As Word.Application
Dim objWordDoc As Word.Document
Dim strDokPfad As String
Dim strDBName As String
Dim strConnection As String


Dim db As Database, qd As QueryDef
Dim intAnzZeilen As Integer, intI As Integer
Dim intAnzalleZeilen As Integer
Dim frmKJFP As Form
Dim strReport As String
Dim flag As Integer
Dim strFilter As String
flag = 0
Set frmKJFP = Forms!Auswahl
intAnzalleZeilen = frmAuswahl!Liste120.ListCount
Set db = CurrentDb()
Set qd = db.QueryDefs("Abfrageirgendeine")

'MsgBox frmKunde![Liste120].ItemsSelected.Count
If frmAuswahl![Liste120].ItemsSelected.Count > 0 Then

intAnzZeilen = frmKJFP!Liste120.ColumnCount
'MsgBox "Das Listenfeld enthält selektierte ", intAnzZeilen
strReport = strReport + "("
For intI = 0 To intAnzalleZeilen - 1
If frmAuswahl!Liste120.Selected(intI) = True Then
If flag Then
strReport = strReport + "," + frmAuswahl!Liste120.ItemData(intI)
'MsgBox frmAuswahl!Liste120.ItemData(intI)
Else
strReport = strReport + frmAuswahl!Liste120.ItemData(intI)
flag = 1
End If
End If
Next intI
strReport = strReport + ")"



strFilter = "Select irgendwas from tabelle "



'MsgBox strFilter
qd.SQL = strFilter
'DoCmd.OpenQuery "AbfrageIrgendeine"
Else
MsgBox "Sie haben keinen Eintrag im Listenfeld ausgewählt."
End If

On Error GoTo Fehler

Application.Echo False, "Daten werden an Word übertragen ..."
strDBName = CurrentDb.name
strDokPfad = "\\Server\freigabe"

MsgBox "NICHT VERGESSEN: Netzwerkdrucker auf zweiseitig drucken stellen!", vbCritical


Set objWordApp = CreateObject("Word.Application")
Set objWordDoc = objWordApp.Documents.Add(Template:=strDokPfad & strWORDVORLAGE1)

strConnection = "QUERY AbfrageName"

With objWordDoc.MailMerge
.OpenDataSource name:=strDBName, _
LinkToSource:=True, _
Connection:=strConnection

With .Fields
objWordDoc.Bookmarks("a0").Select
.Add Range:=objWordApp.Selection.Range, name:="a0"
objWordDoc.Bookmarks("a1").Select
.Add Range:=objWordApp.Selection.Range, name:="a1"
objWordDoc.Bookmarks("a2").Select
.Add Range:=objWordApp.Selection.Range, name:="a2"
objWordDoc.Bookmarks("a3").Select
.Add Range:=objWordApp.Selection.Range, name:="a3"
objWordDoc.Bookmarks("a4").Select
.Add Range:=objWordApp.Selection.Range, name:="a4"
objWordDoc.Bookmarks("zeile1").Select
.Add Range:=objWordApp.Selection.Range, name:="zeile1"
objWordDoc.Bookmarks("zeile2").Select
.Add Range:=objWordApp.Selection.Range, name:="zeile2"
objWordDoc.Bookmarks("zeile3").Select
.Add Range:=objWordApp.Selection.Range, name:="zeile3"
objWordDoc.Bookmarks("anrede").Select
.Add Range:=objWordApp.Selection.Range, name:="anrede"
objWordDoc.Bookmarks("ort").Select
.Add Range:=objWordApp.Selection.Range, name:="ort"
End With
End With

objWordApp.Visible = True

Ende:
Application.Echo True
Exit Sub

Fehler:
MsgBox "Der Vorgang konnte nicht vollständig beendet werden!"
MsgBox Err.Description
Resume Ende

End Sub

Litotes
22.01.2008, 07:19
Achso, die Fehlermeldung

Gibt es nicht. Wie schon beschrieben öffnet sich ein Fenster in dem ich Views, Tabellen und Abfragen auswählen kann. Wenn ich die entsprechende Abfrage auswähle öffnet sich die das Worddok und die Seriendruckfelder werden eingefügt, aber ohne Werte. Es kommt keine Fehlermeldung

Gruß Litotes

Anne Berg
22.01.2008, 09:48
Hast du den Code mal kompiliert?

BTW: Formatierter Code mit sinnvollen Einrückungen und ohne überflüssige Leerzeilen, sowie in Code-Tags eingefügt, ist wesentlich leichter lesbar!

Litotes
22.01.2008, 10:19
Ja hab ich. Unter office 2000 gibts ja auch keine Probleme

Anne Berg
22.01.2008, 11:02
Das wundert mich aber, bei mir knallt es schon gleich zu Anfang: Set frmKJFP = Forms!Auswahl
intAnzalleZeilen = frmAuswahl!Liste120.ListCount

Du solltest prinzipiell Option Explicit einschalten (im Modulkopf) damit Variablendeklarationen geprüft und die Ergebnisse nicht dem Zufall überlassen werden.

Anne Berg
22.01.2008, 11:59
Hallo noch einmal,

wenn du ernsthaft an einer Lösung interessiert bist, dann lass dich registrieren und lade eine Test-DB mit Mustervorlage hoch. An einem unvollständigen Code nach Fehlern zu suchen ist wenig sinnvoll.

(da wird z.B. ein strReport gefüllt und nie wieder benutzt, ein Variable strWORDVORLAGE1 ohne Deklaration und Inhalt verwendet, ein Database-Objekt initialisiert und nicht wieder freigegeben, dasselbe mit der QueryDef, ...)

Wenn das in A2000 funktioniert, dann sicher nur deshalb weil dort die Vorlage bereits Seriendruckfelder enthält. Wenn du die erst anlegst beim Öffnen, solltest du Mailmerge sinnvollerweise erst anschließend ausführen. :p
Stellt sich die Frage, warum du nicht gleich eine Vorlage mit Seriendruckfeldern erzeugst und diese hier verwendest.

Litotes
22.01.2008, 13:14
Hallo,

Die Wordvorlagendatei ist eine globale Variable, deshalb nicht sichtbar. Ich habe die Form an 1-2 Stellen nicht gleich benannt, liegt aber an der veröffentlichung. In der Wordvorlagendatei sind lediglich Textmarken an deren Stelle Seriendruckfelder bei Aufruf eingefügt werden. Der Code ist soweit i.O., wenn auch nicht sehr übersichtlich :-)
Meine Vermutung liegt in der unterschiedlichen Behandlung der Datenquellen bei Word 2000/2003.
Auf DonKarl gibt es eine Beispieldatenbank, in der ein ähnliches Verfahren genutzt wird mit Office 2003. Das werde ich mal versuchen einzubauen und gebe natürlich bescheid, wenns klappt

Gruß Litotes

Anne Berg
22.01.2008, 13:19
Wie ich bereits sagte - aber auch das wiederhole ich gern - macht es keinen Sinn MailMerge einzusetzen, wenn bzw. solange es keine Seriendruckfelder im Dokument gibt. Das hat jetzt erstmal nichts mit der Office-Version zu tun. :p

Litotes
22.01.2008, 13:31
hmm, wie ich bereits sagte, werden die seriendruckfelder erstellt und anschließend per mailmerge gefüllt.

Gruß Litotes

Anne Berg
22.01.2008, 13:37
OK, da verhalten sich die verschiedenen Word-Versionen wohl doch recht unterschiedlich.Connection Optionaler Variant-Wert. Ein Bereich, auf dem die Abfrage ausgeführt wird, die Sie mit SQLStatement bestimmen (siehe Hinweise weiter unten). Wie Sie den Bereich angeben, hängt davon ab, wie die Daten abgerufen werden. Beispiel:

Beim Datenabruf über Open Database Connectivity (ODBC) legen Sie eine Verbindungszeichenfolge fest.
Bei Daten, die Sie aus Microsoft Excel mit dynamischem Datenaustausch (DDE) laden, bestimmen Sie einen benannten Bereich.

Sicherheit Dynamischer Datenaustausch (Dynamic Data Exchange oder DDE) ist eine ältere Technologie, die nicht sicher ist. Verwenden Sie nach Möglichkeit eine sicherere Alternative zu DDE, beispielsweise OLE (Object Linking and Embedding).

Wenn Sie Daten aus Microsoft Access abrufen, verwenden Sie die Begriffe "Tabelle" oder "Abfrage" gefolgt vom Namen der Tabelle bzw. Abfrage.

Motorroller
11.03.2011, 09:17
Ich muss dieses Thema einmal aufgreifen, da ich hier bei uns auf Arbeit derzeit mit dem Problem kämpfe, dass die Serienbrieferstellung aus Access heraus nicht mehr reibungslos klappt. Es sei angemerkt, dass wir einen Terminalserver besitzen, bei dem ich nicht einfach so die Registry ändern kann und will, um die Sicherheitsfrage von Word nach dem Verbinden der Datenquelle mit dem Hauptdokument auszuschalten. Daher meine Frage:

Gibt es eine Möglichkeit, die Frage, die beim Öffnen des Hauptdokumentes gestellt wird, mit Ja zu beantworten und zwar per VBA?

Ich vermute nicht.

Thomas Möller
11.03.2011, 17:07
Hallo!

Gibt es eine Möglichkeit, die Frage, die beim Öffnen des Hauptdokumentes gestellt wird, mit Ja zu beantworten und zwar per VBA?

schau mal bitte, ob es Dir hilft, wenn Du die Eigenschaft DisplayAlerts per Automation entsprechend setzt.

HTH