Ссылка 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: вручную добавить ссылку на библиотеку
Я хотел попробовать следующее:
- В проекте VB посмотрите, где находится файл для ссылки "Microsoft Word".
(для меня,C:\Program Files (x86)\Common Files\microsoft shared\OFFICE15\MSWORD.OLB
) - Удалить ссылку на "Microsoft Word"
- Закрыть и сохранить проект
- Перейдите в папку ссылки на файл и запустите
regsvr32 MSWORD.OLB
в консоли - Повторно откройте проект, повторно добавьте ссылку на "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, множество ссылок для просмотра там,
Хорошо, из вашего комментария, рад, что поздняя привязка работает, это доказывает, что этот аспект 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
Так что, возможно, это корень вашей проблемы.