Ссылка MS Word не работает | Ошибка автоматизации - Библиотека не зарегистрирована | Ошибка -2147319779 (8002801d)

контекст

Я использую Word из Excel для открытия документов и обновления ссылок в них.

Сначала Word открывал и открывал документы, но я получил сообщение об ошибке:

For Each aField In oDoc.Fields

После попытки просто снять отметку, а затем снова проверьте ссылку "Microsoft Word",
У меня тоже была такая же ошибка на:
Set oW = VBA.GetObject(, "Word.Application") а также
Set oW = VBA.CreateObject("Word.Application")

И все же объявления переменных вроде oW As Word.Application кажется, не вызывает никаких проблем...

Dim oW As Word.Application, _
    oDoc As Word.Document, _
    aField As Word.Field, _
    aIs As Word.InlineShape, _
    aSh As Word.Shape, _
    fCt As Integer, _
    isCt As Integer, _
    i As Integer, _
    NewFile As String, _
    TotalType As String

On Error Resume Next
Set oW = VBA.GetObject(, "Word.Application") '<-- Error after trying
On Error GoTo 0
If oW Is Nothing Then Set oW = VBA.CreateObject("Word.Application") '<-- Error after trying

NewFile = Dir(FolderToScan & "*." & FileExtensionWOpoint)

Do While NewFile <> vbNullString
    Set oDoc = oW.Documents.Open(FolderToScan & NewFile)
    fCt = oDoc.Fields.Count
    isCt = oDoc.InlineShapes.Count

    For Each aField In oDoc.Fields    '<-- 1st error

Err.Number = -2147319779
Err.HelpContext = 1000440
Err.Description = Ошибка автоматизации - библиотека не зарегистрирована.
Err.Source = VBAProject
Err.HelpFile = C: \ PROGRA ~ 2 \ COMMON ~ 1 \ MICROS ~ 1 \ VBA \ VBA7.1 \ 1036 \ VbLR6.chm
Err.LastDllError = 0


Тесты для решения проблемы

Тест 1: вручную добавить ссылку на библиотеку

Я хотел попробовать следующее:

  1. В проекте VB посмотрите, где находится файл для ссылки "Microsoft Word".
    (для меня, C:\Program Files (x86)\Common Files\microsoft shared\OFFICE15\MSWORD.OLB)
  2. Удалить ссылку на "Microsoft Word"
  3. Закрыть и сохранить проект
  4. Перейдите в папку ссылки на файл и запустите regsvr32 MSWORD.OLB в консоли
  5. Повторно откройте проект, повторно добавьте ссылку на "Microsoft Word"

Но в то же время (между 1. и 4.), ссылка на файл MSWORD.OLB исчез!!!! о_О

Я перезагрузился и проверил, и мои скрытые файлы видны, так что я просто не знаю, что делать!!!
Есть ли другой способ восстановить библиотеку? Или заставить его загружать?

Я снова перезагрузился, и на этот раз путь ссылки изменился на C:\Program Files (x86)\Microsoft Office\Office15\MSWORD.OLBТаким образом, ссылка, кажется, работает, но у меня та же ошибка в тех же строках.

По-видимому regsvr32 онлт работает на DLL а также OCX, поэтому я не мог вручную добавить ссылку.

Тест 2: Ремонт офисной установки

Я восстановил установку Office, но та же проблема на тех же линиях...

Тест 3: Запустите из cmd и добавьте в переменную окружения PATH

Как подсказал @S Meaden, я попытался открыть Word из командной строки:

По случайному пути:
winword.exe /automation, winword.exe, winword /automation а также winword сказать 'winword.exe.' is not recognised
Но start winword а также start winword /automation работать гладко

я пробовал "C:\Program Files (x86)\Microsoft Office\Office15\winword.exe" /r заставить регистрацию, но это ничего не изменило...

И на правильном пути:
Все команды работают без сбоев!

Затем я добавил путь C:\Program Files (x86)\Microsoft Office\Office15\ в переменную окружения PATH:
После этого все команды работают, но я все равно получаю ту же ошибку в VBA...

Тест 4: реестр Windows и другие версии Office

У меня есть только одна версия MS Office на моем компьютере, и она не обновлялась или что-то еще.

Я все еще проверяю в реестре Windows, чтобы быть уверенным, но нет никакой ссылки на любую другую версию!

Я только что нашел значение Политики, на которое ссылались для версии 14 (у меня 15, Office 2013), поэтому я создал его и удалил. Но без изменений, поэтому я снова добавлю это!

Тест 5: принудительная регистрация из cmd

Я попытался принудительно зарегистрировать Excel и Word:

"C:\Program Files (x86)\Microsoft Office\Office15\winword.exe" /r
"C:\Program Files (x86)\Microsoft Office\Office15\winword.exe" /regserver
"C:\Program Files (x86)\Microsoft Office\Office15\excel.exe" /r
"C:\Program Files (x86)\Microsoft Office\Office15\excel.exe" /regserver

но это ничего не изменило...

Тест 6

Все еще ищу что-нибудь, чтобы попробовать...


Вопрос

Ссылка снова указывает на существующий файл,
Слово все еще полностью функционально
но мой код, который работал вчера, теперь содержит ошибку:

Set oW = VBA.GetObject(, "Word.Application")
Set oW = VBA.CreateObject("Word.Application")

Err.Number = -2147319779
Err.HelpContext = 1000440
Err.Description = Ошибка автоматизации - библиотека не зарегистрирована.
Err.Source = VBAProject
Err.HelpFile = C: \ PROGRA ~ 2 \ COMMON ~ 1 \ MICROS ~ 1 \ VBA \ VBA7.1 \ 1036 \ VbLR6.chm
Err.LastDllError = 0

