Я написал программу, которая запускает и сообщает Skype, когда информация заканчивается. Мне нужно добавить ссылку для Skype4COM.dll
, чтобы отправить сообщение через Skype. У нас около десятка компьютеров в сети и общий файловый сервер (между прочим). Все остальные компьютеры должны иметь возможность запускать эту программу. Я надеялся избежать указания ссылки вручную. Я планировал разместить ссылку в общем месте и добавить ее программно, когда программа запустилась.
Я не могу понять, как добавить ссылку в Excel 2007 с помощью VBA. Я знаю, как это сделать вручную: откройте 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
До сих пор в представленных решениях, чтобы добавить ссылку программно, мне нужно будет добавить ссылку вручную и изменить Центр доверия - это больше, чем просто добавление ссылки. Хотя я думаю, что если я продолжу предлагать решения, я буду иметь возможность добавлять будущие ссылки программно. Скорее всего, это стоит того.
Любые дальнейшие мысли были бы замечательными.
Ommit
Есть два способа добавить ссылки через VBA в ваши проекты
1) Использование GUID
2) Прямая ссылка на dll.
Позвольте мне охватить оба.
Но сначала это 3 вещи, о которых нужно позаботиться
а) Макросы должны быть включены
b) В настройках безопасности убедитесь, что установлен флажок "Доверительный доступ к проекту Visual Basic".
c) Вы вручную установили ссылку на объект "Расширение Microsoft Visual Basic для приложений"
Способ 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
:)
Есть два способа добавить ссылки, используя VBA. .AddFromGuid(Guid, Major, Minor)
и .AddFromFile(Filename)
. Какой из них лучше всего зависит от того, к чему вы пытаетесь добавить ссылку. Я почти всегда использую .AddFromFile
, потому что вещи, на которые я ссылаюсь, являются другими проектами Excel VBA, и они не находятся в реестре Windows.
Пример кода, который вы показываете, добавит ссылку на рабочую книгу, в которой находится код. Обычно я не вижу смысла в этом, потому что в 90% случаев, прежде чем вы сможете добавить ссылку, код уже не удалось скомпилировать, поскольку ссылка отсутствует. (И если он не скомпилировался, вы, вероятно, используете позднюю привязку, и вам не нужно добавлять ссылку.)
Если у вас возникли проблемы с запуском кода, возможны две проблемы.
Кроме того, если вы можете быть более понятным, что ваш вопрос или что вы пытаетесь сделать, это не работает, я мог бы дать более конкретный ответ.
Просмотр реестра для подсказок или использование путей, какой метод лучше всего. Если просмотр реестра больше не нужен, не лучше ли использовать его? Office не всегда устанавливается в том же каталоге. Путь установки можно изменить вручную. Также номер версии является частью пути. Я бы никогда не предсказал, что Microsoft когда-либо добавит '(x86)' в 'Program Files' до появления 64-битных процессоров. Если возможно, я постараюсь избежать использования пути.
Нижеприведенный код получен из ответа Siddharth Rout с дополнительной функцией для перечисления всех ссылок, которые используются в активной книге. Что делать, если я открою книгу в более поздней версии Excel? Будет ли рабочая книга работать без адаптации кода VBA? Я уже проверил, что указатели для офиса 2003 и 2010 годов идентичны. Будем надеяться, что Microsoft не изменит определения в будущих версиях.
Аргументы 0,0 (from.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 для расширения приложений.
Вот как получить Guid программно! Затем вы можете использовать эти guids/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 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