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:手动添加引用到库
我想尝试以下方法:
- 在VB项目中,查看“Microsoft Word”参考文件的位置
(对于我来说,C:\Program Files (x86)\Common Files\microsoft shared\OFFICE15\MSWORD.OLB
) - 删除对“Microsoft Word”的引用
- closures并保存项目
- 转到文件的引用文件夹并在控制台中运行
regsvr32 MSWORD.OLB
- 重新打开该项目,重新添加对“Microsoft Word”的引用
但同时(在1和4之间),文件的引用MSWORD.OLB
已经消失! O_O
我重新启动并检查,我的隐藏文件是可见的,所以我只是不知道该怎么办!
还有另一种方法来恢复图书馆? 还是强制加载呢?
我再次重新启动,这次引用的path更改为C:\Program Files (x86)\Microsoft Office\Office15\MSWORD.OLB
,所以引用似乎工作,但我在同一行上有相同的错误。
显然regsvr32
onlt适用于DLL
和OCX
,所以我不能手动添加引用。
testing2:修复Office安装
我已经修复了Office安装,但在同一行上出现同样的问题…
testing3:从cmd开始,并添加到PATH环境variables
正如@S Meaden所说,我尝试从命令行打开Word:
在一个随机path中:
winword.exe /automation
, winword.exe
, winword /automation
和winword
说'winword.exe.' is not recognised
'winword.exe.' is not recognised
但是start winword
, start 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
所以也许这是你问题的根源。