프로그래밍 방식으로 참조를 추가하는 방법


89

완료되면 Skype를 실행하고 정보와 함께 메시지를 보내는 프로그램을 작성했습니다. Skype4COM.dllSkype를 통해 메시지를 보내 려면에 대한 참조를 추가해야합니다 . 우리는 네트워크와 공유 파일 서버 (무엇보다도)에 수십 대 정도의 컴퓨터를 가지고 있습니다. 다른 모든 컴퓨터는이 프로그램을 실행할 수 있어야합니다. 손으로 참조를 설정하는 것을 피하고 싶었습니다. 참조를 공유 위치에두고 프로그램이 실행될 때 프로그래밍 방식으로 추가 할 계획이었습니다.

VBA를 사용하여 Excel 2007에 프로그래밍 방식으로 참조를 추가하는 방법을 알아낼 수없는 것 같습니다. 수동으로 수행하는 방법을 알고 있습니다. Open 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
Excel 2010에서 참조를 추가하지 않고도 CreateObject ()를 사용할 수 있습니다
Qbik

1
이것이 왜 다시 살아 나는지 모르겠지만 초기 / 늦은 바인딩을 살펴보십시오. 참조를 수동으로 또는 프로그래밍 방식으로 추가하면 코드가 특정 버전에 연결됩니다. 예를 들어 엑셀 11 라이브러리는 매우 자주 (I 작동 특히 경우) I 2003, 2007 년과 2010 년에 작업에 필요한 만약 당신이 원하는 엑셀 2003의 모든 좋은에 연결되어 있지만
대런 Bartrup - 쿡

답변:


110

Ommit

VBA를 통해 프로젝트에 참조를 추가하는 방법에는 두 가지가 있습니다.

1) GUID 사용

2) dll을 직접 참조합니다.

둘 다 다루겠습니다.

하지만 먼저 이것들은 당신이 돌봐야 할 세 가지입니다

a) 매크로를 활성화해야합니다.

b) 보안 설정에서 "Visual Basic 프로젝트에 대한 액세스 신뢰"가 선택되어 있는지 확인하십시오.

여기에 이미지 설명 입력

c) `Microsoft Visual Basic for Applications Extensibility '개체에 대한 참조를 수동으로 설정했습니다.

여기에 이미지 설명 입력

방법 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 :)


2
따라서 참조를 직접 추가하는 대신 별도의 참조를 직접 추가하고 엑셀 권한을 변경해야하는 것 같습니다. 당연히 앞으로 더 나아질 것이지만 지금은 조금 웃기게 보입니다.
Ommit 2012 년

2
예, 재미있게 들리지만 지금은 그게 다예요 :)
Siddharth Rout

1
좋은 대답입니다. FYI 사용자는 WORKBOOK_OPEN이벤트가 실행 되기 전에 컴파일러가 실패하므로 함수 또는 프로 시저 외부에서 Word / PowerPoint / 기타 개체 또는 Enum을 사용할 수 없습니다 . 따라서 Public Word 개체를 만들 수없고 매개 변수의 유형을 Word / PPT 유형으로 정의 할 수 없습니다 (예 :) Sub CopyActiveChartToWord(FormatType as WdPasteDataType).
s_a apr. 07 2014-04-07

3
Windows 버전에 따라 일부 DLL의 폴더 위치가 다르지 않습니까? (예 : Win 8, Win 7, Vista, XP 등). 어떤 경우 GUID로 추가하는 것이 더 안전하지 않습니까 (사용자가 다른 Win 버전을 사용하는 경우)?
johny 왜

10
레코드의 경우 MS 스크립팅 런타임의 GUID는 {420B2830-E718-11CF-893D-00A0C9054228}. 다른 GUID를 수동으로 추가 한 다음 각각을 반복 Ref ThisWorkbook.VBProject.References하고 사용하여 찾을 수 있습니다.Debug.Print Ref.Name, Ref.Guid
airstrike

26

VBA를 사용하여 참조를 추가하는 방법에는 두 가지가 있습니다. .AddFromGuid(Guid, Major, Minor).AddFromFile(Filename). 어떤 것이 가장 좋은지는 참조를 추가하려는 대상에 따라 다릅니다. 내가 .AddFromFile참조하는 항목이 다른 Excel VBA 프로젝트이고 Windows 레지스트리에 없기 때문에 거의 항상 사용 합니다.

보여주는 예제 코드는 코드가 들어있는 통합 문서에 대한 참조를 추가합니다. 일반적으로 90 %의 시간이 참조를 추가하기 전에 코드가 이미 컴파일에 실패했기 때문에 그렇게하는 데 아무런 의미가 없습니다. 참조가 누락 되었기 때문입니다. (그리고 컴파일에 실패하지 않았다면 아마도 후기 바인딩을 사용하고 있으며 참조를 추가 할 필요가 없습니다.)

코드를 실행하는 데 문제가있는 경우 두 가지 가능한 문제가 있습니다.

  1. VBE의 개체 모델을 쉽게 사용하려면 Microsoft Visual Basic for Application Extensibility에 대한 참조를 추가해야합니다 . (VBIDE)
  2. VBProject에서 변경하는 Excel VBA 코드를 실행 하려면 VBA 프로젝트 개체 모델에 대한 액세스를 신뢰 해야합니다 . (Excel 2010에서는 보안 센터-매크로 설정에 있습니다.)

그 외에도 질문이 무엇인지 또는 수행하려는 작업이 작동하지 않는지에 대해 조금 더 명확하게 말할 수 있다면 더 구체적인 답변을 드릴 수 있습니다.


10

레지스트리에서 GUID를 검색하거나 경로를 사용하는 것이 가장 좋습니다. 레지스트리 검색이 더 이상 필요하지 않은 경우 GUID를 사용하는 더 좋은 방법이 아닐까요? Office가 항상 같은 디렉터리에 설치되는 것은 아닙니다. 설치 경로는 수동으로 변경할 수 있습니다. 또한 버전 번호는 경로의 일부입니다. 64 비트 프로세서가 도입되기 전에 Microsoft가 '프로그램 파일'에 '(x86)'을 추가 할 것이라고는 예상 할 수 없었습니다. 가능하다면 나는 경로를 사용하지 않으려 고 노력할 것입니다.

아래 코드는 Siddharth Rout의 답변에서 파생되었으며 활성 통합 문서에서 사용되는 모든 참조를 나열하는 추가 기능이 있습니다. 이후 버전의 Excel에서 통합 문서를 열면 어떻게됩니까? 통합 문서는 VBA 코드를 조정하지 않아도 작동합니까? Office 2003과 2010의 GUID가 동일한 지 이미 확인했습니다. Microsoft가 향후 버전에서 GUID를 변경하지 않기를 바랍니다.

인수 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 for Applications Extensibility"개체에 대한 참조가 필요하지 않습니다.


3
매크로를 활성화하고 Visual Basic 프로젝트에 대한 신뢰 액세스를 선택해야합니다 ( @Siddharth_Rout의 대답 에서 a 및 b 지점 ), VBIDE 참조를 제거하려면 +1을해야합니다! 또한 DebugPrintExistingRefs가 라인을 복사하여 코드에 붙여 넣는 형식으로 출력한다는 점에 감사드립니다.
GlennFromIowa

7

프로그래밍 방식으로 Guid를 얻는 방법은 다음과 같습니다! 그런 다음 위의 답변과 함께 이러한 guid / 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 
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.