You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Word VBA引用Excel工作表报错:对象'_Global'方法调用失败

问题:Word宏向Excel写入数据时触发运行时错误'1004'

我在MS Word中编写宏,用于将文档表格数据复制到本地Excel文件的指定列。Word文档包含提交按钮,点击后会向Excel新增数据行,所有提交内容同步至主电子表格。运行宏时Excel会打开,但随即弹出错误:

运行时错误'1004':对象'_Global'的'Worksheets'方法调用失败。

不确定是宏尝试创建多个Excel副本,还是对象引用存在问题,相关VBA代码如下:

Sub CommandButton1_Click()
    
    '// Declare Excel Objects
    Dim xlApp As Excel.Application
    Dim xlwb As Excel.Workbook
    Dim sh As Worksheet
    Dim lr As Long
    
    '// Declare Word Objects
    Dim doc As Document
    Dim tbl As Table
    Dim tbl2 As Table
    Dim tbl8 As Table
    
    Dim LastRow As Long, LastColumn As Integer
    Dim tblRange1 As Variant 'Range
    Dim tblRange2 As Variant 'Range
    Dim tblRange3 As Variant 'Range
    Dim tblRange4 As Variant 'Range
    Dim tblRange5 As Variant 'Range
    Dim tblRange6 As Variant 'Range
    Dim tblRange7 As Variant 'Range
    Dim tblRange8 As Variant 'Range
    Dim tblRange9 As Variant 'Range
    Dim tblRange10 As Variant 'Range
    
    Dim AnswerYes As String
    Dim AnswerNo As String
    
    Set doc = ThisDocument
      
    Set xlApp = CreateObject("Excel.Application")
    xlApp.Visible = True
    
    'Open Workbook
    Set xlwb = xlApp.Workbooks.Open("C:\Users\Test Document.xlsm")
    Set sh = Worksheets("CHECKLIST")
     
    AnswerYes = MsgBox("Do you want to Submit Application?", vbQuestion + vbYesNo, "User Repsonse")
    
    If AnswerYes = vbYes Then
    
        Set tbl = doc.Tables(1)
        Set tbl2 = doc.Tables(2)
        Set tbl8 = doc.Tables(8)
        
        lr = sh.Cells(Rows.Count, 3).End(xlUp).Row + 1
        
        With tbl
            Set tblRange1 = .Cell(1, 3).Range ' Value from Word Document (Last Name)
            tblRange1.Copy
            sh.Cells(lr, "D").PasteSpecial xlPasteValues
            
            Set tblRange2 = .Cell(1, 4).Range ' Value from Word Document (First Name)
            tblRange2.Copy
            sh.Cells(lr, "C").PasteSpecial xlPasteValues
            
            Set tblRange3 = .Cell(3, 7).Range ' Value from Word Document (Phone)
            tblRange3.Copy
            sh.Cells(lr, "E").PasteSpecial xlPasteValues
            
            Set tblRange4 = .Cell(5, 9).Range ' Value from Word Document (Email)
            tblRange4.Copy
            sh.Cells(lr, "F").PasteSpecial xlPasteValues
            
            Set tblRange6 = .Cell(1, 9).Range ' Value from Word Document (Date of Application)
            tblRange6.Copy
            sh.Cells(lr, "T").PasteSpecial xlPasteValues
            
            Set tblRange7 = .Cell(3, 3).Range ' Value from Word Document (Address)
            tblRange7.Copy
            sh.Cells(lr, "I").PasteSpecial xlPasteValues
            
            Set tblRange8 = .Cell(5, 3).Range ' Value from Word Document (City)
            tblRange8.Copy
            sh.Cells(lr, "J").PasteSpecial xlPasteValues
            
            Set tblRange9 = .Cell(5, 4).Range ' Value from Word Document (State)
            tblRange9.Copy
            sh.Cells(lr, "K").PasteSpecial xlPasteValues
            
            Set tblRange10 = .Cell(5, 5).Range ' Value from Word Document (Zip)
            tblRange10.Copy
            sh.Cells(lr, "L").PasteSpecial xlPasteValues
        End With
        
        With tbl2
            Set tblRange10 = .Cell(1, 4).Range ' Value from Word Document (SSN)
            tblRange10.Copy
            sh.Cells(lr, "H").PasteSpecial xlPasteValues
        End With
        
        With tbl8
            Set tblRange10 = .Cell(1, 3).Range ' Value from Word Document (DOB)
            tblRange10.Copy
            sh.Cells(lr, "G").PasteSpecial xlPasteValues
        End With
        
        MsgBox (" Your Application has been Submitted!  ")
        
        '//Close obj Instance
        Set xlwb = Nothing
        Set xlApp = Nothing
        
        Set tbl = Nothing
        Set doc = Nothing
        
    Else
       'Range("A1:A2").Copy Range("E1")
    End If
    
    doc.Close
    xlApp.Quit
    Set sh = Nothing
    
End Sub
解决方案

错误根源

触发错误的核心原因是对象引用不明确:在Word VBA环境中,直接调用Worksheets("CHECKLIST")会默认尝试访问Word的对象模型,但Word并没有Worksheets对象,必须明确指定该工作表属于你打开的Excel工作簿实例。

