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
到目前为止,在提出的解决方案中,为了以编程方式添加参考,我需要手动添加参考并更改信任中心-这不仅仅是添加参考。尽管我猜想我能遵循提出的解决方案,但我将能够以编程方式添加将来的参考资料。这可能值得付出努力。
任何进一步的想法都将是很棒的。
#1 楼
Ommit有两种方法可以通过VBA向项目添加引用
1)使用GUID
2)直接引用dll。
让我同时介绍两者。
但是首先,您需要注意以下三件事
a)应该启用宏
b)在“安全性”设置中,确保选中“对Visual Basic Project的信任访问”
c)您已手动将引用设置为“ Microsoft Visual” “应用程序可扩展性基础”对象
方法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"
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
:) 评论
因此,似乎需要手动添加一个单独的引用并更改excel权限,而不是手动添加引用?当然,将来会更好,但是现在看来有点可笑了。
–省略
2012年3月27日20:09
是的,听起来确实很有趣,但是现在就是这样了:)
–Siddharth Rout
2012年3月27日在20:25
好答案。仅供参考,请注意,您仍然不能在函数或过程之外使用任何Word / PowerPoint /其他对象或枚举,因为编译器将在WORKBOOK_OPEN事件开始执行之前失败。因此,您无法创建Public Word对象,也无法将参数的类型定义为Word / PPT类型(例如,您不能执行Sub CopyActiveChartToWord(FormatType as WdPasteDataType)之类的操作)。
– s_a
2014年4月7日在16:28
在不同版本的Windows中,某些DLL的文件夹位置是否会有所不同? (例如Win 8,Win 7,Vista,XP等)。在那种情况下,用GUID进行添加会不会更安全(如果您的用户使用的是其他Win版本)?
–约翰尼为什么
2014年7月6日在21:17
作为记录,MS脚本运行时的GUID为{420B2830-E718-11CF-893D-00A0C9054228}。您可以通过手动添加其他GUID来找到它们,然后遍历每个Ref ThisWorkbook.VBProject.References并使用Debug.Print Ref.Name,Ref.Guid
–空袭
16-09-23在19:50
#2 楼
有两种使用VBA添加引用的方法。.AddFromGuid(Guid, Major, Minor)
和.AddFromFile(Filename)
。哪一个最好取决于您要添加引用的内容。我几乎总是使用.AddFromFile
,因为我要引用的内容是其他Excel VBA项目,而它们不在Windows注册表中。您显示的示例代码将添加对工作簿的引用,该代码是我通常看不到这样做的任何意义,因为90%的时间在添加引用之前,由于缺少引用,代码已经无法编译。 (如果编译没有失败,则可能是您使用了后期绑定,因此不需要添加引用。)
如果在运行代码时遇到问题,存在两个可能的问题。
为了轻松使用VBE的对象模型,您需要添加对Microsoft Visual Basic的引用以实现应用程序可扩展性。 (VBIDE)
为了运行更改VBProject中任何内容的Excel VBA代码,您需要信任对VBA Project对象模型的访问。 (在Excel 2010中,它位于“信任中心-宏设置”中。)此外,如果您可以更清楚地了解问题是什么或正在尝试执行的操作无法使用,我可以给出更具体的答案。
#3 楼
浏览注册表以获取指导或使用路径,哪种方法最好。如果不再需要浏览注册表,那不是使用guids的更好方法吗?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 for Applications Extensibility”对象。
评论
请注意,您必须启用宏并选中“对Visual Basic项目的信任访问”(@Siddharth_Rout中的答案中的a和b),但是+1消除了VBIDE引用!另外,我感谢DebugPrintExistingRefs以将其复制并粘贴到代码中的格式输出它。
–GlennFromIowa
17-10-11在16:57
#4 楼
这是如何以编程方式获取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
评论
您可以使用CreateObject()而不在Excel 2010下添加引用不知道为什么这种情况再次出现-但是请看一下早期/晚期绑定。如果添加引用(手工或以编程方式),则它将您的代码绑定到特定版本。例如Excel 11库与Excel 2003绑定在一起。如果这就是您想要的,那一切都很好,但是很多时候(尤其是在我工作的地方),我需要它才能在2003、2007和2010上工作。