Как добавить ссылку программно



Я написал программу, которая работает и сообщения 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


до сих пор, в представленных решениях, чтобы добавить ссылку программно мне нужно будет добавить ссылку вручную и изменить центр доверия - это больше, чем просто добавление ссылки. Хотя я думаю, что если я буду следовать предложенным решениям, я смогу добавить будущие ссылки программно. Что, вероятно, стоит затраченных усилий.



любые дальнейшие мысли были бы великолепны.

694   4  

4 ответов:

Оммит

есть два способа добавить ссылки через VBA в ваши проекты

1) используя GUID

2) прямая ссылка на dll.

Позволь мне покрыть.

но сначала это 3 вещи, о которых вам нужно позаботиться

a) макросы должны быть включены

б) в настройках безопасности убедитесь, что "доверительный доступ к проекту Visual Basic проверено

enter image description here

c) вы вручную установили ссылку на" Microsoft Visual Basic для расширения приложений " объект

enter image description here

Способ 1 (с помощью GUID)

Я обычно избегаю этого пути, поскольку мне нужно искать GUID в реестре... что я ненавижу ЛОЛ. Подробнее о 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"

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% времени, прежде чем вы сможете добавить ссылку, код уже не удалось скомпилировать, потому что ссылка отсутствует. (И если он не был скомпилирован, вы, вероятно, используете позднюю привязку, и вам не нужно добавлять ссылку.)

Если у вас возникли проблемы с запуском кода, есть две возможные проблемы.

  1. чтобы легко использовать объектную модель VBE, вам нужно добавить ссылку на Microsoft Visual Basic для расширения приложений. (VBIDE)
  2. для того, чтобы запустите 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

    Ничего не найдено.