如何以编程方式添加参考

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

我似乎无法弄清楚如何使用VBA以编程方式向Excel 2007添加引用。 我知道如何手动:打开VBE --> Tools --> References --> browse --_> File Location and Name 。 但是这对我的目的不是很有用。 我知道在Access Vb.net中有办法做到这一点 ,类似这样的代码不断popup,但我不知道我理解它,或者如果是相关的:

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

到目前为止,在提出的解决scheme中,为了以编程方式添加引用,我们需要手动添加引用并更改信任中心 – 这不仅仅是添加引用。 虽然我猜如果我遵循提出的解决scheme,我将能够以编程方式添加未来的参考。 这可能是值得的。

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

Ommit

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

1)使用GUID

2)直接参考dll。

让我涵盖两个。

但首先这些是你需要照顾的三件事

a)应该启用macros

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

在这里输入图像说明

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

在这里输入图像说明

方法1(使用GUID)

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

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

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


方式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 

注意 :我没有添加error handling。 build议在你的实际代码中使用它:)

编辑殴打mischab1 🙂

有两种方法可以使用VBA添加引用。 .AddFromGuid(Guid, Major, Minor).AddFromFile(Filename) 。 哪一个最好取决于你想要添加的参考。 我几乎总是使用.AddFromFile因为我所引用的是其他Excel VBA项目,它们不在Windowsregistry中。

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

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

  1. 为了方便地使用VBE的对象模型,您需要添加一个对Microsoft Visual Basic for Application Extensibility的引用。 (VBIDE)
  2. 为了运行改变VBProject中的任何内容的Excel VBA代码,您需要信任对VBA项目对象模型的访问 。 (在Excel 2010中,它位于信任中心 – macros设置中。)

除此之外,如果你可以更清楚地知道你的问题是什么,或者你正在努力做什么,那么我就可以给出一个更具体的答案。

浏览registry的GUID或使用path,哪种方法是最好的。 如果浏览registry不再需要,是不是更好的方法来使用GUID? Office不总是安装在同一个目录中。 安装path可以手动更改。 版本号也是path的一部分。 我可能从来没有预测到,在引入64位处理器之前,微软会将“(x86)”添加到“Program Files”中。 如果可能的话,我会尽量避免使用path。

下面的代码是从Siddharth Rout的答案派生的,还有一个额外的函数来列出在活动工作簿中使用的所有引用。 如果我在Excel的更高版本中打开工作簿,该怎么办? 工作簿是否仍然可以在不调整VBA代码的情况下工作? 我已经检查过,office 2003和2010的guid是一样的。 我们希望微软在未来的版本中不会改变GUID。

参数0,0(来自.AddFromGuid)应该使用最新版本的引用(我还没有testing过)。

你怎么看? 当然,我们不能预测未来,但是我们可以做些什么来使我们的代码版本certificate?

 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扩展性”对象。

这里是如何获得Guid的编程! 然后,您可以使用这些GUID /文件path与上述答案添加引用!

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

 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 With ThisWorkbook.Sheets(1) .Cells.Clear .Range("A1") = "Reference name" .Range("B1") = "Full path to reference" .Range("C1") = "Reference GUID" End With For i = 1 To ThisWorkbook.VBProject.References.Count With ThisWorkbook.VBProject.References(i) ThisWorkbook.Sheets(1).Range("A65536").End(xlUp).Offset(1, 0) = .Name ThisWorkbook.Sheets(1).Range("A65536").End(xlUp).Offset(0, 1) = .FullPath ThisWorkbook.Sheets(1).Range("A65536").End(xlUp).Offset(0, 2) = .GUID End With Next i On Error GoTo 0 End Sub