Как добавить ссылку программно
Я написал программу, которая работает и сообщения 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
до сих пор, в представленных решениях, чтобы добавить ссылку программно мне нужно будет добавить ссылку вручную и изменить центр доверия - это больше, чем просто добавление ссылки. Хотя я думаю, что если я буду следовать предложенным решениям, я смогу добавить будущие ссылки программно. Что, вероятно, стоит затраченных усилий.
любые дальнейшие мысли были бы великолепны.
4 ответов:
Оммит
есть два способа добавить ссылки через VBA в ваши проекты
1) используя GUID
2) прямая ссылка на dll.
Позволь мне покрыть.
но сначала это 3 вещи, о которых вам нужно позаботиться
a) макросы должны быть включены
б) в настройках безопасности убедитесь, что "доверительный доступ к проекту Visual Basic проверено
c) вы вручную установили ссылку на" Microsoft Visual Basic для расширения приложений " объект
Способ 1 (с помощью GUID)
Я обычно избегаю этого пути, поскольку мне нужно искать GUID в реестре... что я ненавижу ЛОЛ. Подробнее о GUID здесь.
тема: добавление справочной библиотеки VBA с помощью кода
ссылке: http://www.vbaexpress.com/kb/getarticle.php?kb_id=267
Способ 2 (Прямая ссылка на dll)
этот код добавляет ссылку на
Microsoft VBScript Regular Expressions 5.5Option 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:)
есть два способа добавить ссылки с помощью VBA.
.AddFromGuid(Guid, Major, Minor)и.AddFromFile(Filename). Какой из них лучше зависит от того, что вы пытаетесь добавить ссылку на. Я почти всегда использую.AddFromFileпотому что вещи, на которые я ссылаюсь, являются другими проектами Excel VBA, и они не находятся в реестре Windows.пример кода, который вы показываете, добавит ссылку на книгу, в которой находится код. Я вообще не вижу никакого смысла в этом, потому что 90% времени, прежде чем вы сможете добавить ссылку, код уже не удалось скомпилировать, потому что ссылка отсутствует. (И если он не был скомпилирован, вы, вероятно, используете позднюю привязку, и вам не нужно добавлять ссылку.)
Если у вас возникли проблемы с запуском кода, есть две возможные проблемы.
- чтобы легко использовать объектную модель VBE, вам нужно добавить ссылку на Microsoft Visual Basic для расширения приложений. (VBIDE)
- для того, чтобы запустите Excel VBA код, который изменяет что-либо в VBProject, вам нужно доверительный доступ к объектной модели проекта VBA. (В Excel 2010, он находится в Центре управления безопасностью - параметры макросов.)
кроме того, если вы можете быть немного более ясно, на какой ваш вопрос или что вы пытаетесь сделать, что не работает, я мог бы дать более конкретный ответ.
просмотр реестра для GUID или использование путей, какой метод лучше. Если просмотр реестра больше не требуется, не будет ли это лучшим способом использовать GUID? Office не всегда устанавливается в одном каталоге. Путь установки можно изменить вручную. Также номер версии является частью пути. Я никогда не мог предсказать, что Microsoft когда-либо добавит "(x86) " в "Program Files" до появления 64-битных процессоров. Если возможно, я бы попытался избежать использования путь.
приведенный ниже код является производным от ответа Siddharth Rout, с дополнительной функцией для перечисления всех ссылок, которые используются в активной книге. Что делать, если я открою свою книгу в более поздней версии Excel? Будет ли книга по-прежнему работать без адаптации кода VBA? Я уже проверил, что идентификаторы GUID для office 2003 и 2010 идентичны. Будем надеяться, что 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 для расширения приложений".
вот как получить Guid программно! Затем вы можете использовать эти GUID/filepaths с ответом выше, чтобы добавить ссылку!
Ссылка: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вот тот же код, но печать на терминал, если вы не хотите выделять рабочий лист для вывода.
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


Comments