Excel 如何以编程方式添加引用

Excel 如何以编程方式添加引用,excel,vba,reference,Excel,Vba,Reference,我已经写了一个程序,运行和消息Skype的信息时,如果完成。我需要为Skype 4com.dll添加一个参考,以便通过Skype发送消息。我们在一个网络上有十几台计算机和一个共享文件服务器(除其他外)。所有其他计算机都需要能够运行此程序。我希望避免手工设置参考资料。我计划将引用放在一个共享位置,并在程序运行时以编程方式添加它 我似乎不知道如何使用VBA以编程方式将引用添加到Excel2007。我知道如何手动操作:打开VBE-->工具-->参考-->浏览-->文件位置和名称。但这对我来说不是很有用

我已经写了一个程序,运行和消息Skype的信息时,如果完成。我需要为Skype 4com.dll添加一个参考,以便通过Skype发送消息。我们在一个网络上有十几台计算机和一个共享文件服务器(除其他外)。所有其他计算机都需要能够运行此程序。我希望避免手工设置参考资料。我计划将引用放在一个共享位置,并在程序运行时以编程方式添加它

我似乎不知道如何使用VBA以编程方式将引用添加到Excel2007。我知道如何手动操作:打开
VBE-->工具-->参考-->浏览-->文件位置和名称
。但这对我来说不是很有用。我知道有很多方法可以做到这一点,类似的代码不断出现,但我不确定我是否理解它,或者它是否相关:

ThisWorkbook.VBProject.References.AddFromGuid _
    GUID:="{0002E157-0000-0000-C000-000000000046}", _
    Major:=5, Minor:=3
到目前为止,在提供的解决方案中,为了以编程方式添加引用,我需要手动添加引用并更改信任中心-这不仅仅是添加引用。虽然我想如果我坚持所提出的解决方案,我将能够以编程方式添加未来的引用。这或许值得我们付出努力


任何进一步的想法都很好

使用VBA添加引用有两种方法
.AddFromGuid(Guid、主要、次要)
.AddFromFile(文件名)
。哪一个是最好的取决于您试图添加引用的内容。我几乎总是使用
.AddFromFile
,因为我引用的是其他Excel VBA项目,它们不在Windows注册表中

您显示的示例代码将添加对代码所在工作簿的引用。我通常不认为这样做有什么意义,因为90%的时候,在添加引用之前,代码已经无法编译,因为缺少引用。(如果它没有编译失败,那么您可能正在使用后期绑定,不需要添加引用。)

