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

89

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

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

Любые дальнейшие мысли были бы замечательными.

Оммит
источник
2
вы можете использовать CreateObject () без добавления ссылки в Excel 2010
Qbik
1
Понятия не имею, почему это снова ожило - но взгляните на раннее / позднее связывание. Если вы добавляете ссылку (вручную или программно), она связывает ваш код с конкретной версией. например, библиотека Excel 11 привязана к Excel 2003. Все хорошо, если это то, что вы хотите, но довольно часто (особенно там, где я работаю) мне нужно, чтобы она работала в 2003, 2007 и 2010 годах.
Даррен Бартруп-Кук

Ответы:

110

Оммит

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

1) Использование GUID

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

Позвольте мне рассказать об обоих.

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

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

б) В настройках безопасности убедитесь, что установлен флажок «Доверять доступ к проекту 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:)

Сиддхарт Рут
источник
2
Получается, что вместо того, чтобы добавлять ссылку вручную, мне нужно вручную добавить отдельную ссылку и изменить разрешения Excel? Конечно, в будущем будет лучше, но сейчас это кажется немного забавным.
Ommit
2
Да, это звучит забавно, но так оно и есть сейчас :)
Siddharth Rout
1
Отличный ответ. К вашему сведению, пользователи этого, обратите внимание, что вы по-прежнему не можете использовать какой-либо Word / PowerPoint / другой объект или Enum вне функции или процедуры с этим, поскольку компилятор выйдет из строя до того, как WORKBOOK_OPENсобытие начнет выполняться. Таким образом, вы не можете создать объект Public Word и не можете определить тип параметра как тип Word / PPT (например, вы не можете сделать что-то подобное Sub CopyActiveChartToWord(FormatType as WdPasteDataType)).
s_a 07
3
Не будет ли расположение папок некоторых DLL различаться в разных версиях Windows? (например, Win 8, Win 7, Vista, XP и т. д.). В каком случае добавление по GUID не будет безопаснее (если ваши пользователи используют разные версии Win)?
johny why 06
10
Для записи GUID для MS Scripting Runtime равен {420B2830-E718-11CF-893D-00A0C9054228}. Вы можете узнать другие идентификаторы GUID, добавив их вручную, затем перебрав каждый Ref ThisWorkbook.VBProject.Referencesи используяDebug.Print Ref.Name, Ref.Guid
airstrike
26

Есть два способа добавить ссылки с помощью 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 он находится в Центре управления безопасностью - Параметры макроса.)

Кроме того, если вы можете быть немного более ясными в том, что ваш вопрос или что вы пытаетесь сделать, что не работает, я мог бы дать более конкретный ответ.

mischab1
источник
10

Просматривая реестр в поисках руководств или используя пути, какой метод лучше. Если просмотр реестра больше не нужен, не лучше ли использовать гиды? Office не всегда устанавливается в один и тот же каталог. Путь установки можно изменить вручную. Также номер версии является частью пути. Я никогда не мог предположить, что Microsoft когда-либо добавит «(x86)» в «Program Files» до появления 64-битных процессоров. Если возможно, я бы постарался избегать использования пути.

Приведенный ниже код является производным от ответа Сиддхарта Роута с дополнительной функцией для перечисления всех ссылок, используемых в активной книге. Что, если я открою книгу в более поздней версии Excel? Будет ли рабочая книга работать без адаптации кода VBA? Я уже проверял, что руководства для офиса 2003 и 2010 идентичны. Будем надеяться, что Microsoft не изменит направляющие в будущих версиях.

Аргументы 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 для расширения приложений».

hennep
источник
3
Обратите внимание, что у вас должны быть включены макросы и отмечен Trust Access To Visual Basic Project (точки a и b в ответе от @Siddharth_Rout), но +1 для удаления ссылки VBIDE! Кроме того, я ценю, что DebugPrintExistingRefs выводит его в формате для копирования и вставки строки в код.
GlennFromIowa
7

Вот как получить Guid's программно! Затем вы можете использовать эти руководства / пути к файлам с указанным выше ответом, чтобы добавить ссылку!

Ссылка: 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 
Чад Кроу
источник