Question

Je rencontre un problème avec un code de publipostage censé produire des lettres dans notre application. Je suis conscient que ce code est un peu approximatif pour le moment, mais nous sommes dans la zone "Obtenir quelque chose qui fonctionne". phase avant de le ranger.

La façon dont cela est supposé fonctionner, et celle qui fonctionne lorsque nous le faisons manuellement, est que nous avons un fichier (la variable fileOut + "quotyle") qui est un modèle pour la lettre. Nous ouvrons ce modèle, le fusionnons, puis nous l'enregistrons sous le nom de fichier dans la variable fileOut.

Cependant, il enregistre une copie du fichier de modèle dans le nom de fichier fileout, au lieu de la sortie de la fusion.

J'ai cherché et je semble me cogner la tête contre un mur de briques.

fichier de données est le fichier de données contenant les données de fusion.

En utilisant les mêmes fichiers, tout fonctionne si vous le faites manuellement.

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
Était-ce utile?

La solution

J'ai trouvé la solution. Lorsque vous fusionnez un document, un nouveau document est créé avec les résultats de la fusion. Le fragment de code ci-dessous explique.

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)

Autres conseils

Je pense que le problème est cette ligne:

wrdDoc.MailMerge.OpenDataSource(templateName)

Donc templateName est quelque chose comme 'C: \ My Template.doc', n'est-ce pas?

Il semble que vous fournissiez le chemin du fichier Word lui-même au lieu d’une source de données (fichier Excel ou CSV, Access Table, etc.) liée au fichier ".template". document.

Essayez :

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

Un moyen de tricher consiste à enregistrer une macro tout en effectuant manuellement toutes les étapes mentionnées. Une fois que vous avez terminé, ajustez la macro pour qu'elle soit plus flexible.

C'est ce que j'ai fait la dernière fois. Je ne pouvais pas le comprendre en écrivant ma propre macro.)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top