打开 Word 文档运行时错误"424":需要对象



我在Access数据库中有一组函数,我在该数据库中基于文件夹中的固定模板生成Word文档。

我使用下面显示的函数来执行此操作。为了便于维护,我希望能够在模块开始时将Word模板路径定义为公共常量。因此,我一直在尝试创建下面的调整函数。

原始功能:

Function MyFunc(rs as DAO.Recordset)
Dim objWord As Object
Dim objDoc As Object
...
Set objWord = CreateObject("Word.Application")
Set objDoc = objWord.Documents.Open("C:test_template.docx")
...
End Function

调整后的功能:

Public Const ReminderOneTemplate As Variant = "C:test_template.docx"
...
Function MyFunc(rs as DAO.Recordset)
Dim objWord As Object
Dim objDoc As Object
...
Set objWord = CreateObject("Word.Application")

对于下一行代码中的Word.Documents.Open方法,我已经尝试过了:

Set objDoc = objWord.Documents.Open(ReminderOneTemplate)
...
End Function

Set objDoc = objWord.Documents.Open(Chr(34) & ReminderOneTemplate & Chr(34))
...
End Function

但是函数一直返回运行时错误"424"当我使用常量作为Word.Documents.Open方法的输入时,需要Object。

有人能解释为什么会这样,以及我做错了什么吗。是否不能将常量传递给Word.Open方法?

谢谢。

我重构了您的函数,使用以下子过程来测试创建Word实例的基本代码,然后使用文档名称的常量打开现有文档。

我使用Office2007来测试代码,一切都很好。我看不出你的代码有什么问题,你使用的是什么版本的Access和Word?注意,我添加了一些代码来测试调用CreateObject是否实际为objWord变量赋值。我建议两件事来帮助解决您遇到的问题:1.使用字符串作为文件名。我知道Documents集合的Open方法的文档中说filename参数是Variant,但如果它是String,代码似乎工作得更好。2.确保将Word实例设置为可见,否则会使系统中出现不可见的Word实例(不会在任务管理器中列出),而清除这些实例的唯一方法是重新启动计算机。如果Word实例可见,则可以切换到该实例并查看Word是否显示任何错误消息。

您可能会注意到,我的代码打开的Word文档是一个启用了宏的.docm文件。我这样做是因为我测试了一个带有导致运行时错误的Open事件处理程序的文档是否会在Access中的代码中显示错误消息,但它不会。

当我第一次使用声明为Variant的常量运行代码时,我确实收到了一个错误,但没有收到导致问题的Object必需错误。然后我注意到,当我在Word中重新打开Word文档时,我从Word收到一条错误消息,"上次打开此文档时,它导致了一个严重错误,你确定要继续打开该文档吗?"我建议你确保可以在Word中打开Word文档,而不会出现错误或问题。我还建议您添加与下面示例中类似的代码,以确保objWord变量确实是由CreateObject方法初始化的——如果CreatObject未能创建Word的实例,那么objWord仍将为Nothing,然后可能会产生对象所需的运行时错误。(注册表中的问题可能会使CreateObject失败。)

我真的很抱歉,但我不知道你为什么会犯这样的错误。我认为,如果您将常量重新声明为String,并确保Word实例可见,那么您的代码就可以工作了!测试时我遇到的唯一问题是,在添加代码使Word实例可见之前,文档无法打开。但我并没有遇到你正在努力克服的错误。

我已经为这类任务开发了一个Access VBA代码库——使用Access中的代码创建Word、Excel实例,并打开文档和工作表。如果您想查看一个代码库,该代码库旨在为MS Office应用程序之间的互操作性提供易于调用的过程和功能,您可以从这里下载:[http://www.didjiman.com/business/vbademo/libMSOffice.htm]从2003年到2016年,库中的代码已经过测试,可以在MS Office的所有版本中使用,并在Gnu公共许可证下向公众发布。该代码位于zip档案中,其中包含一个包含所有代码的Access.accdb文件、一个讨论功能和过程以及如何使用它们的PDF文档,以及完整的代码列表。

Public Const ReminderOneTemplate As String = "C:usersmatthewdocumentstemptest document1.docm"
Sub testWord_DocOpen()
Dim objWord As Object
Dim objDoc As Object
Set objWord = CreateObject("Word.Application")
objWord.Visible = True  'make the Word application window visible
objWord.Application.WindowState = 1    'maximize the Word application window
If (objWord Is Nothing) Then
Debug.Print "Word object NOT initialized."
End If
Set objDoc = objWord.Documents.Open(ReminderOneTemplate)
End Sub

最新更新