【问题标题】:Remove a VBA Project Reference删除 VBA 项目引用
【发布时间】:2022-03-08 09:05:50
【问题描述】:

在 VBA 中,我可以看到 PDFCreator 的三个不同参考。其中一个(见第二张图片)是本地存储的软件版本,它可以工作。我想使用这个参考。

另外两个是对存储在服务器上的版本的引用,它们已损坏(在此阶段,我无权重新安装或删除它们)。

我的问题是,在选择所需的参考(参见第二张图片)并单击“确定”后,它会重置为不正确的参考,如第三张图片所示。

如何覆盖正在发生的事情并选择所需的参考或删除不正确的参考?虽然我无法从服务器上卸载这些版本,但我认为我的 Excel 没有理由需要引用它们。可以将它们从列表中删除吗?


图 1:VBA 项目参考的默认状态(未选择 PDFCreator)

图 2:选择正确的 PDFCreator 版本

图 3:重新打开菜单显示选择了错误的 PDFCreator 版本

【问题讨论】:

  • 有趣,我认为最好尝试late binding 解决此错误
  • 我不明白你为什么不能删除损坏的参考?
  • @brettdj 是否可以以非编程方式删除损坏的引用?鉴于它是一次性的,用代码删除它似乎有点过头了
  • 我建议您按照@Sgdva 的建议使用后期绑定,删除所有引用并通过 AddFromFile 以编程方式添加正确的引用:vbProj.References.AddFromFile "PathToYourDLL"
  • @Sgdva 使用后期绑定有效,干杯

标签: vba excel


【解决方案1】:

您也许可以执行以下操作...

要删除损坏的引用:

Private Sub RemoveBrokenReferences(ByVal Book As Workbook)

'////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Dim oRefS As Object, oRef As Object
'////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

Set oRefS = Book.VBProject.References
For Each oRef In oRefS
    If oRef.IsBroken Then
        Call oRefS.Remove(oRef)
    End If
Next

End Sub

要删除特定的引用:

使用类似的东西:

Call ActiveWorkbook.VBProject.References.Remove(oReference)

您可以从以下位置获取 oReference:

Private Function GetReferenceFromPath(ByVal FilePathName As String) As Object

'////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Dim oFs As Object, oReferenceS As Object, oReference As Object
Dim sFileName  As String, sRefFileName As String
'////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

Set oFs = Interaction.CreateObject("Scripting.FileSystemObject")

sFileName = oFs.GetFileName(FilePathName)
Set oReferenceS = ActiveWorkbook.VBProject.References
For Each oReference In oReferenceS
    sRefFileName = oFs.GetFileName(oReference.FullPath)
    If StrComp(sFileName, sRefFileName, vbTextCompare) = 0 Then
        Set GetReferenceFromPath = oReference
    End If
Next

End Function

【讨论】:

  • References.Remove 是否取消勾选或完全删除它?
【解决方案2】:
Public Sub RemoveReference()
On Error GoTo EH
    Dim RefName As String
    Dim ref As Reference
    RefName = "Selenium"
     
    Set ref = ThisWorkbook.VBProject.References(RefName)
    ThisWorkbook.VBProject.References.Remove ref
    
Exit Sub
EH:
'If an error was encountered, inform the user
    Select Case Err.Number
        Case Is = 9
            MsgBox "The reference is already removed"
        Exit Sub
        Case Is = 1004
            MsgBox "You probably do not have to have Trust Access To Visual Basic Project checked or macros enabled"
        Exit Sub
       Case Else
         'An unknown error was encountered
            MsgBox "Error in 'RemoveReference'" & vbCrLf & vbCrLf & Err.Description
    End Select
End Sub

P.S 在 MISSING 发生后无法以编程方式删除 A MISSING/损坏的引用,只能在它发生之前或在它发生后手动删除。大多数丢失/损坏引用的情况是由于类型库以前从未在该系统上注册过而引起的。 见How to Remove Reference programmatically?

【讨论】:

    【解决方案3】:

    我在卸载 Flash 时遇到了大量 Excel 电子表格的参考损坏问题(出于某种未知原因,我将其作为参考包含在内)。 我解决了以下问题:

    请小心,因为这涉及到注册表黑客攻击,并且很复杂。 在黑客攻击之前备份注册表。

    我编写了 VBA 代码来查找损坏的引用的 Guid。 我使用 Regedit 插入了一个 DUMMY TypeLib 条目,如下所示:

    D27CDB6B-AE6D-11CF-96B8-444553540000 是损坏参考的指南。

    HKEY_CLASSES_ROOT\TypeLib{D27CDB6B-AE6D-11CF-96B8-444553540000} HKEY_CLASSES_ROOT\TypeLib{D27CDB6B-AE6D-11CF-96B8-444553540000}\1.0 Adob​​e Acrobat 7.0 浏览器控件类型库 1.0 HKEY_CLASSES_ROOT\TypeLib{D27CDB6B-AE6D-11CF-96B8-444553540000}\1.0\0 HKEY_CLASSES_ROOT\TypeLib{D27CDB6B-AE6D-11CF-96B8-444553540000}\1.0\0\win32 C:\Program Files (x86)\Common Files\Adobe\Acrobat\ActiveX\AcroPDF.dll HKEY_CLASSES_ROOT\TypeLib{D27CDB6B-AE6D-11CF-96B8-444553540000}\1.0\FLAGS 0 HKEY_CLASSES_ROOT\TypeLib{D27CDB6B-AE6D-11CF-96B8-444553540000}\1.0\HELPDIR C:\Program Files (x86)\Common Files\Adobe\Acrobat\ActiveX\

    我上面的内容基于另一个 TypeLib 条目。

    然后我编写 VBA 代码依次读取每个 Reference.Guid,如果 Guid 匹配 {D27CDB6B-AE6D-11CF-96B8-444553540000} 以使用 References.Remove Reference 删除引用。

    论坛上都有相关代码,这里不再赘述。

    修改所有受影响的工作簿后,我恢复了保存的注册表。

    希望这对你有用。

    请小心,因为这涉及到注册表黑客攻击,并且很复杂。 在黑客攻击之前备份注册表。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-03
      • 1970-01-01
      • 1970-01-01
      • 2018-11-04
      • 1970-01-01
      • 2018-08-12
      • 2012-06-24
      • 1970-01-01
      相关资源
      最近更新 更多