2

我遇到了一些应该在我们的应用程序中生成字母的邮件合并代码的问题。我知道这段代码目前有点粗糙,但在我们整理之前我们正处于“让某些东西工作”阶段。

现在它应该工作的方式,以及当我们手动执行它时的工作方式,是我们有一个文件(fileOut 变量+“.template”),它是一个字母的模板。我们打开该模板,将其合并,然后将其作为文件名保存在 fileOut 变量中。

但是,它所做的是将模板文件的副本保存到文件输出文件名,而不是合并的输出。

我已经搜索过了,我似乎正在用头撞砖墙。

datafile 是包含合并数据的数据文件。

使用相同的文件,如果您手动执行,这一切都有效。

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
4

3 回答 3

4

我找到了解决方案。合并文档时,它会创建一个包含合并结果的新文档。下面的代码片段解释。

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)
于 2008-10-01T07:00:43.967 回答
0

我认为问题在于这一行:

wrdDoc.MailMerge.OpenDataSource(templateName)

所以templateName类似于 'C:\My Template.doc',对吗?

看起来您提供的是 Word 文档本身的文件路径,而不是链接到“.template”文档的数据源(Excel 或 CSV 文件、Access 表等)。

尝试

data = "C:\My Data.xls"
wrdDoc.MailMerge.OpenDataSource(data)
于 2008-09-30T16:15:50.693 回答
0

一种作弊方法是在手动执行您提到的所有步骤时录制宏。完成后,将宏调整为更灵活。

这就是我上次在编写自己的宏时无法弄清楚的事情:)

于 2008-09-30T16:34:05.347 回答