Frage

ich habe ein Problem mit einigem Seriencode, die angeblich Buchstaben innerhalb unserer Anwendung zu produzieren. Ich bin mir bewusst, dass dieser Code im Moment ein wenig rau ist, aber wir sind in der Phase „etwas zum Laufen bringen“, bevor wir es aufzuräumen.

Nun ist die Art und Weise dies funktionieren soll und wie es funktioniert, wenn wir es manuell tun, ist, dass wir eine Datei (die FileOut Variable + „.template“), die eine Vorlage für den Brief ist. Wir öffnen die Vorlage, fusioniert, und es dann als Dateinamen speichern in der FileOut Variable.

Doch was es tut, ist eine Kopie der Vorlage-Datei in den FileOut Dateinamen zu speichern, statt der Ausgabe des merge.

Ich habe gesucht, und ich scheine meinen Kopf gegen eine Mauer zu schlagen.

Daten-Datei ist die Daten-Datei, die die Zusammenführung Daten enthält.

die gleichen Dateien verwenden, es funktioniert, wenn Sie es manuell tun.

Public Function processFile(ByVal datafile As String, ByVal fileOut As String) As String
    Dim ans As String = String.Empty

    errorLog = "C:\Temp\Template_error.log"

    If (File.Exists(datafile)) Then

        Try

            ' Create an instance of Word  and make it invisible.'

            wrdApp = CreateObject("Word.Application")
            wrdApp.Visible = False

            ' Add a new document.'

            wrdDoc = wrdApp.Documents.Add(fileOut & ".template")
            wrdDoc.Select()

            Dim wrdSelection As Word.Selection
            Dim wrdMailMerge As Word.MailMerge


            wrdDoc.MailMerge.OpenDataSource(datafile)

            wrdSelection = wrdApp.Selection()
            wrdMailMerge = wrdDoc.MailMerge()
            With wrdMailMerge
                .Execute()
            End With

            wrdDoc.SaveAs(fileOut)

            wrdApp.Quit(False)

            ' Release References.'
            wrdSelection = Nothing
            wrdMailMerge = Nothing
            wrdDoc = Nothing
            wrdApp = Nothing


            ans = "Merged OK"

            Call writeToLogFile(errorLog, "This worked, written to  " & fileOut)

        Catch ex As Exception
            ans = "error : exception thrown " & ex.ToString
            Call writeToLogFile(errorLog, ans)
        End Try

    Else
        ans = "error ; unable to open Date File : " & datafile
        If (logErrors) Then
            Call writeToLogFile(errorLog, "The specified source csv file does not exist. Unable " & _
               "to process it. Filename provided: " & datafile)
        End If
    End If

    Return ans

End Function
War es hilfreich?

Lösung

Ich habe die Lösung gefunden. Wenn Sie ein Dokument zusammenführen, erstellt es ein neues Dokument mit dem merge ergibt es. Codefragment unten erklärt.

wrdDoc = wrdApp.Documents.Add(TemplateFileName)
wrdDoc.Select()
Dim wrdSelection As Word.Selection
Dim wrdMailMerge As Word.MailMerge


wrdDoc.MailMerge.OpenDataSource(DataFileName)

wrdSelection = wrdApp.Selection()
wrdMailMerge = wrdDoc.MailMerge()
With wrdMailMerge
    .Execute()
End With

' This is the wrong thing to do. It just re-saves the template file you opened. '
'wrdDoc.SaveAs(OutputFileName) '

' The resulting merged document is actually stored '
' in the MailMerge object, so you have to save that '
wrdMailMerge.Application.ActiveDocument.SaveAs(OutputFileName)

wrdApp.Quit(False)

Andere Tipps

Ich denke, das Problem ist, diese Zeile:

wrdDoc.MailMerge.OpenDataSource(templateName)

So template ist so etwas wie 'C: \ My Template.doc'?, Rechts

Es sieht aus wie Sie den Dateipfad eines das Word-Dokument selbst anstelle einer Datenquelle (die Excel oder CSV-Datei, Access-Tabelle, etc.) liefern zum „.template“ Dokument verknüpft.

Versuchen :

data = "C:\My Data.xls"
wrdDoc.MailMerge.OpenDataSource(data)

Eine Möglichkeit, zu betrügen ist ein Makro aufzeichnen, während manuell alle Schritte tun Sie erwähnen. Sobald Sie fertig sind, stellen Sie das Makro flexibler zu sein.

Das ist, was ich das letzte Mal habe ich es nicht herausfinden konnte, während meine eigene Makros zu schreiben:)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top