2008-09-30 16 views
2

Je rencontre un problème avec un code de fusion et publipostage censé générer des lettres dans notre application. Je suis conscient que ce code est un peu difficile en ce moment, mais nous sommes dans la phase "Get something working" avant de le ranger.L'automatisation de Word Mailmerge ne fonctionne pas comme prévu

Maintenant, la façon dont cela est censé fonctionner, et la façon dont cela fonctionne quand nous le faisons manuellement, est que nous avons un fichier (la variable fileOut + ".template") qui est un modèle pour la lettre. Nous ouvrons ce modèle, le fusionnons, puis l'enregistrons en tant que nom de fichier dans la variable fileOut. Toutefois, ce qu'il fait est d'enregistrer une copie du fichier modèle dans le nom de fichier, au lieu de la sortie de la fusion.

J'ai cherché et j'ai l'impression de me taper la tête contre un mur de briques. Fichier_données est le fichier de données qui contient 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 

Répondre

4

J'ai trouvé la solution. Lorsque vous fusionnez un document, il crée un nouveau document 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) 
0

Je pense que le problème est cette ligne:

wrdDoc.MailMerge.OpenDataSource(templateName) 

Alors templateName est quelque chose comme 'C: \ Mon Template.doc', non?

Il semble que vous fournissiez le chemin de fichier d'un document Word lui-même au lieu d'une source de données (fichier Excel ou CSV, table d'accès, etc.) liée au document ".template".

Essayez:

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

J'ai clarifié un peu le code. La variable a été mal nommée, et templateName était en fait la source de données. J'ai dit que le code était approximatif :) – hulver

0

Une façon de tricher est d'enregistrer une macro tout en faisant manuellement toutes les étapes que vous mentionnez. Une fois que vous avez terminé, réglez la macro pour qu'elle soit plus flexible.

C'est ce que je l'ai fait la dernière fois que je ne pouvais pas le comprendre en écrivant mon propre macros :)

Questions connexes