Кто-нибудь знает способ обойти?


Простой WorkAround (не исправлено)

Мне кажется, что использование Late Binding помогает мне, но даже если мне интересно, почему, я просто рад этой работе снова!

Теперь мои объявления выглядят так:

Dim oW As Object, _
    oDoc As Object, _
    aField As Object, _
    aIs As Object, _
    aSh As Object, _
    fCt As Integer, _
    isCt As Integer, _
    i As Integer, _
    NewFile As String, _
    TotalType As String
'' Instead of :
'Dim oW As Word.Application, _
    oDoc As Word.Document, _
    aField As Word.Field, _
    aIs As Word.InlineShape, _
    aSh As Word.Shape, _
    fCt As Integer, _
    isCt As Integer, _
    i As Integer, _
    NewFile As String, _
    TotalType As String

1 ответ

Решение

Хорошо, позвольте мне формализовать некоторые советы, приведенные в комментариях. Так что нам нужно проверить вашу COM сантехнику. Когда вы создаете COM-объект с VBA.CreateObject("Word.Application") существует последовательность событий, центрированных в реестре, и вы должны перепроверить, используя RegEdit,

NB Я использую Windows 8.1, и у меня Word версии 15, у вас, возможно, другая.

Сначала строка ищется в улье HKEY_CLASSES_ROOT, и я могу найти мой вот фрагмент реестра, демонстрирующий

[HKEY_CLASSES_ROOT\Word.Application]
@="Microsoft Word Application"

[HKEY_CLASSES_ROOT\Word.Application\CLSID]
@="{000209FF-0000-0000-C000-000000000046}"

[HKEY_CLASSES_ROOT\Word.Application\CurVer]
@="Word.Application.15"

[Так на самом деле мы можем это указывает VBA.CreateObject("Word.Application") а также VBA.CreateObject("Word.Application.15") должен решить то же самое.] Из этого мы имеем CLSID для приложения Word, это {000209FF-0000-0000-C000-000000000046}, Поэтому я в следующий раз ищу этот ключ.

Я ищу CLSID во-первых под HKEY_CLASSES_ROOT\CLSID где в 32-битном мире все классы были бы найдены, но его там нет, потому что для меня это 64-битный альтернативный ключ, HKEY_CLASSES_ROOT\Wow6432Node\CLSID\

Вы должны найти CLSID либо под 32-битным ключом, либо под 64-битным ключом. Под этим ключом вы должны найти несколько подразделов, жизненно важный LocalServer32 и там находится путь к исполняемому файлу сервера (который для Word совпадает с исполняемым файлом пользовательского приложения). Для меня это

[HKEY_CLASSES_ROOT\Wow6432Node\CLSID\{000209FF-0000-0000-C000-000000000046}\LocalServer32]
@="C:\\Program Files\\Microsoft Office 15\\Root\\Office15\\WINWORD.EXE /Automation"

Так что теперь из командной строки я могу запустить, чтобы проверить запуск Word с помощью COM.

C:\Program Files\Microsoft Office 15\Root\Office15\WINWORD.EXE /Automation

Вы должны проследить ту же цепочку вызовов и решить любые проблемы. Пожалуйста, дайте отзыв.

Если это работает, то проверьте объявление вашей переменной. Поэкспериментируйте и посмотрите, есть ли изменение поведения / ошибки, если в одном случае используется раннее связывание, а в другом - позднее.

ОБНОВЛЕНИЕ: Я погуглил ваш номер ошибки, но вы получите намного лучшие результаты, если вы используете его в шестнадцатеричном эквиваленте 8002801D, множество ссылок для просмотра там,

Ошибка Google 8002801D

Хорошо, из вашего комментария, рад, что поздняя привязка работает, это доказывает, что этот аспект COM-соединения и обвиняет библиотеку типов как интуитивно понятную из сообщения об ошибке. Я рад, что у нас такая же версия, чтобы мы могли поделиться другим фрагментом реестра. Таким образом, библиотеки типов, которые появляются в диалоге Tools->References в VBA IDE, основаны на подробностях в HKEY_CLASSES_ROOT\TypeLib для библиотеки типов мы оба используем мой реестр говорит следующее

[HKEY_CLASSES_ROOT\TypeLib\{00020905-0000-0000-C000-000000000046}]

[HKEY_CLASSES_ROOT\TypeLib\{00020905-0000-0000-C000-000000000046}\8.6]
@="Microsoft Word 15.0 Object Library"
"PrimaryInteropAssemblyName"="Microsoft.Office.Interop.Word, Version=15.0.0.0, Culture=neutral, PublicKeyToken=71E9BCE111E9429C"

[HKEY_CLASSES_ROOT\TypeLib\{00020905-0000-0000-C000-000000000046}\8.6\0]

[HKEY_CLASSES_ROOT\TypeLib\{00020905-0000-0000-C000-000000000046}\8.6\0\Win32]
@="C:\\Program Files\\Microsoft Office 15\\Root\\Office15\\MSWORD.OLB"

[HKEY_CLASSES_ROOT\TypeLib\{00020905-0000-0000-C000-000000000046}\8.6\Flags]
@="0"

[HKEY_CLASSES_ROOT\TypeLib\{00020905-0000-0000-C000-000000000046}\8.6\HelpDir]
@="C:\\Program Files\\Microsoft Office 15\\Root\\Office15\\"

Таким образом, мы различаемся в отношении расположения MSWORD.OLB мой в (как и другие комментаторы, Винсент Дж)

C:\\Program Files\\Microsoft Office 15\\Root\\Office15\\MSWORD.OLB

Так что, возможно, это корень вашей проблемы.

Другие вопросы по тегам