修改步骤

  1. 修正工作表引用
    将:
Set sh = Worksheets("CHECKLIST")

改为:

Set sh = xlwb.Worksheets("CHECKLIST")

这行代码明确指定sh是xlwb(你打开的Excel工作簿)中的工作表。

  1. 修正文件路径
    注意你的Excel文件路径C:\Users\Test Document.xlsm不完整,Users目录下需要指定具体用户名,比如:
Set xlwb = xlApp.Workbooks.Open("C:\Users\YourUsername\Test Document.xlsm")

替换YourUsername为实际系统用户名。

  1. 优化对象释放与程序逻辑
  • 释放对象的顺序要调整,先关闭Excel再释放对象,避免出现对象已被释放的错误;
  • 避免使用复制粘贴,直接赋值效率更高,比如把tblRange1.Copy + PasteSpecial改为:
    sh.Cells(lr, "D").Value = Left(tbl.Cell(1, 3).Range.Text, Len(tbl.Cell(1, 3).Range.Text) - 2)
    
    (Word表格单元格的Range.Text会包含额外的结束标记,用Left去掉最后两个字符)

修改后的完整代码示例

Sub CommandButton1_Click()
    
    '// Declare Excel Objects
    Dim xlApp As Excel.Application
    Dim xlwb As Excel.Workbook
    Dim sh As Worksheet
    Dim lr As Long
    
    '// Declare Word Objects
    Dim doc As Document
    Dim tbl As Table
    Dim tbl2 As Table
    Dim tbl8 As Table
    
    Dim AnswerYes As VbMsgBoxResult
    
    Set doc = ThisDocument
      
    Set xlApp = CreateObject("Excel.Application")
    xlApp.Visible = True
    
    'Open Workbook - 替换为正确的文件路径
    Set xlwb = xlApp.Workbooks.Open("C:\Users\YourUsername\Test Document.xlsm")
    '明确指定工作表所属的工作簿
    Set sh = xlwb.Worksheets("CHECKLIST")
     
    AnswerYes = MsgBox("Do you want to Submit Application?", vbQuestion + vbYesNo, "User Response")
    
    If AnswerYes = vbYes Then
    
        Set tbl = doc.Tables(1)
        Set tbl2 = doc.Tables(2)
        Set tbl8 = doc.Tables(8)
        
        lr = sh.Cells(xlApp.Rows.Count, 3).End(xlUp).Row + 1
        
        '直接赋值替代复制粘贴,提升效率
        With tbl
            'Last Name
            sh.Cells(lr, "D").Value = Left(.Cell(1, 3).Range.Text, Len(.Cell(1, 3).Range.Text) - 2)
            'First Name
            sh.Cells(lr, "C").Value = Left(.Cell(1, 4).Range.Text, Len(.Cell(1, 4).Range.Text) - 2)
            'Phone
            sh.Cells(lr, "E").Value = Left(.Cell(3, 7).Range.Text, Len(.Cell(3, 7).Range.Text) - 2)
            'Email
            sh.Cells(lr, "F").Value = Left(.Cell(5, 9).Range.Text, Len(.Cell(5, 9).Range.Text) - 2)
            'Date of Application
            sh.Cells(lr, "T").Value = Left(.Cell(1, 9).Range.Text, Len(.Cell(1, 9).Range.Text) - 2)
            'Address
            sh.Cells(lr, "I").Value = Left(.Cell(3, 3).Range.Text, Len(.Cell(3, 3).Range.Text) - 2)
            'City
            sh.Cells(lr, "J").Value = Left(.Cell(5, 3).Range.Text, Len(.Cell(5, 3).Range.Text) - 2)
            'State
            sh.Cells(lr, "K").Value = Left(.Cell(5, 4).Range.Text, Len(.Cell(5, 4).Range.Text) - 2)
            'Zip
            sh.Cells(lr, "L").Value = Left(.Cell(5, 5).Range.Text, Len(.Cell(5, 5).Range.Text) - 2)
        End With
        
        With tbl2
            'SSN
            sh.Cells(lr, "H").Value = Left(.Cell(1, 4).Range.Text, Len(.Cell(1, 4).Range.Text) - 2)
        End With
        
        With tbl8
            'DOB
            sh.Cells(lr, "G").Value = Left(.Cell(1, 3).Range.Text, Len(.Cell(1, 3).Range.Text) - 2)
        End With
        
        MsgBox "Your Application has been Submitted!"
        
    Else
       '此处可添加取消操作的逻辑
    End If
    
    '先关闭文档和Excel,再释放对象
    doc.Close SaveChanges:=False '根据需求设置是否保存
    xlwb.Save '保存Excel修改
    xlApp.Quit
    
    '释放对象
    Set sh = Nothing
    Set xlwb = Nothing
    Set xlApp = Nothing
    Set tbl = Nothing
    Set tbl2 = Nothing
    Set tbl8 = Nothing
    Set doc = Nothing
    
End Sub

内容的提问来源于stack exchange,提问作者Jarvis Davis

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 00:35:54