Vba 任何其他解决问题的方法;“自动化错误”;

Vba 任何其他解决问题的方法;“自动化错误”;,vba,excel,Vba,Excel,在stack exchange用户的帮助下,我成功地完成了一个宏,可以从excel中自动邮件合并word文档。但是现在的问题是,除非word文档是打开的,否则我会得到一个自动化错误 现在,我通过每次打开word文档来解决这个问题,但我怀疑这是正确的编程方法 有什么建议可以克服这个错误吗?我对VBA很陌生。这是我学生作业的一部分。是否有任何建议或代码更改来帮助克服此错误?我看了官方的msdn文件,一点也不明白( 错误通常为“自动化错误-带交叉符号”或以下错误: 对于这两个错误,目前的解决方案是先打

在stack exchange用户的帮助下,我成功地完成了一个宏,可以从excel中自动邮件合并word文档。但是现在的问题是,除非word文档是打开的,否则我会得到一个自动化错误

现在,我通过每次打开word文档来解决这个问题,但我怀疑这是正确的编程方法

有什么建议可以克服这个错误吗?我对VBA很陌生。这是我学生作业的一部分。是否有任何建议或代码更改来帮助克服此错误?我看了官方的msdn文件,一点也不明白(

错误通常为“自动化错误-带交叉符号”或以下错误: 对于这两个错误,目前的解决方案是先打开word文档,然后运行宏

更新: 我删除了“错误…”部分,现在错误是:

计划如下:

Const wdFormLetters = 0, wdOpenFormatAuto = 0
Const wdSendToNewDocument = 0, wdDefaultFirstRecord = 1, wdDefaultLastRecord = -16

Sub RunMerge2()
Dim wd As Object, wdocSource As Object
    Dim sh As Worksheet
    Dim Lrow As Long, i As Long
    Dim cdir As String, client As String, newname As String
    Dim sSQL As String

    cdir = "C:\Users\Kamlesh\Desktop\"

    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(cdir & "\master\installers.docx")
    Set sh = ActiveSheet
    strWorkbookName = ThisWorkbook.Path & "\" & ThisWorkbook.Name

    With sh
        Lrow = .Range("A" & .Rows.Count).End(xlUp).Row

        For i = 2 To Lrow
            If Len(Trim(.Range("A" & i).Value)) <> 0 Then
                client = .Cells(i, 1).Value
                newname = "Installer Instructions - " & client & ".docx"

                wdocSource.MailMerge.MainDocumentType = wdFormLetters

                '~~> Sample String
                sSQL = "SELECT * FROM `Sheet1$` WHERE [Client Name] = '" & .Range("A" & i).Value & "'"

                wdocSource.MailMerge.OpenDataSource Name:=strWorkbookName, _
                AddToRecentFiles:=False, Revert:=False, Format:=wdOpenFormatAuto, _
                Connection:="Data Source=" & strWorkbookName & ";Mode=Read", _
                SQLStatement:=sSQL

                With wdocSource.MailMerge
                    .Destination = wdSendToNewDocument
                    .SuppressBlankLines = True
                    With .DataSource
                        .FirstRecord = wdDefaultFirstRecord
                        .LastRecord = wdDefaultLastRecord
                    End With
                    .Execute Pause:=False
                End With

                wd.ActiveDocument.SaveAs cdir & newname
                wd.ActiveDocument.Close SaveChanges:=False
            End If
        Next i
    End With

    wdocSource.Close SaveChanges:=False
    'wd.Quit

    Set wdocSource = Nothing
    Set wd = Nothing
End Sub
Const wdFormLetters=0,wdOpenFormatAuto=0
常量wdSendToNewDocument=0,wdDefaultFirstRecord=1,wdDefaultLastRecord=-16
子运行合并2()
将wd设置为对象,将wdocSource设置为对象
将sh设置为工作表
朦胧如长,我如长
Dim cdir作为字符串,客户端作为字符串,newname作为字符串
将sSQL设置为字符串
cdir=“C:\Users\Kamlesh\Desktop\”
出错时继续下一步
Set wd=GetObject(,“Word.Application”)
如果wd什么都不是,那么
Set wd=CreateObject(“Word.Application”)
如果结束
错误转到0
设置wdocSource=wd.Documents.Open(cdir&“\master\installers.docx”)
设置sh=ActiveSheet
strWorkbookName=ThisWorkbook.Path&“\”&ThisWorkbook.Name
与sh
Lrow=.Range(“A”&.Rows.Count).End(xlUp).Row
对于i=2至Lrow
如果Len(Trim(.Range(“A”&i).Value))为0,则
客户端=.Cells(i,1).Value
newname=“安装程序说明-”&client&“.docx”
wdocSource.MailMerge.MainDocumentType=wdFormLetters
“~~>示例字符串
sSQL=“从`Sheet1$`WHERE[Client Name]='”和.Range(“A”&i).Value&'”中选择*
wdocSource.MailMerge.OpenDataSource名称:=strWorkbookName_
AddToRecentFiles:=False,Revert:=False,Format:=wdOpenFormatAuto_
连接:=“数据源=”&strWorkbookName&“模式=读取”_
SQLStatement:=sSQL
使用wdocSource.MailMerge
.Destination=wdSendToNewDocument
.suppress blanklines=True
使用.DataSource
.FirstRecord=wdDefaultFirstRecord
.LastRecord=wdDefaultLastRecord
以
.执行暂停:=False
以
wd.ActiveDocument.SaveAs cdir和newname
wd.ActiveDocument.Close SaveChanges:=False
如果结束
接下来我
以
wdocSource.Close SaveChanges:=False
“退出
设置wdocSource=Nothing
设置wd=无
端接头
这一行

Set wdocSource = wd.Documents.Open(cdir & "\master\installers.docx")
应该是

Set wdocSource = wd.Documents.Open(cdir & "master\installers.docx")

可以替换为

strWorkbookName = ThisWorkbook.FullName

要查找导致错误的代码部分,请在“工具”>“选项”>“编辑器”选项卡中检查所有内容

在“常规”选项卡中,检查所有内容,然后选择
Break-in-Class Module


现有代码(您要更换的部件)对于处理Word已在运行的情况是必需的。(答案并不建议尝试某些东西。建议应该作为对问题的注释发布。无论如何,我删除了该部分并发布了屏幕截图。希望这有助于调试问题。@Ken White这正是我提出建议的原因,以防问题与已运行的Word实例有关。正如我所说,建议属于对的注释。)原始问题。建议不是答案。@kenwhite问题是“解决“自动化错误”的任何其他方法”,因此我认为即使是建议也是该问题的答案:],在评论中加入这一点将是相当具有挑战性的。请查看我关于如何查找错误所在的更新。
strWorkbookName = ThisWorkbook.FullName