.FullPath中的ActiveVBProject.References错误

时间:2015-06-04 16:50:37

标签: excel vba excel-vba

我们有一个模块可以检查机器信息以进行故障排除。其中一个子模块检查每个参考是否有中断。但是,对于单个引用,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

2 个答案:

答案 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代码运行没有问题。

  • 如果修复MsAccess / Excel / Office安装失败(由于错误) 2424、2425或修复失败),然后继续解决方案Nmr。 2(否 双关语:D)

第二种解决方案(中间组侵入性)

  • 完全卸载MsOffice(包括所有更新,Service Pack等)
  • 卸载完成后,将需要重新启动。
  • 卸载过程完成并且PC重新启动后,然后再次安装MsOffice(包括所有更新,Service Pack等)

此解决方案实际上在我发现的受影响的PC的另一子集中有效。

  • 如果MsAccess / Excel / Office卸载失败(由于相同的原因) 先前的错误2424、2425或修复失败等),然后继续执行 解决方案Nmr。 3(核选项)

第三种解决方案(核选项)

此解决方案实际上修复了我拥有的第三组受影响的PC。话虽如此,但在“干净”安装MsOffice之后,某些PC出现了另一个错误:

Access / Excel女士无法打开您以前的应用程序。

仅在经过第3个选件的PC上发现了此错误(尽管MsOffce和MsAccess的“似乎”工作正常,而且此发布中所述的原始“问题”也已“修复”,这意味着代码可以运行没有对象引用的方法“ FullPath”失败的问题,则发现了“新”问题,因为MsOffice的那些“最新”安装(2010年及更高版本)似乎应用了与累积更新不同的更新/服务包,而全新安装+最新更新/服务包。

第4个选项-捕获错误

我使用的代码与示例相同(请参见上文),并按如下所示插入“错误陷阱”部分(我正在复制整个代码,并粘贴包含错误陷阱部分的完整模块):

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