bisherige erste Annäherungen, die funktionieren, aber noch nicht optimal sind:
Einfügen von neuen mergefields in ein neues Word-Dokument
ungefähr so:
App = CreateObject(„Word.Application“)
Dim Doc As Microsoft.Office.Interop.Word.Document
Dim Sel As Microsoft.Office.Interop.Word.Selection
Doc = App.Documents.Add
Doc.Application.Documents.Open(„Vorlage.doc“)
Doc.mailmerge.OpenDataSource(Name:=„Daten.csv“)
Doc.Mailmerge.Fields.Add(Sel.Range, „Name“)
Schreiben der Daten in die Textmarken des Dokuments.
ungefähr so:
Dim wd = CreateObject(„Word.Application“)
wd.Application.Documents.Open(„Vorlage.DOC“)
wd.ActiveDocument.Bookmarks(„Nachname“).Select()
wd.Selection.Text = Name
In beiden Fällen ist die verwendung für den Anwender kompliziert bis unmöglich, da in 1. der Programmcode entscheidend ist und das Layout bestimmt und wie in 2. die Verwendung von Textmarken schwieriger und unflexibler (Stichwort „{ if }“) als mergefields sind.
Gibt es eine Möglichkeit, die Daten entweder direkt aus der Anwendung heraus (meinetwegen aus dem Datagridview) oder über die csv-Datei in die mergefields von Word hineinzubekommen? Oder vielleicht hat jemand einen brauchbaren Vorschlag zu einer alternativen Herangehensweise…
csv-datei in ein array, oder eine liste einlesen, intern mit einem tag versehen (zum differenzieren), und die ergebnisse schleifenbasiert in die (word)datei schreiben lassen?
Hallo!
Das Einlesen der Daten klappt, ich bekomme die Daten ja auch in Word rein, aber eben entweder als Ersetzung für Textmarken oder mit neu erstellten mergefields. Ich möchte aber, dass ich eine Word-Vorlage mit mergefields erstellen kann, die dann aus VB2010 heraus „befüllt“ werden.
Ich hatte vermutet/gehofft, dass es eine entsprechende Anweiseung gibt (vergleichbar mit
Doc.Mailmerge.Fields.Add(Sel.Range, "Name")
oder
wd.ActiveDocument.Bookmarks("Nachname").Select() : wd.Selection.Text = Name
), also etwa
wd.activedocument.mailmerge.fields("Name").select
oder so. Ich habe bisher aber so etwas nicht finden können.
Kay
Lösung: Word-mergefield mit Daten füllen
Ich habe inzwischen die Lösung gefunden, die genau zu meinem Problem passt. Mit ein bisschen Probieren und dem Makrorekorder in Word bin ich drauf gekommen (mir war nicht klar, dass man die VBA-Befehle so leicht übernehmen kann).
Falls jemand mal vor dem gleichen Problem stehen sollte, hier kurz der Code, den ich nun verwende:
Dim WordApp As Word.Application
Dim WordDatei As Word.Document
WordApp = New Word.Application()
WordDatei = WordApp.Documents.Open("C:\testdok.doc")
WordDatei.MailMerge.MainDocumentType = Word.WdMailMergeMainDocType.wdFormLetters
WordDatei.MailMerge.OpenDataSource(Name:= "C:\testcsv.csv", \_
ConfirmConversions:=False, ReadOnly:=False, LinkToSource:=True, \_
AddToRecentFiles:=False, PasswordDocument:="", PasswordTemplate:="", \_
WritePasswordDocument:="", WritePasswordTemplate:="", Revert:=False, \_
Format:=Word.WdOpenFormat.wdOpenFormatAuto, Connection:="", SQLStatement:="", SQLStatement1 \_
:="", SubType:=Word.WdMergeSubType.wdMergeSubTypeOther)
With WordDatei.MailMerge
.Destination = Word.WdMailMergeDestination.wdSendToNewDocument
.SuppressBlankLines = True
With .DataSource
.FirstRecord = Word.WdMailMergeDefaultRecord.wdDefaultFirstRecord
.LastRecord = Word.WdMailMergeDefaultRecord.wdDefaultLastRecord
End With
.Execute(Pause:=False)
End With
WordDatei.Close()
WordApp.Visible = True