programing

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

starjava 2023. 5. 12. 20:09
반응형

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

Skype가 완료되면 실행하여 Skype에 정보를 전달하는 프로그램을 작성했습니다.스카이프로 메시지를 보내려면 참고 자료를 추가해야 합니다.네트워크와 공유 파일 서버(특히)에 12대 정도의 컴퓨터가 있습니다.다른 모든 컴퓨터는 이 프로그램을 실행할 수 있어야 합니다.저는 손으로 레퍼런스를 설정하는 것을 피하고 싶었습니다.저는 프로그램이 실행될 때 참조를 공유 위치에 배치하고 프로그래밍 방식으로 추가할 계획이었습니다.

VBA를 사용하여 Excel 2007에 참조를 프로그래밍 방식으로 추가하는 방법을 알 수 없습니다.수동으로 하는 방법을 알고 있습니다. 열리세요. 하지만 제 목적에는 별로 도움이 되지 않습니다.Access Vb.net 에서 이 작업을 수행할 수 있는 방법이 있다는 것을 알고 있으며 이와 유사한 코드가 계속 표시되지만, 이 작업을 이해할 수 있는지 또는 관련이 있는지는 잘 모르겠습니다.

ThisWorkbook.VBProject.References.AddFromGuid _
    GUID:="{0002E157-0000-0000-C000-000000000046}", _
    Major:=5, Minor:=3

지금까지 제시된 솔루션에서 참조를 프로그래밍 방식으로 추가하려면 수동으로 참조를 추가하고 트러스트 센터를 변경해야 합니다. 이는 단순히 참조를 추가하는 것 이상입니다.제안된 솔루션을 수행하면 향후 참조 자료를 프로그래밍 방식으로 추가할 수 있을 것으로 생각합니다.아마 노력할 가치가 있을 겁니다.

더 이상의 생각이 있으면 좋겠습니다.

생략

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

GUID 사용

DLL을 직접 참조합니다.

둘 다 커버해드릴게요.

하지만 먼저 이것들은 당신이 신경써야 할 3가지입니다.

매크로를 사용하도록 설정해야 합니다.

보안 설정에서 "Visual Basic Project에 대한 액세스 신뢰"가 선택되어 있는지 확인합니다.

여기에 이미지 설명 입력

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

여기에 이미지 설명 입력

Way 1(GUID 사용)

보통 레지스트리에서 GUID를 검색해야 하기 때문에 이 방법을 피합니다.내가 싫어하는 것은 하하하.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

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

참고: 오류 처리를 추가하지 않았습니다.실제 코드에서는 사용하는 것이 좋습니다 :)

편집자:mischab1:)

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

표시된 예제 코드는 코드가 있는 워크북에 참조를 추가합니다.90%의 경우 참조를 추가하기 전에 이미 참조가 누락되어 컴파일에 실패했기 때문에 일반적으로 그렇게 하는 것이 의미가 없다고 생각합니다. (그리고 컴파일에 실패하지 않았다면, 아마도 지연 바인딩을 사용하고 있으며 참조를 추가할 필요가 없습니다.)

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

  1. VBE의 개체 모델을 쉽게 사용하려면 Microsoft Visual Basic for Application Extensibility(VBIDE)에 대한 참조를 추가해야 합니다.
  2. VBP 프로젝트에서 변경되는 Excel VBA 코드를 실행하려면 VBA Project Object Model에 대한 Trust 액세스 권한이 필요합니다(Excel 2010에서는 Trust Center - Macro Settings에 있습니다).

그것과는 별개로, 당신의 질문이 무엇인지 혹은 당신이 하려는 것이 무엇이 효과가 없는지에 대해 조금 더 명확하게 말씀해 주실 수 있다면, 저는 좀 더 구체적인 답변을 드릴 수 있습니다.

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

아래 코드는 Siddharth Rout의 답변에서 파생되었으며, 활성 워크북에 사용되는 모든 참조를 나열하는 추가 기능이 있습니다.최신 버전의 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 for Applications Extensibility" 개체에 대한 참조가 필요하지 않습니다.

다음은 Guid를 프로그래밍 방식으로 가져오는 방법입니다!그런 다음 위의 답변과 함께 이러한 가이드/파일 경로를 사용하여 참조를 추가할 수 있습니다!

참조: 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 

언급URL : https://stackoverflow.com/questions/9879825/how-to-add-a-reference-programmatically-using-vba

반응형