Как добавить ссылку программно - PullRequest
79 голосов
/ 27 марта 2012

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

99 голосов
/ 27 марта 2012

Ommit

Существует два способа добавления ссылок через VBA в ваши проекты

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

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

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

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

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

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

enter image description here

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

enter image description here

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

22 голосов
/ 27 марта 2012

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

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

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

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

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

7 голосов
/ 14 февраля 2017

Просмотр реестра для гидов или использование путей, какой метод лучше. Если просмотр реестра больше не нужен, разве это не будет лучшим способом использования руководств? Office не всегда устанавливается в один и тот же каталог. Путь установки может быть изменен вручную. Также номер версии является частью пути. Я никогда не мог бы предсказать, что Microsoft когда-либо добавит (x86) к «Программным файлам» до появления 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 для приложений».

5 голосов
/ 28 сентября 2017

Вот как программно получить Guid's! Затем вы можете использовать эти 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'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 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...