2012-03-26 3 views
66

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

+0

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

ответ

77

Ommit

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

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

2) Непосредственно ссылки на DLL.

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

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

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

б) В настройках безопасности, убедитесь, что «Доверять доступ к Visual Basic Project» проверяется

enter image description here

с) Вы ма nually установить ссылку на `Microsoft Visual Basic для приложений расширяемости» объект

enter image description here

Путь 1 (с помощью GUID)

я обычно избежать таким образом, как я должен искать GUID в реестра ... который я ненавижу LOL. Подробнее о GUID here.

Тема: Добавить VBA Reference Library с помощью кода

Ссылка: http://www.vbaexpress.com/kb/getarticle.php?kb_id=267


Way 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 

Примечание: Я не добавил обработку ошибок. Рекомендуется, чтобы в Вашем коде, не использовать :)

EDIT избита mischab1 :)

+4

+ 1 для удивительной детали. Отличный ответ. – Ommit

+0

Итак, кажется, что вместо добавления ссылки вручную мне нужно добавить отдельную ссылку вручную и изменить права доступа для Excel? Конечно, в будущем это будет лучше, но сейчас это немного смешно. – Ommit

+0

Да, это звучит забавно, но вот как это на данный момент :) –

17

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

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

+0

+1 для публикации его передо мной;) –

3

Просмотр реестра для GUIDs или использования путей, какой метод лучше. Если просмотр реестра больше не нужен, не лучше ли использовать его? Офис не всегда устанавливается в тот же каталог. Путь установки можно изменить вручную. Также номер версии является частью пути. Я бы никогда не предсказал, что 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 for Applications Extensibility.

+0

Обратите внимание, что вам нужно иметь макросы и Доверяйте доступ к Visual Basic Project (точки a и b в [answer] (https://stackoverflow.com/a/9880276/2712565) от @Siddharth_Rout), но +1 для устранения ссылки VBIDE! Кроме того, я понимаю, что DebugPrintExistingRefs выводит его в формате для копирования и вставки строки в код. – GlennFromIowa

2

Вот, как получить программный код Guid! Затем вы можете использовать эти guids/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 
Смежные вопросы