Automatizar Word Mailmerge no funciona como se esperaba
-
03-07-2019 - |
Pregunta
Tengo un problema con algún código de combinación de correo que se supone produce letras dentro de nuestra aplicación. Soy consciente de que este código es un poco rudo en este momento, pero estamos en la sección "Conseguir que algo funcione" Fase antes de que lo ordenemos.
Ahora, la forma en que se supone que debe funcionar, y la forma en que funciona cuando lo hacemos manualmente, es que tenemos un archivo (la variable fileOut + " .template ") que es una plantilla para la letra. Abrimos esa plantilla, la combinamos y luego la guardamos como el nombre de archivo en la variable fileOut.
Sin embargo, lo que está haciendo es guardar una copia del archivo de plantilla en el nombre de archivo de archivo, en lugar de la salida de la combinación.
He buscado, y parece que me estoy golpeando la cabeza contra una pared de ladrillo.
archivo de datos es el archivo de datos que contiene los datos de combinación.
Usando los mismos archivos, todo funciona si lo haces manualmente.
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
Solución
He encontrado la solución. Cuando combina un documento, crea un nuevo documento con los resultados de la fusión en él. El siguiente fragmento de código lo explica.
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)
Otros consejos
Creo que el problema es esta línea:
wrdDoc.MailMerge.OpenDataSource(templateName)
Entonces templateName es algo así como 'C: \ My Template.doc', ¿verdad?
Parece que está suministrando la ruta del archivo del propio documento de Word en lugar de una fuente de datos (el archivo Excel o CSV, la tabla de acceso, etc.) vinculada a la " .template " documento.
Probar :
data = "C:\My Data.xls"
wrdDoc.MailMerge.OpenDataSource(data)
Una forma de hacer trampa es grabar una macro mientras se realizan manualmente todos los pasos que mencionas. Una vez que haya terminado, ajuste la macro para que sea más flexible.
Eso fue lo que hice la última vez que no pude entenderlo mientras escribía mis propias macros :)