Open Word文档运行时错误“ 424”:必需对象

时间:2019-01-24 12:00:15

标签: access-vba runtime-error constants

我在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

但是当我使用常量作为对Word.Documents.Open方法的输入时,该函数不断返回运行时错误'424'对象。

谁能解释为什么会这样,我在做什么错。不能将常量传递给Word.Open方法吗?

谢谢。

1 个答案:

答案 0 :(得分:1)

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

我使用Office 2007来测试代码,并且一切正常。我没有发现您的代码有什么问题,您使用的是Access和Word的哪个版本?注意,我添加了一些代码来测试是否通过调用CreateObject为objWord变量实际分配了一个值。我建议2件事可以帮助您尝试解决您遇到的问题: 1.使用字符串作为文件名。我知道Documents集合的Open方法的文档说,filename参数是Variant,但是如果它是String,则代码似乎确实工作得更好。 2.确保将Word实例设置为可见,否则您将使用看不见的Word实例(在“任务管理器”中不会列出)的实例使系统混乱,摆脱它们的唯一方法是重新启动计算机。如果Word实例可见,则可以切换到它,然后查看Word是否显示任何错误消息。

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

当我第一次使用声明为Variant的常量运行代码时,确实收到了错误,但没有得到所需的对象错误,这给您带来了麻烦。然后,我注意到,当我在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]该库中的代码已经过测试,可以在所有环境中正常工作。版本的MS Office从2003年到2016年,并根据Gnu公共许可证向公众发布。该代码位于一个zip归档文件中,该归档文件包含一个包含所有代码的Access .accdb文件,以及一个讨论功能和过程以及如何使用它们的PDF文档,以及完整的代码清单。

Public Const ReminderOneTemplate As String = "C:\users\matthew\documents\temp\test 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