我遇到了一些应该在我们的应用程序中生成字母的邮件合并代码的问题。我知道这个代码目前有点粗糙,但是在我们整理它之前,我们正处于“获取工作”阶段。
现在我们应该这样工作的方式,以及我们手动操作时的工作方式,我们有一个文件(fileOut变量+“。trymp”),它是字母的模板。我们打开该模板,合并它,然后将其保存为fileOut变量中的文件名。
然而,它正在做的是将模板文件的副本保存到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
答案 0 :(得分: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)
答案 1 :(得分:0)
我认为问题在于这一行:
wrdDoc.MailMerge.OpenDataSource(templateName)
所以 templateName 就像'C:\ My Template.doc',对吗?
看起来您提供的是Word文档本身的文件路径,而不是链接到“.template”文档的数据源(Excel或CSV文件,访问表等)。
<强>尝试强>:
data = "C:\My Data.xls"
wrdDoc.MailMerge.OpenDataSource(data)
答案 2 :(得分:0)
作弊的一种方法是在手动执行您提到的所有步骤时录制宏。完成后,将宏调整为更灵活。
这就是我上次在编写自己的宏时无法解决的问题:)