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
¿Fue útil?

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 :)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top