Cách thêm tham chiếu theo chương trình


89

Tôi đã viết một chương trình chạy và nhắn tin cho Skype với thông tin khi kết thúc. Tôi cần thêm tham chiếu cho Skype4COM.dllđể gửi tin nhắn qua Skype. Chúng tôi có một tá máy tính trên mạng và một máy chủ tệp chia sẻ (trong số những thứ khác). Tất cả các máy tính khác cần có thể chạy chương trình này. Tôi đã hy vọng tránh thiết lập tham chiếu bằng tay. Tôi đã lên kế hoạch đặt tham chiếu vào một vị trí được chia sẻ và thêm nó theo chương trình khi chương trình chạy.

Tôi dường như không thể tìm ra cách thêm tham chiếu theo chương trình vào Excel 2007 bằng VBA. Tôi biết cách làm điều đó theo cách thủ công: Mở VBE --> Tools --> References --> browse --_> File Location and Name. Nhưng điều đó không hữu ích cho mục đích của tôi. Tôi biết có nhiều cách để thực hiện điều đó trong Access Vb.net và mã tương tự như điều này liên tục xuất hiện, nhưng tôi không chắc mình hiểu hoặc nếu nó có liên quan:

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

Cho đến nay, trong các giải pháp được trình bày, để thêm tham chiếu theo chương trình, tôi sẽ cần thêm tham chiếu bằng tay và thay đổi Trung tâm tin cậy - không chỉ là thêm tham chiếu. Mặc dù tôi đoán nếu tôi làm theo các giải pháp được đề xuất, tôi sẽ có thể thêm các tài liệu tham khảo trong tương lai theo chương trình. Mà có lẽ làm cho nó xứng đáng với nỗ lực.

Bất kỳ suy nghĩ nào nữa sẽ là tuyệt vời.


2
bạn có thể sử dụng CreateObject () mà không cần thêm tài liệu tham khảo dưới Excel 2010
Qbik

1
Không biết tại sao điều này lại sống động trở lại - nhưng hãy xem ràng buộc sớm / muộn. Nếu bạn thêm một tham chiếu (bằng tay hoặc theo chương trình), nó liên kết mã của bạn với một phiên bản cụ thể. ví dụ như Excel 11 thư viện được gắn với Excel 2003. Tất cả các tốt nếu đó là những gì bạn muốn, nhưng khá thường xuyên (đặc biệt là nơi tôi làm việc) Tôi cần nó để làm việc vào năm 2003, 2007 và 2010.
Darren Bartrup-Cook

Câu trả lời:


110

Ommit

Có hai cách để thêm các tham chiếu qua VBA vào các dự án của bạn

1) Sử dụng GUID

2) Tham chiếu trực tiếp dll.

Hãy để tôi bao gồm cả hai.

Nhưng trước hết đây là 3 điều bạn cần quan tâm

a) Macro nên được bật

b) Trong cài đặt Bảo mật, đảm bảo rằng "Quyền truy cập tin cậy vào dự án Visual Basic" được chọn

nhập mô tả hình ảnh ở đây

c) Bạn đã đặt thủ công một tham chiếu đến đối tượng `` Microsoft Visual Basic for Applications Extensibility "

nhập mô tả hình ảnh ở đây

Cách 1 (Sử dụng GUID)

Tôi thường tránh theo cách này vì tôi phải tìm kiếm GUID trong sổ đăng ký ... điều mà tôi ghét LOL. Thêm về GUID tại đây .

Chủ đề: Thêm Thư viện Tham chiếu VBA qua mã

Liên kết : 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

Cách 2 (Tham chiếu trực tiếp dll)

Mã này thêm một tham chiếu đến 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

Lưu ý : Tôi chưa thêm Xử lý lỗi. Chúng tôi khuyến nghị rằng trong mã thực của bạn, hãy sử dụng nó :)

CHỈNH SỬA Bị đánh bại bởi mischab1:)


2
Vì vậy, có vẻ như thay vì thêm tham chiếu bằng tay, tôi cần thêm một tham chiếu riêng bằng tay và thay đổi quyền của excel? Cứ cho là nó sẽ tốt hơn trong tương lai, nhưng bây giờ có vẻ hơi buồn cười.
Ommit

2
Có nó âm thanh buồn cười nhưng sau đó của nó như thế nào là vào lúc này :)
Siddharth rout

1
Câu trả lời chính xác. Người dùng FYI của điều này, lưu ý rằng bạn vẫn không thể sử dụng bất kỳ Word / PowerPoint / đối tượng khác hoặc Enum nào bên ngoài một hàm hoặc thủ tục với điều này vì trình biên dịch sẽ không thành công trước khi WORKBOOK_OPENsự kiện bắt đầu thực thi. Vì vậy, bạn không thể tạo một đối tượng Public Word và bạn không thể xác định kiểu của tham số là kiểu Word / PPT (ví dụ: bạn không thể làm điều gì đó giống như vậy Sub CopyActiveChartToWord(FormatType as WdPasteDataType)).
s_a

