我们有一个模块可以检查机器信息以进行故障排除。其中一个子模块检查每个参考是否有中断。但是,对于单个引用,Microsoft Office Soap Library 3.0会因错误而停止。
我们可以解决它,但我真的很想知道造成这个错误的原因。引用有效,而不是破坏。参考对象的方法对于这个库来说就是失败了。
对象'Reference'的方法'FullPath'失败
Private Sub getEachRef()
Dim ref As Variant
Dim strRef As String
'On Error Resume Next <- this allows the rest of the code to complete
For Each ref In Application.VBE.ActiveVBProject.References
frmAbout.lst_About.AddItem "[Reference] " & ref.Description
frmAbout.lst_About.List(frmAbout.lst_About.ListCount - 1, 1) = ref.FullPath <- error is here
If ref.IsBroken = True Then
frmAbout.lst_About.List(frmAbout.lst_About.ListCount - 1, 2) = "Broken Link"
End If
Next
End Sub
答案 0 :(得分:2)
我遇到这个帖子是因为我自己遇到了同样的错误。
我已经能够按照以下方式跟踪您的问题的问题:
返回的错误号为:-2147319779
代码编译没有错误
(如发布中所述)该引用有效,未损坏 (这意味着当您检查列出的参考文献时,这些参考文献 (未)列为“缺少”,或者如果通过VBA检查,则未列为“破损”)
我在其他论坛上也阅读了一些其他帖子,甚至在代码/ VBA上 应用程序(MsAccess)实际上在“一台” PC上运行没有问题 (PC 01)并在另一台PC(PC 02)中返回“错误”
我已经能够复制这种现象。
比较PC 01和PC 02后,您会看到两台PC可能 实际上安装了“相同”的MsAccess / Excel版本+ 安装了相同的MsAccess(或Office)Service Pack,但是一旦您开始测试每个应用的补丁(可以是一个 漫长的过程),您会发现实际上并未替换/修补某些Dll。
在我的情况下,那些受影响的PC(将不会运行代码,从而产生错误),每个PC都有不同的原因(不同的,未正确更新的dll),因此没有“通用”的“替换以下内容” dll修复问题。
但是,有一个解决方案(足够解释):
修复MsAccess / Office安装。
完成后,重新应用最新的Service Pack +所有Office更新。
“某些个人电脑”中的此解决方案解决了该问题,即VBA代码运行没有问题。
此解决方案实际上在我发现的受影响的PC的另一子集中有效。
下载并安装“ Microsoft Office 2010 FixIt工具”(或可能适用于您的情况的版本)https://support.microsoft.com/en-us/office/repair-an-office-application-7821d4b6-7c1d-4205-aa0e-a6b40c5bb88b?ocmsassetid=ha010357402&ctt=1&correlationid=8bfaf910-6d5f-4252-b5bb-0ed67d5d4349&ui=en-us&rs=en-us&ad=us
运行工具完全删除MsOffice 2010。完成后(PC将 该工具完成清理/卸载后需要重新启动)
在MsOffice 2010(或可能适用于您的版本)之后重新启动PC 情况)移除已完成(此步骤非常重要)
再次安装MsOffice / MsAccess / Excel 2010(或可能适用于您的情况的版本)。
安装语言包(如果需要)。
安装最新的Service Pack。 Service Pack 1,Service Pack 2等。
此解决方案实际上修复了我拥有的第三组受影响的PC。话虽如此,但在“干净”安装MsOffice之后,某些PC出现了另一个错误:
Access / Excel女士无法打开您以前的应用程序。
仅在经过第3个选件的PC上发现了此错误(尽管MsOffce和MsAccess的“似乎”工作正常,而且此发布中所述的原始“问题”也已“修复”,这意味着代码可以运行没有对象引用的方法“ FullPath”失败的问题,则发现了“新”问题,因为MsOffice的那些“最新”安装(2010年及更高版本)似乎应用了与累积更新不同的更新/服务包,而全新安装+最新更新/服务包。
我使用的代码与示例相同(请参见上文),并按如下所示插入“错误陷阱”部分(我正在复制整个代码,并粘贴包含错误陷阱部分的完整模块):>
Private Sub getEachRef()
On Error GoTo getEachRef_Err
Dim ref As Variant
Dim strRef As String
'On Error Resume Next <- this allows the rest of the code to complete
For Each ref In Application.VBE.ActiveVBProject.References
frmAbout.lst_About.AddItem "[Reference] " & ref.Description
frmAbout.lst_About.List(frmAbout.lst_About.ListCount - 1, 1) = ref.FullPath '<- error WAS here
getEachRef_Ressume01:
If ref.IsBroken = True Then
frmAbout.lst_About.List(frmAbout.lst_About.ListCount - 1, 2) = "Broken Link"
End If
Next
getEachRef_Exit:
Exit Sub
getEachRef_Err:
Select Case Err.Number
Case -2147319779
getEachRef_Ressume01
Case Else
MsgBox Err.Number & Err.Description
Resume getEachRef_Exit
End Select
End Sub
此代码示例允许现有代码简单地“跳过”“错误”并继续:)。
在我的情况下,在任何新实例上安装了一些具有解决方案1的PC之后,又有一些具有解决方案2和3的PC。由于我在模块中实现了上述“错误陷阱”,因此不再有错误在其他任何地方都生产过。
需要明确的是,在解决方案4中,“错误”不是固定的,而是被绕开并允许代码继续执行循环。
就我而言,我在VBA中添加了更多代码,以显示上述代码中ref.FullPath
的“主要”版本和“次要”版本(无法显示)(因此,至少我可以看看代码绕过了什么。
答案 1 :(得分:1)
Private Sub getEachRef()
On Error GoTo getEachRef_Err
Dim ref As Variant
Dim strRef As String
For Each ref In Application.VBE.ActiveVBProject.References
frmAbout.lst_About.AddItem "[Reference] " & ref.Description
frmAbout.lst_About.List(frmAbout.lst_About.ListCount - 1, 1) = ref.FullPath '<- error WAS here
getEachRef_Ressume01:
If ref.IsBroken = True Then
frmAbout.lst_About.List(frmAbout.lst_About.ListCount - 1, 2) = "Broken Link"
End If
Next
getEachRef_Exit:
Exit Sub
getEachRef_Err:
Select Case Err.Number
Case -2147319779
getEachRef_Ressume01
Case Else
MsgBox Err.Number & Err.Description
Resume getEachRef_Exit
End Select
End Sub