Як програмно додати посилання


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 речі, про які потрібно подбати

а) Макроси слід увімкнути

b) У налаштуваннях безпеки переконайтеся, що встановлено прапорець "Довіряти доступ до проекту Visual Basic"

введіть тут опис зображення

в) Ви вручну встановили посилання на об'єкт `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

Примітка . Я не додав обробку помилок. Рекомендується використовувати його у вашому фактичному коді :)

EDIT Побитий mischab1:)


2
Отже, здається, що замість того, щоб додавати посилання вручну, мені потрібно додати окреме посилання вручну та змінити дозволи на Excel? Звичайно, це буде краще в майбутньому, але це здається трохи смішним зараз.
Ommit

2
Так, це звучить смішно, але тоді це так на даний момент :)
Siddharth Rout

1
Чудова відповідь. Користувачі FYI цього зауважують, що ви все ще не можете використовувати жоден об’єкт Word / PowerPoint / інший або Enum поза функцією чи процедурою, оскільки компілятор зазнає невдачі до WORKBOOK_OPENпочатку виконання події. Отже, ви не можете створити об’єкт Public Word і не можете визначити тип параметра як тип Word / PPT (наприклад, ви не можете зробити щось подібне Sub CopyActiveChartToWord(FormatType as WdPasteDataType)).
s_a

3
Чи не буде розташування папок деяких бібліотек DLL відрізнятися в різних версіях Windows? (наприклад, Win 8, Win 7, Vista, XP тощо). У якому випадку, чи не буде додавання за допомогою GUID безпечнішим (якщо ваші користувачі використовують різні версії Win)?
johny why

10
Для запису GUID для MS Scripting Runtime є {420B2830-E718-11CF-893D-00A0C9054228}. Ви можете дізнатись інші GUID, додавши їх вручну, потім переглянувши кожен із них, Ref ThisWorkbook.VBProject.ReferencesвикористовуючиDebug.Print Ref.Name, Ref.Guid
авіаудар

26

Існує два способи додавання посилань за допомогою 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 він знаходиться в Центрі довіри - Налаштування макросів.)

Окрім цього, якщо ви можете трохи чіткіше зрозуміти, що таке ваше запитання чи те, що ви намагаєтесь зробити, але не працює, я міг би дати більш конкретну відповідь.


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 для розширення програм».


3
Зверніть увагу, що вам потрібно ввімкнути макроси та перевірити довіру до доступу до проекту Visual Basic (точки a та b у відповіді від @Siddharth_Rout), але +1 для усунення посилання VBIDE! Крім того, я розумію, що DebugPrintExistingRefs виводить його у форматі для копіювання та вставки рядка в код.
GlennFromIowa

7

Ось як отримати програмний посібник програмно! Потім ви можете використовувати ці посібники / шляхи до файлів із наведеною вище відповіддю, щоб додати посилання!

Довідково: 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 
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.