3
Vị trí thư mục của một số DLL sẽ khác nhau trong các phiên bản Windows khác nhau sao? (ví dụ: Win 8, Win 7, Vista, XP, v.v.). Trong trường hợp đó, việc thêm bằng GUID sẽ không an toàn hơn (nếu người dùng của bạn đang sử dụng các phiên bản Win khác nhau)?
johny tại sao

10
Đối với bản ghi, GUID cho MS Scripting Runtime là {420B2830-E718-11CF-893D-00A0C9054228}. Bạn có thể tìm ra các HƯỚNG DẪN khác bằng cách thêm chúng theo cách thủ công, sau đó lặp lại từng cái Ref ThisWorkbook.VBProject.Referencesvà sử dụngDebug.Print Ref.Name, Ref.Guid
airstrike vào

26

Có hai cách để thêm tham chiếu bằng VBA. .AddFromGuid(Guid, Major, Minor).AddFromFile(Filename). Cái nào là tốt nhất phụ thuộc vào những gì bạn đang cố gắng thêm tham chiếu vào. Tôi hầu như luôn sử dụng .AddFromFilevì những thứ tôi đang tham chiếu là các Dự án Excel VBA khác và chúng không có trong Windows Registry.

Mã ví dụ bạn đang hiển thị sẽ thêm một tham chiếu vào sổ làm việc mà mã đang ở trong đó. Tôi thường không thấy bất kỳ điểm nào khi làm điều đó vì 90% thời gian, trước khi bạn có thể thêm tham chiếu, mã đã không biên dịch được bởi vì tài liệu tham khảo bị thiếu. (Và nếu nó không biên dịch được, có thể bạn đang sử dụng tính năng liên kết trễ và bạn không cần thêm tham chiếu.)

Nếu bạn gặp sự cố khi chạy mã, có hai vấn đề có thể xảy ra.

  1. Để dễ dàng sử dụng mô hình đối tượng của VBE, bạn cần thêm tham chiếu đến Microsoft Visual Basic for Application Extensibility . (VBIDE)
  2. Để chạy mã VBA trong Excel thay đổi bất kỳ điều gì trong VBProject, bạn cần có quyền truy cập Tin cậy vào Mô hình đối tượng dự án VBA . (Trong Excel 2010, nó nằm trong Trung tâm Tin cậy - Cài đặt Macro.)

Bên cạnh đó, nếu bạn có thể rõ ràng hơn một chút về câu hỏi của bạn là gì hoặc những gì bạn đang cố gắng thực hiện mà không hiệu quả, tôi có thể đưa ra một câu trả lời cụ thể hơn.


10

Duyệt sổ đăng ký để tìm guids hoặc sử dụng đường dẫn, phương pháp nào là tốt nhất. Nếu việc duyệt sổ đăng ký không còn cần thiết nữa, đó sẽ không phải là cách tốt hơn để sử dụng guids? Office không phải lúc nào cũng được cài đặt trong cùng một thư mục. Đường dẫn cài đặt có thể được thay đổi theo cách thủ công. Ngoài ra, số phiên bản là một phần của đường dẫn. Tôi chưa bao giờ có thể dự đoán rằng Microsoft sẽ thêm '(x86)' vào 'Program Files' trước khi giới thiệu bộ xử lý 64 bit. Nếu có thể, tôi sẽ cố gắng tránh sử dụng một con đường.

Đoạn mã dưới đây được lấy từ câu trả lời của Siddharth Rout, với một chức năng bổ sung để liệt kê tất cả các tham chiếu được sử dụng trong sổ làm việc đang hoạt động. Điều gì sẽ xảy ra nếu tôi mở sổ làm việc của mình trong phiên bản Excel mới hơn? Sổ làm việc sẽ vẫn hoạt động mà không cần điều chỉnh mã VBA? Tôi đã kiểm tra xem các guids cho office 2003 và 2010 có giống nhau không. Hãy hy vọng rằng Microsoft không thay đổi guid trong các phiên bản tương lai.

Các đối số 0,0 (từ .AddFromGuid) nên sử dụng phiên bản mới nhất của tham chiếu (mà tôi không thể kiểm tra).

Quan điểm của bạn là gì? Tất nhiên chúng ta không thể dự đoán tương lai nhưng chúng ta có thể làm gì để chứng minh phiên bản mã của chúng ta?

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

Đoạn mã trên không cần tham chiếu đến đối tượng "Microsoft Visual Basic for Applications Extensibility" nữa.


3
Lưu ý rằng bạn phải bật macro và kiểm tra Trust Access To Visual Basic Project (điểm a và b trong câu trả lời từ @Siddharth_Rout), nhưng +1 để loại bỏ tham chiếu VBIDE! Ngoài ra, tôi đánh giá cao rằng DebugPrintExistingRefs xuất nó ở định dạng để sao chép và dán dòng vào mã.
GlennFromIowa

7

Đây là cách nhận Hướng dẫn theo chương trình! Sau đó, bạn có thể sử dụng các guids / filepath với câu trả lời ở trên để thêm tài liệu tham khảo!

Tham khảo: 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

Đây là mã tương tự nhưng được in ra thiết bị đầu cuối nếu bạn không muốn dành một trang tính cho đầu ra.

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 
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.