Я написал программу, которая запускает и отправляет 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
Пока что в представленных решениях, чтобы добавить ссылку программно, мне нужно будет добавить ссылку вручную и изменить Центр управления безопасностью - это больше, чем просто добавление ссылки. Хотя я думаю, что если я воспользуюсь предложенными решениями, я смогу программно добавлять будущие ссылки. Что, вероятно, того стоит.
Любые дальнейшие мысли были бы замечательными.
Ответы:
Оммит
Есть два способа добавить ссылки через 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
:)источник
WORKBOOK_OPEN
событие начнет выполняться. Таким образом, вы не можете создать объект Public Word и не можете определить тип параметра как тип Word / PPT (например, вы не можете сделать что-то подобноеSub CopyActiveChartToWord(FormatType as WdPasteDataType)
).{420B2830-E718-11CF-893D-00A0C9054228}
. Вы можете узнать другие идентификаторы GUID, добавив их вручную, затем перебрав каждыйRef
ThisWorkbook.VBProject.References
и используяDebug.Print Ref.Name, Ref.Guid
Есть два способа добавить ссылки с помощью VBA.
.AddFromGuid(Guid, Major, Minor)
и.AddFromFile(Filename)
. Какой из них лучше, зависит от того, на что вы пытаетесь добавить ссылку. Я почти всегда использую,.AddFromFile
потому что то, о чем я говорю, - это другие проекты Excel VBA, которых нет в реестре Windows.В примере кода, который вы показываете, будет добавлена ссылка на книгу, в которой находится код. Обычно я не вижу смысла в этом, потому что в 90% случаев, прежде чем вы сможете добавить ссылку, код уже не удалось скомпилировать потому что ссылка отсутствует. (И если он не скомпилировался, вы, вероятно, используете позднее связывание, и вам не нужно добавлять ссылку.)
Если у вас возникли проблемы с запуском кода, есть две возможные проблемы.
Кроме того, если вы можете быть немного более ясными в том, что ваш вопрос или что вы пытаетесь сделать, что не работает, я мог бы дать более конкретный ответ.
источник
Просматривая реестр в поисках руководств или используя пути, какой метод лучше. Если просмотр реестра больше не нужен, не лучше ли использовать гиды? 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 для расширения приложений».
источник
Вот как получить 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
источник