Zum Inhalt springen

Word: Daten aus VBA in Feldfunktion übergeben (docvariable?)


Empfohlene Beiträge

Geschrieben

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

Geschrieben

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

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...