运行时错误 91:未设置对象变量或 With 块变量

问题描述 投票:0回答:2

我有 2 个带有邮件合并列表的独立 Word 文档。我有一个 Excel 工作簿,有 2 张纸。根据工作表名称,如果工作表不为空,我需要将邮件合并发送到相应的 Word 文档。

当我尝试执行此代码时,它运行到第一个文档,在第二个文档处,它停止并出现错误

Run-time Error 91 : Object variable or With block variable not set

我不确定是什么导致了这个错误(如果是 Dim 变量或 With 块)。如果有人能帮助我纠正这个错误,我将不胜感激。

Sub Generate_Certificate() 

    Dim wd As Object 
    Dim wdoc_reg As Object 
    Dim wdoc_occ As Object 
    Dim strWbName_reg As String 
    Dim strWbName_occ As String 


    Const wdFormLetters = 0, wdOpenFormatAuto = 0 
    Const wdFormLetters1 = 0, wdOpenFormatAuto1 = 0 
    Const wdSendToNewDocument = 0, wdDefaultFirstRecord = 1, wdDefaultLastRecord = -16 
    Const wdSendToNewDocument1 = 0, wdDefaultFirstRecord1 = 1, wdDefaultLastRecord1 = -16 


    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 


    For Each Sheet In ActiveWorkbook.Sheets 

         'Generate report using "Mailmerge" if any data available for Mailmerge1
        If Sheet.Name Like "Sheet1" And IsEmpty(ThisWorkbook.Sheets("Sheet1").Range("A2").Value) = False Then 
            Set wdoc_reg = wd.Documents.Open("C:\Mailmerge1.docx") 


            strWbName_reg = ThisWorkbook.Path & "\" & ThisWorkbook.Name 


            wdoc_reg.MailMerge.MainDocumentType = wdFormLetters 


            wdoc_reg.MailMerge.OpenDataSource _ 
            Name:=strWbName_reg, _ 
            AddToRecentFiles:=False, _ 
            Revert:=False, _ 
            Format:=wdOpenFormatAuto, _ 
            Connection:="Data Source=" & strWbName_reg & ";Mode=Read", _ 
            SQLStatement:="SELECT * FROM `Sheet1$`" 

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


            wd.Visible = True 
            wdoc_reg.Close SaveChanges:=False 


            Set wdoc_reg = Nothing 
            Set wd = Nothing 
        End If 


         'Generate report using "Mailmerge" if any data available for Mailmerge2
        If Sheet.Name Like "Sheet2" And IsEmpty(ThisWorkbook.Sheets("Sheet2").Range("A2").Value) = False Then 
            Set wdoc_occ = wd.Documents.Open("C:\Mailmerge2.docx") 


            strWbName_occ = ThisWorkbook.Path & "\" & ThisWorkbook.Name 


            wdoc_occ.MailMerge.MainDocumentType = wdFormLetters1 


            wdoc_occ.MailMerge.OpenDataSource _ 
            Name:=strWbName_Occ, _ 
            AddToRecentFiles:=False, _ 
            Revert:=False, _ 
            Format:=wdOpenFormatAuto1, _ 
            Connection:="Data Source=" & strWbName_occ & ";Mode=Read", _ 
            SQLStatement:="SELECT * FROM `Sheet2$`" 


            With wdoc_occ.MailMerge 
                .Destination = wdSendToNewDocument1 
                .SuppressBlankLines = True 
                With .DataSource 
                    .FirstRecord = wdDefaultFirstRecord1 
                    .LastRecord = wdDefaultLastRecord1 
                End With 
                .Execute Pause:=False 
            End With 


            wd.Visible = True 
            wdoc_occ.Close SaveChanges:=False 


            Set wdoc_Occ = Nothing 
            Set wd = Nothing 
        End If 


    Next 


End Sub
vba excel runtime-error mailmerge
2个回答
2
投票

正如蒂姆·威廉姆斯在问题评论中所述。

循环中有

Set wd = Nothing
,这将清除第一张纸之后对 Word 的引用。将其移至
End Sub

之前

0
投票

请检查注册表编辑器组件服务

img1

img2

© www.soinside.com 2019 - 2024. All rights reserved.