Vba 运行时错误1004';工作表';对象的全局性

Vba 运行时错误1004';工作表';对象的全局性,vba,excel,ms-word,Vba,Excel,Ms Word,我一直在使用word文档中的宏将Excel工作簿中的数据输入到该MS word文档中 该例程提示您查找存储数据的excel工作簿,然后从工作簿中复制字段,在word文档文本中查找项目,然后将其替换为word文档文本 以下代码正在运行,但偶尔会出现运行时错误。现在每次执行都会出现以下错误 对象“U全局”的运行时错误“1004”方法“工作表”失败 它由以下行触发: .Replacement.Text=工作表(“1-组织服务区”).范围(“B3”).值“插入组织名称” 代码要长得多,但这里是想法。该错

我一直在使用word文档中的宏将Excel工作簿中的数据输入到该MS word文档中

该例程提示您查找存储数据的excel工作簿,然后从工作簿中复制字段,在word文档文本中查找项目,然后将其替换为word文档文本

以下代码正在运行,但偶尔会出现运行时错误。现在每次执行都会出现以下错误

对象“U全局”的运行时错误“1004”方法“工作表”失败

它由以下行触发:

.Replacement.Text=工作表(“1-组织服务区”).范围(“B3”).值“插入组织名称”

代码要长得多,但这里是想法。该错误在如下所示的第一个子系统上触发

Sub InputContractData()
'
' You must pick Microsoft Excel Object Library from Tools>References
' in the Visual Basic editor to execute Excel commands.

' InputContractData Macro
'
'

'Define Excel and Workbook Information
Dim objExcelApp As Excel.Application
Dim objCDCDataWorkbook As Workbook
Dim CDCDataFile
Dim CDCDataFilePath
Dim CDCDataFileName

'Define Word and Document Information
Dim objWordApp As Word.Application
Dim objWordDoc As Word.Document

'Open Excel Program
Set objExcelApp = New Excel.Application

Set objWordApp = Word.Application
Set objWordDoc = objWordApp.ActiveDocument
objExcelApp.Visible = True
objWordApp.Visible = True
CDCDataFile = objExcelApp.GetOpenFilename("Excel Files (*.xlsx), *xlsx")
Set objCDCDataWorkbook = objExcelApp.Workbooks.Open(CDCDataFile)
CDCDataFilePath = Left(CDCDataFile, InStrRev(CDCDataFile, "\"))

CDCDataFileName = Dir(CDCDataFile)

Call Sheet001



'Save Document in same folder as CDC Workbook
   objWordDoc.SaveAs CDCDataFilePath & "\DraftContract.docx"

' Close the new Word document.
    objWordApp.ActiveDocument.Close
' Close the Word application.
    objWordApp.Quit

End Sub




Sub Sheet001()
'Sheet 1- Organization Service Area -----------------------------
 With Selection.Find
    .ClearFormatting
    .Text = "[[ORGANIZATION]]"
    .Replacement.ClearFormatting
    .Replacement.Text = Worksheets("1- Organization Service Area").Range("B3").Value 'Insert Organization Name
    .Execute Replace:=wdReplaceAll, Forward:=True, _  
     Wrap:=wdFindContinue
 End With
End Sub

问题在于:

.Replacement.Text = Worksheets("1- Organization Service Area").Range("B3").Value 'Insert Organization Name
MS Word不知道工作表是什么,因为它不是Word对象模型中的本机对象

如果将对象显式指定给其正确的父对象,它将一直工作。由于
工作表
是Excel中的对象,因此将其完全限定为Excel对象。我在下面展示了这一点,并选择将Excel工作簿传递到sub,因为您在
InputContractData
过程中本地定义了变量

Sub Sheet001(ws as Excel.Worksheet)
'Sheet 1- Organization Service Area -----------------------------
 With Selection.Find
    .ClearFormatting
    .Text = "[[ORGANIZATION]]"
    .Replacement.ClearFormatting
    .Replacement.Text = ws.Range("B3").Value 'Insert Organization Name
    .Execute Replace:=wdReplaceAll, Forward:=True, _  
     Wrap:=wdFindContinue
 End With

End Sub
然后这样称呼:

Sheet001 objExcelApp.Workbooks(CDCDataFileName).Worksheets("1- Organization Service Area")

在抛出此错误时,调试器会突出显示哪一行?.Replacement.Text=工作表(“1-组织服务区域”).Range(“B3”).Value“插入组织名称”您应该在问题中包含类似的基本信息;注释可能随时消失。您创建了excel应用程序对象的新实例,并在该新实例中打开了工作簿,但您依赖的是
选择
(它依赖于同一应用程序实例中的activeworkbook)要在Sheet001中执行操作,请从文档模板通过MS Word运行宏,打开excel应用程序,以便访问数据。在新实例上没有后续操作。我打开excel两次了吗?返回的参数在Call Sheet001上不是可选的哪一行准确地确保您的工作表被命名为“1-组织服务区”。我从理论上理解解决方案,但问题是每个工作表都有一个子表(40多个工作表)每个子系统从excel表格中提取数据,并多次将其粘贴到Word中。例如:
每个工作表都有一个子表(40多个工作表)
。。我建议重构您的代码,创建一个过程,在所有40个工作表上完成所需的工作,只传递可变部分(工作表、范围、字符串等)。