th-schmitz58 Geschrieben 10. Februar 2009 Geschrieben 10. Februar 2009 Hallo, ich habe ein Problem, an dem ich jetzt schon seit 2 Tagen sitze: Ich möchte einen Word-Serienbrief über VBA programmieren. Die Daten kommen aus einer Excel-Tabelle und müssen zum Teil noch modifiziert werden. Einige Daten möchte ich in dem Word-Dokument in Feldfunktionen weiterverwenden, und da fängt mein Problem an. Meine Idee war, dass ich die Übergabe der Daten in VBA mit der Methode ActiveDokument.Variables.Value einleite und diese dann mit den docvariablen im Dokument übernehme. Das ganze funktioniet leider so wie ich es geschrieben habe nicht, die Variavle wird zwar gefüllt, aber nicht in das Dokument übergeben. Der Befehl ActiveDocument.MailMerge.execute macht m. M. die übertragung zunichte. Hier der Code: Public Sub Test4() Dim LetzterRec As Long Dim var1, var2 As Integer Dim besch_finanzamt As String ActiveDocument.MailMerge.OpenDataSource Name:="C:\Users\tom\Desktop\VBA\Stb_u_Stud_ausweis.xls", _ SQLStatement:="SELECT * FROM `WordBriefeDrucken__Arbeitstabel$`" ActiveDocument.MailMerge.DataSource.ActiveRecord = wdLastRecord LetzterRec = Word.ActiveDocument.MailMerge.DataSource.ActiveRecord ActiveDocument.MailMerge.DataSource.ActiveRecord = wdFirstRecord With ActiveDocument.MailMerge .DataSource.ActiveRecord = wdFirstRecord Do .Destination = wdSendToNewDocument .SuppressBlankLines = True With .DataSource .FirstRecord = .ActiveRecord .LastRecord = .ActiveRecord var1 = .DataFields("VersandFinanzbeschBetrag").Value var2 = .DataFields("VersandFinanzbesch").Value End With If var1 <> 0 And var2 = -1 Then ActiveDocument.Variables("besch_finanzamt").Value = "ja" Else ActiveDocument.Variables("besch_finanzamt").Value = "nein" End If .Execute ActiveDocument.Fields.Update If .DataSource.ActiveRecord < LetzterRec Then .DataSource.ActiveRecord = wdNextRecord Else Exit Do End If Loop End With End Sub Es wäre supernett, wenn mir jemand weiterhelfen könnte. Vielen Danke schon mal! Thomas Zitieren
th-schmitz58 Geschrieben 11. Februar 2009 Autor Geschrieben 11. Februar 2009 Ich habe mittlerweile die Antwort, welche ich hier posten möchte: 1) in VBA - damit es echt funktiniert - muss man dummerweise immer noch beim Deklarieren jeder Var EINZELN den Typ zuweisen - ansonsten sind die richtige Eregebnisse eher rein zufällig. 2) Zum Glück hast Du mit "With ActiveDocument.MailMerge" die folgenden Befehle bezogen auf "MailMerge" Dinge an das "Richtige" ActiveDocument angehängt - sonst wäre hier schon was - spätestens nach Erzeugung des ersten "BRIEFES" was schiefgegangen - ABER - die weiteren Befehle innerhalb der With-Konstruktion mit "ActiveDocument....." beziehen sich nur beim ersten Mal auf die Serienbrief-Vorlage, ab dann immer auf den jeweils gerade erstellen Serien"BRIEF" da dieser dann das "activeDocument" ist. Also wird mit "ActiveDocument.Variables("besch_finanzamt").Value = "ja" ...... und "ActiveDocument.Fields.Update" nicht die Serienbrief-Vorlage versorgt und aktualisiert - sondern der jeweils erstellte Brief. An den nächsten neuen "BRIEF" wird dadurch immer das Ergebnis des ersten geliefert. Deshalb muss man die Seriendruckvorlage permantent aktivieren - damit diese immer das "activeDocument" ist. Unten habe ich Dir den Code beigefügt, der bei mir funktioniert. Public Sub Test4_b() Dim LetzterRec As Long 'Dim var1, var2 As Integer <<<--------------------------------------- Geandert Dim var1 as Integer, var2 As Integer '<<<-------------------------<< in Dim besch_finanzamt As String Dim MMDoc As Document '<<<--------------------------------------- neu Set MMDoc = ActiveDocument '<<<--------------------------------------- neu ActiveDocument.MailMerge.OpenDataSource Name:="Y:\0_Y_MOM\Stb_u_Stud_ausweis.xls", _ SQLStatement:="SELECT * FROM `WordBriefeDrucken__Arbeitstabel$`" ActiveDocument.MailMerge.DataSource.ActiveRecord = wdLastRecord LetzterRec = Word.ActiveDocument.MailMerge.DataSource.ActiveRecord ActiveDocument.MailMerge.DataSource.ActiveRecord = wdFirstRecord With ActiveDocument.MailMerge .DataSource.ActiveRecord = wdFirstRecord Do .Destination = wdSendToNewDocument .SuppressBlankLines = True With .DataSource .FirstRecord = .ActiveRecord .LastRecord = .ActiveRecord var1 = .DataFields("VersandFinanzbeschBetrag").Value var2 = .DataFields("VersandFinanzbesch").Value End With MMDoc.Activate '<<<--------------------------------------- neu If var1 <> 0 And var2 = -1 Then ActiveDocument.Variables("besch_finanzamt").Value = "ja" Else ActiveDocument.Variables("besch_finanzamt").Value = "nein" End If ActiveDocument.Fields.Update .Execute If .DataSource.ActiveRecord < LetzterRec Then .DataSource.ActiveRecord = wdNextRecord Else Exit Do End If Loop End With End Sub Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.