Ошибка времени открытия документа Word «424»: требуется объект - PullRequest
0 голосов
/ 24 января 2019

У меня есть набор функций в базе данных 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.

Может кто-нибудь объяснить, почему это так и что я делаю неправильно. Разве невозможно передать константу в метод Word.Open?

Спасибо.

1 Ответ

0 голосов
/ 26 января 2019

Я произвел рефакторинг вашей функции, используя следующую подпроцедуру для проверки основного кода создания экземпляра Word, а затем открыв существующий документ с использованием константы для имени документа.

Я использовал Office 2007 для тестированиякод, и все работало нормально.Я не вижу ничего плохого в вашем коде, какую версию Access и Word вы используете?Обратите внимание, что я добавил некоторый код, чтобы проверить, действительно ли переменной objWord присвоено значение при вызове CreateObject.Я бы предложил две вещи, которые помогут решить проблему, с которой вы столкнулись: 1. используйте строку для имени файла.Я знаю, что документация для метода Open коллекции Documents говорит, что аргумент имени файла является Variant, но, похоже, код работает лучше, если это String.2. Убедитесь, что экземпляр Word установлен как видимый, иначе вы загромождаете свою систему невидимыми экземплярами Word (которые не будут перечислены в диспетчере задач), и единственный способ избавиться от них - перезагрузить компьютер.Если экземпляр Word видим, вы можете переключиться на него и посмотреть, выводит ли Word какие-либо сообщения об ошибках.

Вы можете заметить, что документ Word, который открывает мой код, является файлом с поддержкой макросов .docm.Я сделал это потому, что проверил, будет ли документ с обработчиком событий Open, вызывающий ошибку времени выполнения, отображать сообщение об ошибке в коде в Access, но это не так.

Когда я впервые запускал код сконстанту, объявленную как вариант, я получил ошибку, но не требуется объект Требуется ошибка, которая вызывает у вас проблему.Затем я заметил, что когда я снова открыл документ Word в Word, я получил сообщение об ошибке от Word о том, что «в последний раз, когда этот документ открывался, это вызвало серьезную ошибку, вы уверены, что хотите продолжить открывать документ?"Я бы посоветовал вам убедиться, что вы можете открыть свой документ Word в Word без ошибок или проблем.Я также предлагаю вам добавить код, аналогичный тому, который был у меня в приведенном ниже примере, чтобы убедиться, что переменная objWord действительно инициализируется методом CreateObject - если CreatObject не может создать экземпляр Word, тогда objWord все равно будет Nothing, иможет привести к ошибке объекта во время выполнения.(проблемы в Реестре могут привести к сбою CreateObject.)

Мне очень жаль, но я понятия не имею, почему вы получаете ошибку, которую получаете.Я думаю, что если вы переопределите константу как строку и убедитесь, что вы делаете экземпляр 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...