Neuigkeiten:

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

Mobiles Hauptmenü

Datensatz aus Formular an Word weitergeben

Begonnen von raber, Mai 14, 2013, 15:49:04

⏪ vorheriges - nächstes ⏩

raber

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

Jonny

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

MzKlMu

Hallo,
mal noch eine andere Frage, kannst Du keinen Access Bericht erstellen statt dem Word Serienbrief?
Gruß Klaus


69bruno

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.

If Brain <= requestoutofPost then
  PostonForum "Ich verstehe Dein Problem nicht....."
Else
  PostonForum "Denk erst mal über die Normalisierung nach......"
End If

raber

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



DF6GL

Hallo,

Du kannst die Daten ja auch so übergeben, dass die Textmarke nicht gelöscht wird......

raber

Hallo DF6GL,

wie geht das? Kannst Du mir bitte helfen?

Gruß
raber

DF6GL

#8
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

raber

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!

DF6GL

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



raber

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

raber

#12
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




DF6GL

Hallo,

möglicherweise muss auf  die Textmarken in der Kopfzeile separat zugegriffen und diese gesetzt werden:

Set WordHeader1 = WordDoc.Sections(1).Headers(1).Range

raber

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