2

我在 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 方法吗?

谢谢。

4

1 回答 1

2

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

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

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

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

我真的很抱歉,但我不知道你为什么会得到你得到的错误。我认为,如果您将常量重新声明为字符串,并确保您使 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:\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
于 2019-01-26T03:39:46.840 回答