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

74

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

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

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

  • 1
    Вы можете использовать CreateObject () без добавления ссылки в Excel 2010
  • 0
    Не знаю, почему это снова ожило - но посмотрите на раннее / позднее связывание. Если вы добавите ссылку (вручную или программно), она свяжет ваш код с определенной версией. Например, библиотека Excel 11 связана с Excel 2003. Все хорошо, если это то, что вы хотите, но довольно часто (особенно там, где я работаю) мне нужно, чтобы она работала в 2003, 2007 и 2010 годах.
Теги:
excel-vba
excel
reference

4 ответа

88
Лучший ответ

Ommit

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

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

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

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

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

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

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

Изображение 3739

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

Изображение 3740

Способ 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 :)

  • 5
    +1 за потрясающие детали. Отличный ответ.
  • 2
    Таким образом, кажется, что вместо добавления ссылки вручную мне нужно добавить отдельную ссылку вручную и изменить разрешения Excel? Конечно, это будет лучше в будущем, но сейчас это выглядит немного забавно.
Показать ещё 8 комментариев
22

Есть два способа добавить ссылки, используя VBA. .AddFromGuid(Guid, Major, Minor) и .AddFromFile(Filename). Какой из них лучше всего зависит от того, к чему вы пытаетесь добавить ссылку. Я почти всегда использую .AddFromFile, потому что вещи, на которые я ссылаюсь, являются другими проектами Excel VBA, и они не находятся в реестре Windows.

Пример кода, который вы показываете, добавит ссылку на рабочую книгу, в которой находится код. Обычно я не вижу смысла в этом, потому что в 90% случаев, прежде чем вы сможете добавить ссылку, код уже не удалось скомпилировать, поскольку ссылка отсутствует. (И если он не скомпилировался, вы, вероятно, используете позднюю привязку, и вам не нужно добавлять ссылку.)

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

  • Чтобы легко использовать объектную модель VBE, вам необходимо добавить ссылку на Microsoft Visual Basic для расширяемости приложения. (VBIDE)
  • Чтобы запустить код Excel VBA, который изменяет что-либо в VBProject, вам нужно доверять доступу к объектной модели проекта VBA. (В Excel 2010 он находится в Центре доверия - Параметры макроса.)

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

  • 0
    +1 за публикацию передо мной;)
6

Просмотр реестра для подсказок или использование путей, какой метод лучше всего. Если просмотр реестра больше не нужен, не лучше ли использовать его? 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 для расширения приложений.

  • 1
    Обратите внимание, что вы должны включить макросы и проверить доверительный доступ к проекту Visual Basic (указывает a и b в ответе @Siddharth_Rout), но +1 за исключение ссылки на VBIDE! Кроме того, я ценю, что DebugPrintExistingRefs выводит его в формате для копирования и вставки строки в код.
4

Вот как получить 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 

Ещё вопросы

Сообщество Overcoder
Наверх
Меню