MS Word引用不是函数| 自动化错误 – 库未注册| 错误-2147319779(8002801d)

上下文

我使用Excel中的Word打开文档并更新其中的链接。

起初,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这样的variables的声明似乎不会引起任何问题…

 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


testing解决问题

testing1:手动添加引用到库

我想尝试以下方法:

  1. 在VB项目中,查看“Microsoft Word”参考文件的位置
    (对于我来说, C:\Program Files (x86)\Common Files\microsoft shared\OFFICE15\MSWORD.OLB
  2. 删除对“Microsoft Word”的引用
  3. closures并保存项目
  4. 转到文件的引用文件夹并在控制台中运行regsvr32 MSWORD.OLB
  5. 重新打开该项目,重新添加对“Microsoft Word”的引用

但同时(在1和4之间),文件的引用MSWORD.OLB已经消失! O_O

我重新启动并检查,我的隐藏文件是可见的,所以我只是不知道该怎么办!
还有另一种方法来恢复图书馆? 还是强制加载呢?

我再次重新启动,这次引用的path更改为C:\Program Files (x86)\Microsoft Office\Office15\MSWORD.OLB ,所以引用似乎工作,但我在同一行上有相同的错误。

显然regsvr32 onlt适用于DLLOCX ,所以我不能手动添加引用。

testing2:修复Office安装

我已经修复了Office安装,但在同一行上出现同样的问题…

testing3:从cmd开始,并添加到PATH环境variables

正如@S Meaden所说,我尝试从命令行打开Word:

在一个随机path中:
winword.exe /automationwinword.exewinword /automationwinword'winword.exe.' is not recognised 'winword.exe.' is not recognised
但是start winwordstart winword /automation工作顺利。

我试过"C:\Program Files (x86)\Microsoft Office\Office15\winword.exe" /r强制注册,但它没有改变一件事…

而在正确的道路上:
所有的命令运行顺利!

然后,我将pathC:\Program Files (x86)\Microsoft Office\Office15\到PATH环境variables中:
之后,所有的命令工作,但我仍然在VBA中得到相同的错误…

testing4:Windowsregistry和其他版本的Office

我的电脑上只有一个MS Office版本,并没有升级或任何东西。

我仍然在Windowsregistry中确认,但没有任何其他版本的参考!

我刚刚发现为14版(我有15,Office 2013)引用的策略值,所以我备份并删除它。 但没有改变,所以我重新添加它!

testing5:强制从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 

但它并没有改变一个事物…

testing6

仍然期待着尝试…


该引用再次指向一个现有的文件,
Word仍然function齐全
但我昨天工作的代码现在正在出错:

 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 

好的,让我在评论中给出一些build议。 所以我们需要检查你的COMpipe道。 当您使用VBA.CreateObject("Word.Application")创build一个COM对象时,在registry中心会有一系列事件,您应该使用RegEdit仔细检查。

NB我正在运行Windows 8.1和我的Word是版本15,你也许不同。

首先在HKEY_CLASSES_ROOT下查找string,我可以在这里find我的registry代码

 [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")应该parsing为相同的。]从这我们有Word应用程序的CLSID ,它是{000209FF-0000-0000-C000-000000000046} 。 所以我下次去找那个钥匙

我首先在HKEY_CLASSES_ROOT\CLSID下searchHKEY_CLASSES_ROOT\CLSID ,在32位的世界里,所有的类都可以find,但是不在那里,因为对于我来说,它是一个64位的替代键HKEY_CLASSES_ROOT\Wow6432Node\CLSID\

您应该在32位密钥或64位密钥下findCLSID 。 在这个键下你应该find一些重要的LocalServer32的子键,并且在那里find服务器可执行文件的path(对于Word和用户应用程序的可执行文件相同)。 对我来说这是

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

所以,现在从命令行我可以运行testing启动使用COM的Word。

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

你应该跟踪相同的调用链并解决任何问题。 请给予反馈。

如果这个工作,然后检查你的variables声明。 如果一个案例使用了Early-binding,另一个使用了后期绑定,试验并查看是否有行为/错误的变化。

更新:我GOOGLE了你的错误号码,但你得到更好的结果,如果你使用它相当于8002801Dhex,很多链接通过那里看,

Google错误8002801D

好的,从你的评论反馈来看,很高兴后期的绑定工作,这certificate了COMpipe道的方面,它把types库的责任归咎于错误信息直观。 我很高兴我们有相同的版本,所以我们可以共享registry的另一个片段。 因此,出现在VBA IDE的Tools-> References对话框中的types库是基于HKEY_CLASSES_ROOT\TypeLib下面我们都使用registry的types库的详细信息,如下所示

 [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矿的位置有所不同(正如另一位评论者Vincent G)

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

所以也许这是你问题的根源。