如果在运行代码时遇到问题,则可能存在两个问题

  • 为了方便地使用VBE的对象模型,需要添加对Microsoft Visual Basic的引用,以实现应用程序的可扩展性。(VBIDE)
  • 要运行Excel VBA代码以更改VBA项目中的任何内容,您需要信任对VBA项目对象模型的访问。(在Excel 2010中,它位于信任中心-宏设置中。)
  • 除此之外,如果你能更清楚地知道你的问题是什么,或者你想做什么,但没有用,我可以给出一个更具体的答案。

    Ommit


    有两种方法可以通过VBA向项目添加引用

    1)使用GUID

    2)直接引用dll

    让我两个都讲

    但首先,你需要注意三件事

    a)应启用宏

    b)在安全设置中,确保选中“信任访问Visual Basic Project”

    c)您已手动设置对“Microsoft Visual Basic for Applications Extensibility”对象的引用

    方式1(使用GUID)

    我通常避免这种方式,因为我必须在注册表中搜索GUID…我讨厌LOL。更多关于GUID的信息

    主题:通过代码添加VBA参考库

    链接


    方式2(直接引用dll)

    此代码添加了对Microsoft VBScript正则表达式5.5的引用

    Option Explicit
    
    Sub AddReference()
        Dim VBAEditor As VBIDE.VBE
        Dim vbProj As VBIDE.VBProject
        Dim chkRef As VBIDE.Reference
        Dim BoolExists As Boolean
    
        Set VBAEditor = Application.VBE
        Set vbProj = ActiveWorkbook.VBProject
    
        '~~> Check if "Microsoft VBScript Regular Expressions 5.5" is already added
        For Each chkRef In vbProj.References
            If chkRef.Name = "VBScript_RegExp_55" Then
                BoolExists = True
                GoTo CleanUp
            End If
        Next
    
        vbProj.References.AddFromFile "C:\WINDOWS\system32\vbscript.dll\3"
    
    CleanUp:
        If BoolExists = True Then
            MsgBox "Reference already exists"
        Else
            MsgBox "Reference Added Successfully"
        End If
    
        Set vbProj = Nothing
        Set VBAEditor = Nothing
    End Sub
    
    注意:我没有添加错误处理。建议在实际代码中使用它:)


    EDIT
    mischab1
    :)

    浏览注册表查找GUID或使用路径,哪种方法最好。如果不再需要浏览注册表,这不是使用GUID的更好方法吗? Office并不总是安装在同一目录中。可以手动更改安装路径。版本号也是路径的一部分。 在引入64位处理器之前,我无法预测微软会在“程序文件”中添加“(x86)”。 如果可能的话,我会尽量避免使用路径

    下面的代码源于Siddharth Rout的答案,还有一个额外的函数列出活动工作簿中使用的所有引用。 如果我在更高版本的Excel中打开工作簿会怎么样?如果不修改VBA代码,工作簿是否仍能工作? 我已经检查过office 2003和2010的GUID是否相同。希望Microsoft不会在未来版本中更改GUID

    参数0,0(来自.AddFromGuid)应该使用引用的最新版本(我无法测试)

    你的想法是什么?当然我们不能预测未来,但是我们能做些什么来证明我们的代码版本

    Sub AddReferences(wbk As Workbook)
        ' Run DebugPrintExistingRefs in the immediate pane, to show guids of existing references
        AddRef wbk, "{00025E01-0000-0000-C000-000000000046}", "DAO"
        AddRef wbk, "{00020905-0000-0000-C000-000000000046}", "Word"
        AddRef wbk, "{91493440-5A91-11CF-8700-00AA0060263B}", "PowerPoint"
    End Sub
    
    Sub AddRef(wbk As Workbook, sGuid As String, sRefName As String)
        Dim i As Integer
        On Error GoTo EH
        With wbk.VBProject.References
            For i = 1 To .Count
                If .Item(i).Name = sRefName Then
                   Exit For
                End If
            Next i
            If i > .Count Then
               .AddFromGuid sGuid, 0, 0 ' 0,0 should pick the latest version installed on the computer
            End If
        End With
    EX: Exit Sub
    EH: MsgBox "Error in 'AddRef'" & vbCrLf & vbCrLf & err.Description
        Resume EX
        Resume ' debug code
    End Sub
    
    Public Sub DebugPrintExistingRefs()
        Dim i As Integer
        With Application.ThisWorkbook.VBProject.References
            For i = 1 To .Count
                Debug.Print "    AddRef wbk, """ & .Item(i).GUID & """, """ & .Item(i).Name & """"
            Next i
        End With
    End Sub
    

    上面的代码不再需要对“Microsoft Visual Basic for Applications Extensibility”对象的引用。

    以下是如何以编程方式获取Guid!然后,您可以使用这些Guid/文件路径和上面的答案来添加引用

    参考:

    下面是相同的代码,但如果您不想将工作表专用于输出,请打印到终端

    Sub ListReferencePaths() 
     'Macro purpose:  To determine full path and Globally Unique Identifier (GUID)
     'to each referenced library.  Select the reference in the Tools\References
     'window, then run this code to get the information on the reference's library
    
    On Error Resume Next 
    Dim i As Long 
    
    Debug.Print "Reference name" & " | " & "Full path to reference" & " | " & "Reference GUID" 
    
    For i = 1 To ThisWorkbook.VBProject.References.Count 
      With ThisWorkbook.VBProject.References(i) 
        Debug.Print .Name & " | " & .FullPath  & " | " & .GUID 
      End With 
    Next i 
    On Error GoTo 0 
    End Sub 
    

    因此,似乎我不需要手动添加引用,而是需要手动添加单独的引用并更改excel权限?当然,这在将来会更好,但现在似乎有点有趣。是的,听起来确实很有趣,但现在就是这样:)回答得很好。供此用户参考,请注意,您仍然不能使用任何Word/PowerP由于编译器将在
    工作簿\u OPEN
    事件开始执行之前失败,因此使用此函数或过程外部的点/其他对象或枚举
    Sub ListReferencePaths()
    'Lists path and GUID (Globally Unique Identifier) for each referenced library.
    'Select a reference in Tools > References, then run this code to get GUID etc.
        Dim rw As Long, ref
        With ThisWorkbook.Sheets(1)
            .Cells.Clear
            rw = 1
            .Range("A" & rw & ":D" & rw) = Array("Reference","Version","GUID","Path")
            For Each ref In ThisWorkbook.VBProject.References
                rw = rw + 1
                .Range("A" & rw & ":D" & rw) = Array(ref.Description, _
                       "v." & ref.Major & "." & ref.Minor, ref.GUID, ref.FullPath)
            Next ref
            .Range("A:D").Columns.AutoFit
        End With
    End Sub
    
    Sub ListReferencePaths() 
     'Macro purpose:  To determine full path and Globally Unique Identifier (GUID)
     'to each referenced library.  Select the reference in the Tools\References
     'window, then run this code to get the information on the reference's library
    
    On Error Resume Next 
    Dim i As Long 
    
    Debug.Print "Reference name" & " | " & "Full path to reference" & " | " & "Reference GUID" 
    
    For i = 1 To ThisWorkbook.VBProject.References.Count 
      With ThisWorkbook.VBProject.References(i) 
        Debug.Print .Name & " | " & .FullPath  & " | " & .GUID 
      End With 
    Next i 
    On Error GoTo 0 
    End Sub