Hallo,
ich erstelle momentan über folgenden Code Word-Briefe aus Access.
Private Sub KombiBriefvorlagen_Click()
On Error Resume Next
Dim wordobj As Object, worddoc As Object
Set wordobj = CreateObject("Word.Application")
Set worddoc = wordobj.Documents.Add("\\xyz\work\tro\2 Serienbriefe\Briefvorlagen für Projekte\" & "\" & Me!KombiBriefvorlagen.Column(0) & ".dotx")
worddoc.Bookmarks("IDNR").Range = Me!IDNR & ""
worddoc.Bookmarks("IDNR1").Range = Me!IDNR & ""
worddoc.Bookmarks("IDNR2").Range = Me!IDNR & ""
worddoc.Bookmarks("IDNR3").Range = Me!IDNR & ""
worddoc.Bookmarks("IDNR4").Range = Me!IDNR & ""
worddoc.Bookmarks("Leiter").Range = Me!Leiter & ""
worddoc.Bookmarks("Leiter1").Range = Me!Leiter & ""
worddoc.Bookmarks("Leiter2").Range = Me!Leiter & ""
worddoc.Bookmarks("Leiter3").Range = Me!Leiter & ""
worddoc.Bookmarks("Leiter4").Range = Me!Leiter & ""
worddoc.Bookmarks("codea").Range = Me!codea & ""
worddoc.Bookmarks("codea2").Range = Me!codea & ""
worddoc.Bookmarks("codea1").Range = Me!codea & ""
...
worddoc.SaveAs (Me.IDNR & Me!KombiBriefvorlagen.Column(0))
wordobj.Templates("Normal.dotm").Saved = True
wordobj.Visible = True
Set worddoc = Nothing
Set wordobj = Nothing
End Sub
Da ich den Inhalt der Access-Formularfelder leider mehrfach in den dotx-Vorlagen benötige und jede Textmarke ja nur einmal vorkommen darf, mußte ich diesen m.E. sehr umständlichen Weg gehen und die Textmarken mehrfach (jeweils mit anderem Namen) anlegen. Dies wird langsam zu unübersichtlich und aufwändig.
Gibt es eine andere Möglichkeit anstatt der Textmarken?
Danke schon mal für die Mühe!
Gruß
raber
Hallo raber,
da fällt mir nur der umgekehrte Weg ein.
Einen Serienbrief und die Abfrage als Datenquelle.
Sonst bleibt dir wohl nichts anderes über.
Woher soll Word auch wissen was wo stehen soll :-*
Gruß
Johann
Hallo,
mal noch eine andere Frage, kannst Du keinen Access Bericht erstellen statt dem Word Serienbrief?
Hallo,
noch eine: warum müssen dieselben Daten so oft auftauchen?
Ansonsten:
http://www.msalf.de/OfficeLine/wd/wd_reffield.htm
Fülle in Word einmal ein Formularfeld (nicht bei einer Textmarke einfügen)
etwas so:
activedocument.Formfields("IDNR").Result = Me!IDNR & ""
Und dann verwende in Word das REF(erenz)-feld überall dort, wo der Wert wieder benötigt wird.
Das wiederholt nur den Wert vom Formularfeld.
Wie "Ref" verwendet wird, kannst Du aus der Hilfe entnehmen.
Hallo,
vielen Dank für die Antworten!
@MzKIMu: Die Briefe sind zu komplex für Access-Berichte
@DF6GL: Die Briefe bestehen aus mehreren Seiten auf denen manche Felder nochmals benötigt werden.
@Jonny: Über Textmarken kann man Word schon sagen wo was stehen soll aber halt nur wenn die TM nur einmal benötigt wird. Außerdem soll der Brief direkt aus ACCESS heraus erstellt werden da anwenderfreundlicher und, das ist der größte Vorteil, extrem schneller als über Serienbriefschlüssel.
@69bruno: Formularfelder basieren doch auf Textmarken... Die REF-Funktion scheidet aus da sobald Word von ACCESS aufgerufen wird die Textmarke ja ersetzt wird und somit nicht mehr "existiert" - die REF-Felder keine Quelle mehr haben. Oder habe ich dich falsch verstanden?
Gruß
raber
Hallo,
Du kannst die Daten ja auch so übergeben, dass die Textmarke nicht gelöscht wird......
Hallo DF6GL,
wie geht das? Kannst Du mir bitte helfen?
Gruß
raber
Hallo,
indem man den Textmarke-Range merkt und eine "neue" Textmarke mit gleichem Namen an selbiger Stelle erstellt.
etwa so:
Public Function fktFillTM(objDok As Object, TMName As String, TMText As String)
Dim rng as Object
On Error Goto myErr
If objDok.Bookmarks.Exists(TMName) Then
Set rng = objDok.Bookmarks(TMName).Range
rng.Text = TMText
objDok.Bookmarks.add TMName, rng
Set rng = Nothing
End If
Exit_Function:
Exit Function
myErr:
Msgbox Err.Number & ": " & Err.Description & vbCrLf & " in Function fktFillTM"
Resume Exit_Function
End Function
und Aufruf:
fktFillTM worddoc, "IDNR", Me!IDNR
Hallo DF6GL,
danke für die Antwort!
Tut mir leid ich stehe erst am Anfang meiner Access-Laufbahn und habe deshalb Schwierigkeiten Deinen Vorschlag umzusetzen.
Kannst Du mir konkret an meinem Code zeigen wie ich die Funktion implementiere?
DANKE!
Hallo,
1) Kopiere den Code der Funktion in ein Standard-Modul
2) ersetze alle
worddoc.Bookmarks("IDNR").Range = Me!IDNR & ""
- Zeilen durch jeweils die Aufruf-Zeile mit angepassten Textmarken-Namen und Form-Textfeldern:
fktFillTM worddoc, "IDNR", Me!IDNR
Hallo DF6GL,
Klasse!
Es funktioniert!
Habe noch
worddoc.Fields.Update
worddoc.Fields.Unlink
For Each Bookmarks In worddoc.Bookmarks
Bookmarks.Delete
Next Bookmarks
vor worddoc.SaveAs eingefügt um das manuelle aktualisieren der REF Felder zu sparen, die REF-Felder zu löschen und die Textmarken zu entfernen um einen reinen "text" Brief zu erhalten.
Super Forum, Super DF6GL.
Danke!
Gruß
raber
Hallo,
die Erstellung der Briefe funktioniert traumhaft!
Eine Frage habe ich noch:
Ich benötige in meinen Briefen ein Feld, das auf der ersten Briefseite imTextfluß eingebettet ist auch in der Kopfzeile nachfolgender Seiten. Leider sind die REF-Felder nicht in Kopf/Fußzeilen ansprechbar - zumindest in meinem Szenario.
Hat jemand eine Idee?
Gruß
Raber
Hallo,
möglicherweise muss auf die Textmarken in der Kopfzeile separat zugegriffen und diese gesetzt werden:
Set WordHeader1 = WordDoc.Sections(1).Headers(1).Range
Hallo DF6GL,
ok, wie Du ja schon bemerkt hast, ich stehe am Anfang meiner Access-Karriere.
Kannst Du mir sagen wo in meinem Code ich am Besten den Schnipsel unterbringe?
Gruß
raber