如何以编程方式添加参考


89

我编写了一个程序,该程序可以运行并在完成时向Skype发送信息。我需要添加参考Skype4COM.dll,以便通过Skype发送消息。我们在网络上有一打左右的计算机和一个共享文件服务器(除其他外)。所有其他计算机都需要能够运行此程序。我希望避免手动设置参考。我计划将引用放在一个共享的位置,并在程序运行时以编程方式添加它。

我似乎无法弄清楚如何使用VBA以编程方式向Excel 2007添加引用。我知道如何手动执行:打开VBE --> Tools --> References --> browse --_> File Location and Name。但这对我的目的不是很有用。我知道可以在Access Vb.net中执行此操作,并且类似的代码会不断弹出,但是我不确定我是否理解它,或者它是否相关:

ThisWorkbook.VBProject.References.AddFromGuid _
    GUID:="{0002E157-0000-0000-C000-000000000046}", _
    Major:=5, Minor:=3

到目前为止,在提出的解决方案中,为了以编程方式添加参考,我将需要手动添加参考并更改信任中心-这不仅仅是添加参考。尽管我猜想我能遵循提出的解决方案,但我将能够以编程方式添加将来的参考资料。这可能值得付出努力。

任何进一步的想法将是巨大的。


2
您可以使用CreateObject()而不在Excel 2010下添加引用
Qbik 2014年

1
不知道为什么这种情况再次出现-但是请看一下早期/晚期绑定。如果添加引用(手动或以编程方式),则会将您的代码绑定到特定版本。如:Excel 11库是依赖于Excel 2003的所有好,如果这是你想要的,但很多时候(尤其是我工作的地方),我需要它的工作在2003年,2007年和2010年
达伦Bartrup库克

Answers:


110

省略

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

1)使用GUID

2)直接引用dll。

让我同时介绍一下。

但是首先,这是您需要注意的三件事

a)应该启用宏

b)在“安全性”设置中,确保选中“对Visual Basic项目的信任访问”

在此处输入图片说明

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

在此处输入图片说明

方式1(使用GUID)

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

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

链接http : //www.vbaexpress.com/kb/getarticle.php? kb_id = 267

'Credits: Ken Puls
Sub AddReference()
     'Macro purpose:  To add a reference to the project using the GUID for the
     'reference library

    Dim strGUID As String, theRef As Variant, i As Long

     'Update the GUID you need below.
    strGUID = "{00020905-0000-0000-C000-000000000046}"

     'Set to continue in case of error
    On Error Resume Next

     'Remove any missing references
    For i = ThisWorkbook.VBProject.References.Count To 1 Step -1
        Set theRef = ThisWorkbook.VBProject.References.Item(i)
        If theRef.isbroken = True Then
            ThisWorkbook.VBProject.References.Remove theRef
        End If
    Next i

     'Clear any errors so that error trapping for GUID additions can be evaluated
    Err.Clear

     'Add the reference
    ThisWorkbook.VBProject.References.AddFromGuid _
    GUID:=strGUID, Major:=1, Minor:=0

     'If an error was encountered, inform the user
    Select Case Err.Number
    Case Is = 32813
         'Reference already in use.  No action necessary
    Case Is = vbNullString
         'Reference added without issue
    Case Else
         'An unknown error was encountered, so alert the user
        MsgBox "A problem was encountered trying to" & vbNewLine _
        & "add or remove a reference in this file" & vbNewLine & "Please check the " _
        & "references in your VBA project!", vbCritical + vbOKOnly, "Error!"
    End Select
    On Error GoTo 0
End Sub

方式2(直接引用dll)

此代码添加了对 Microsoft VBScript Regular Expressions 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

注意:我尚未添加错误处理。建议在您的实际代码中使用它:)

编辑殴打mischab1:)


2
因此,似乎需要手动添加一个单独的引用并更改excel权限,而不是手动添加引用?当然,将来会更好,但是现在看来有点可笑了。
省略

2
是的,听起来确实很有趣,但此刻就是这样:)
Siddharth Rout 2012年

1
好答案。仅供参考,请注意,您仍然不能在函数或过程之外使用任何Word / PowerPoint /其他对象或枚举,因为在WORKBOOK_OPEN事件开始执行之前编译器将失败。因此,您无法创建Public Word对象,也无法将参数的类型定义为Word / PPT类型(例如,您不能执行Sub CopyActiveChartToWord(FormatType as WdPasteDataType))。
s_a 2014年

3
在不同版本的Windows中,某些DLL的文件夹位置是否会有所不同?(例如Win 8,Win 7,Vista,XP等)。在那种情况下,用GUID进行添加会不会更安全(如果您的用户使用的是其他Win版本)?
约翰尼,为什么

10
作为记录,MS Scripting Runtime的GUID为{420B2830-E718-11CF-893D-00A0C9054228}。您可以通过手动添加其他GUID来查找其他GUID,然后遍历每个GUIDRef ThisWorkbook.VBProject.References并使用Debug.Print Ref.Name, Ref.Guid
airstrike

26

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

您显示的示例代码将添加对代码所在工作簿的引用。我通常看不到这样做的任何意义,因为90%的时间在添加引用之前,代码已经无法编译因为缺少参考。(而且,如果编译没有失败,则可能是您在使用后期绑定,并且不需要添加引用。)

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

  1. 为了轻松使用VBE的对象模型,您需要添加对Microsoft Visual Basic for Application Extensibility的引用。(VBIDE)
  2. 为了运行更改VBProject中的任何内容的Excel VBA代码,您需要信任对VBA Project对象模型的访问。(在Excel 2010中,它位于“信任中心-宏设置”中。)

除此之外,如果您可以更清楚地知道问题是什么或您试图做的事情是行不通的,那么我可以给出更具体的答案。


10

浏览注册表以获取指导或使用路径,哪种方法最好。如果不再需要浏览注册表,这不是使用Guid的更好方法吗?Office并不总是安装在同一目录中。可以手动更改安装路径。版本号也是路径的一部分。我从来没有想到微软会在引入64位处理器之前将'(x86)'添加到'Program Files'中。如果可能的话,我会尽量避免使用路径。

下面的代码来自Siddharth Rout的答案,并具有附加功能以列出活动工作簿中使用的所有引用。如果我在更高版本的Excel中打开工作簿怎么办?在不改编VBA代码的情况下,工作簿是否仍然可以工作?我已经检查过Office 2003和2010的指南是否相同。希望微软不要在以后的版本中更改指南。

参数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应用程序可扩展性”对象的引用。


3
请注意,您必须启用宏并选中“对Visual Basic项目的信任访问”(@Siddharth_Rout中的答案中的a和b ),但是+1可以消除VBIDE引用!另外,我感谢DebugPrintExistingRefs以将其复制并粘贴到代码中的格式输出它。
GlennFromIowa

7

这是如何以编程方式获取Guid的方法!然后,您可以将这些guid / filepaths与上面的答案一起使用来添加参考!

参考:http : //www.vbaexpress.com/kb/getarticle.php? kb_id= 278

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 
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.