Vba ActiveVBProject.References在.FullPath中出错

Vba ActiveVBProject.References在.FullPath中出错,vba,excel,Vba,Excel,我们有一个模块,用于检查机器信息以进行故障排除。其中一个子模块检查每个参考有无中断。但是,对于单个引用,Microsoft Office Soap Library 3.0会在出现错误时暂停 我们可以解决这个问题,但我很想知道是什么导致了这个错误。引用是有效的,没有被破坏。引用对象的方法在此库中失败 对象“引用”的方法“完整路径”失败 Private子geteachhref() Dim ref作为变量 作为字符串的Dim stref “在错误恢复下一步我遇到了这个帖子,因为我自己也遇到了同样的错误

我们有一个模块,用于检查机器信息以进行故障排除。其中一个子模块检查每个参考有无中断。但是,对于单个引用,Microsoft Office Soap Library 3.0会在出现错误时暂停

我们可以解决这个问题,但我很想知道是什么导致了这个错误。引用是有效的,没有被破坏。引用对象的方法在此库中失败

对象“引用”的方法“完整路径”失败

Private子geteachhref()
Dim ref作为变量
作为字符串的Dim stref

“在错误恢复下一步我遇到了这个帖子,因为我自己也遇到了同样的错误

我已经能够跟踪您的问题,如下所示:

  • 返回的错误号为:-2147319779

  • 代码编译时不会出错

  • (如帖子中所述)引用有效,未被破坏 (意思是当您检查所列的参考资料时,参考资料 未列为“缺失”,或者如果通过VBA检查,则未列为“损坏”)

  • 我在其他论坛上也读过一些帖子,其中甚至有代码/VBA 应用程序(MsAccess)在“一台”PC中实际运行时没有问题 (PC 01)并在另一台PC(PC 02)中返回“错误”

  • 我自己也能复制这种现象

  • 在比较了PC 01和PC 02之后,您会发现两台PC都可能 实际安装了MsAccess/Excel的“相同”精确版本+ 已安装相同的MsAccess(或Office)Service Pack,但一旦开始测试每个应用的修补程序(这可能是 漫长的过程),您会发现一些DLL实际上没有被替换/修补、更新

在我的例子中,那些受影响的PC(不会运行代码,因此会产生错误),每个都有不同的原因(不同的,未正确更新的dll),因此没有“通用”替换以下dll来修复问题

尽管如此,还是有一个解决方案(已经足够解释了):

第一种解决方案(最小侵入性)
  • 修复MsAccess/Office安装

  • 完成后,重新应用最新Service Pack+所有Office更新

“某些PC”中的这种解决方案解决了这个问题,即VBA代码运行没有问题

  • 如果修复MsAccess/Excel/Office安装失败(由于错误 2424、2425或修复失败),然后继续解决Nmr。2(否) 双关语(D)
第二种解决方案(中间组)
  • 完全卸载MsOffice(包括所有更新、服务包等)
  • 卸载完成后需要重新启动
  • 卸载过程完成且电脑重新启动后,再次安装MsOffice(包括所有更新、Service Pack等)
这个解决方案实际上适用于我发现的另一个受影响的PC子集

  • 如果MsAccess/Excel/Office卸载失败(由于相同的原因) 以前的错误2424、2425或修复失败等),然后继续 溶液核磁共振。3(核选择)
第三种解决方案(核方案)
  • 下载并安装“Microsoft Office 2010修复工具”(或适用于您的情况的版本)

  • 运行工具以完全删除MsOffice 2010。完成后(PC将 工具完成清理/卸载后需要重新启动)

  • 在MsOffice 2010(或可能适用于您的电脑的版本)之后重新启动电脑 情况)已完成移除(此步骤非常重要)

  • 再次安装MsOffice/MsAccess/Excel 2010(或适用于您的情况的版本)

  • 安装语言包(如果需要)

  • 安装最新的Service Pack,即Service Pack 1、Service Pack 2等

这个解决方案实际上修复了我的第三组受影响的PC。不过,在“干净”安装MsOffice后,一些PC出现了不同的错误:

Ms Access/Excel无法打开以前的应用程序

此错误仅在通过第三个选项的PC上发现(虽然MsOffce和MsAccess“似乎”工作得很好,甚至本帖中描述的原始“问题”也是“修复”的,这意味着在没有对象引用的“FullPath”方法的情况下运行的代码出现了失败问题,但“新”问题被发现为那些“最新”安装的MsOffice(2010年及以后)应用更新/服务包似乎不同于通信更新,而不是干净安装+最新更新/服务包

4rth选项-捕获错误 我使用与示例相同的代码(见上文),并插入一个“错误捕获”部分,如下所示(我复制整个代码并粘贴完整的模块,包括错误捕获部分):

Private子geteachhref()
错误时转到GeteAchhref\u Err
Dim ref作为变量
作为字符串的Dim stref
'出错时继续下一步
Private Sub getEachRef()
错误时转到GeteAchhref\u Err
Dim ref作为变量
作为字符串的Dim stref
对于Application.VBE.ActiveVBProject.References中的每个ref
frmAbout.lst_About.AddItem“[参考]”和参考说明

frmAbout.lst_About.List(frmAbout.lst_About.ListCount-1,1)=ref.FullPath'
引用是有效的,没有中断。
您是如何验证的?您可以手动检查它吗?引用对象有一个方法.isbreak,它返回一个布尔语句,在本例中为false。它还有一个名称值和描述。所有这些都是有效的,只有.FullPath返回一个错误。此外,您我可以在vba编辑器的“开发”窗口的“工具->引用”中看到您的引用。在“工具引用”窗口中,您可以在下面的框架中看到完整路径吗?@SiddharthRout是的,我可以。@Andre不幸的是,否。它超出了范围,我们丢弃了它。我对此不屑一顾。我怀疑windows如何处理存储所有这些信息的注册表项在最近的一次(di)之后
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
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
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