VB2010: Word-mergefield mit Daten füllen

Hallo!
Es wäre toll, wenn mir jemand helfen könnte (Denkanstoß, Codeschnipsel, Links…):
Visual Basic 2010 Express, Word 2003

Kurzdarstellung des Problems:

  • in der zu erstellenden Anwendung werden Datensätze verwaltet und gespeichert (csv)

  • von der Anwendung aus wird Word aufgerufen, die Daten werden an die im Dokument vorhandenen mergefields übergeben.

  • der Anwender kann also die Daten außerhalb von Word verwalten, Word zum Drucken nutzen und die dafür benötigten Vorlagen leicht selber erstellen.

daten.csv:
Name;Vorname
Meier:stuck_out_tongue_winking_eye:eter

Vorlage.doc
Guten Tag, { mergefield Vorname} { mergefield Name } …

bisherige erste Annäherungen, die funktionieren, aber noch nicht optimal sind:

  1. 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“)

  2. 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…

Danke und viele Grüße,
Kay

hoi,

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?

greetz, me

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

Kay