有关stackoverflow的上一个问题:
“是否可以从excel宏启动MAIL MERGE(通过单击工作表上的按钮)
我有数据的Excel表格,并希望将其导出到新单词doc。“
这是在09年9月29日12:39由dendarii 772回答的。
我们也有此需求,因为我们希望简化计算机技能有限的志愿者的生活。
不幸的是,使用合适路径修改的dendarii代码在.OpenDataSource语句中以运行时错误4198退出。
Cindy Meister在Microsoft Office for Developer's Form上撰写> ..> Word 2010 VBA建议4198错误可能是由于同步性问题。我放弃了它没有成功。
安德鲁·普尔森(Andrew Poulson)在Excel上写道,鼓励贡献者Snecz将他的VBA邮件合并.OpenDataSource语句与Word宏录制进行比较。贡献者会怎么想?我的.OpenDataSource系列看起来很标准。我的Excel datasource文件有一行标题,后跟两行数据元素。我们有Office 2010。
如果有关于如何修复4198以及是否有人知道一般诊断程序的任何建议,我将非常感激。我们是两个人为之工作 慈善组织。欢迎任何帮助!
Sub RunMerge()
Dim wd As Object
Dim wdocSource As Object
Dim strWorkbookName As String
On Error Resume Next
Set wd = GetObject(, "Word.Application")
If wd Is Nothing Then
Set wd = CreateObject("Word.Application")
End If
On Error GoTo 0
Set wdocSource = wd.Documents.Open("C:\Users\george\Desktop\VBA Project\Mergeletter.docx")
strWorkbookName = ThisWorkbook.Path & "\" & ThisWorkbook.Name
wdocSource.MailMerge.MainDocumentType = wdFormLetters
wdocSource.MailMerge.OpenDataSource _
Name:=strWorkbookName, _
AddToRecentFiles:=False, _
Revert:=False, _
Format:=wdOpenFormatAuto, _
Connection:="Data Source=" & strWorkbookName & ";Mode=Read", _
SQLStatement:="SELECT * FROM `Sheet1$`"
With wdocSource.MailMerge
.Destination=wdSendToNewDocument
.SuppressBlankLines = True
With .DataSource
.FirstRecord = wdDefaultFirstRecord
.LastRecord = wdDefaultLastRecord
End With
.Execute Pause:=False
End With
wd.Visible = True
wdocSource.Close SaveChanges:=False
Set wdocSource = Nothing
Set wd = Nothing
End Sub
答案 0 :(得分:3)
您是否有对Word对象库的引用?如果没有,那么宏将失败,因为您正在使用该库中的特定项目(如wdOpenFormatAuto
)。
要添加对库的引用,请在excel VBA编辑器中单击工具>引用并向下滚动,直到找到“Micrsoft Word对象库”,单击左侧的框以“检查”并单击“确定” 。将有一个与之关联的版本号...自运行Office 2010以来可能是14.0。
添加该引用,这应该可以解决您的问题。
如果您已经拥有该套装,请告诉我们。
答案 1 :(得分:1)
如何在调用OpenDataSource之前设置一个人工延迟,让Open方法有机会赶上?这非常难看,可能需要稍微清理一下以匹配VBA语法,但这里有:
For nI As Integer = 0 To 2500
DoEvents()
Next
您还可以测试日期并在执行之前让一段时间过去(即2秒)(这比任何VB.Net代码更多):
Dim dtDate As Date = Date.Now
Do While Date.Now.Subtract(dtDate).TotalSeconds < 2
DoEvents()
Loop