Bagaimana menambahkan referensi lewat program


89

Saya telah menulis sebuah program yang berjalan dan mengirim pesan ke Skype dengan informasi ketika selesai. Saya perlu menambahkan referensi untuk Skype4COM.dllmengirim pesan melalui Skype. Kami memiliki selusin atau lebih komputer di jaringan dan server file bersama (antara lain). Semua komputer lain harus dapat menjalankan program ini. Saya berharap untuk menghindari pengaturan referensi dengan tangan. Saya telah merencanakan untuk meletakkan referensi di lokasi bersama, dan menambahkannya secara terprogram saat program berjalan.

Saya tidak bisa menemukan cara untuk menambahkan referensi lewat program ke Excel 2007 menggunakan VBA. Saya tahu bagaimana melakukannya secara manual: Buka VBE --> Tools --> References --> browse --_> File Location and Name. Tapi itu tidak terlalu berguna untuk tujuan saya. Saya tahu ada cara untuk melakukannya di Access Vb.net dan kode yang mirip dengan ini terus bermunculan, tetapi saya tidak yakin saya memahaminya, atau jika relevan:

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

Sejauh ini, dalam solusi yang disajikan, untuk menambahkan referensi secara terprogram, saya perlu menambahkan referensi dengan tangan dan mengubah Pusat Kepercayaan - yang lebih dari sekadar menambahkan referensi. Meskipun saya kira jika saya menindaklanjuti solusi yang diusulkan, saya akan dapat menambahkan referensi di masa mendatang secara terprogram. Yang mungkin membuatnya sepadan dengan usaha.

Pikiran lebih jauh akan bagus.


2
Anda bisa menggunakan CreateObject () tanpa menambahkan referensi di bawah Excel 2010
Qbik

1
Tidak tahu mengapa ini menjadi hidup kembali - tetapi lihat pengikatan awal / akhir. Jika Anda menambahkan referensi (baik secara manual atau secara terprogram), referensi itu mengikat kode Anda ke versi tertentu. misalnya pustaka Excel 11 terkait dengan Excel 2003. Semuanya bagus jika itu yang Anda inginkan, tetapi cukup sering (terutama di tempat saya bekerja) Saya memerlukannya untuk berfungsi pada tahun 2003, 2007, dan 2010.
Darren Bartrup-Cook

Jawaban:


110

Ommit

Ada dua cara untuk menambahkan referensi melalui VBA ke proyek Anda

1) Menggunakan GUID

2) Secara langsung mereferensikan dll.

Biarkan saya membahas keduanya.

Tapi pertama-tama ini adalah 3 hal yang perlu Anda jaga

a) Makro harus diaktifkan

b) Dalam pengaturan Keamanan, pastikan bahwa "Percayai Akses ke Proyek Visual Basic" dicentang

masukkan deskripsi gambar di sini

c) Anda telah menetapkan referensi ke objek `Microsoft Visual Basic for Applications Extensibility secara manual

masukkan deskripsi gambar di sini

Cara 1 (Menggunakan GUID)

Saya biasanya menghindari cara ini karena saya harus mencari GUID di registri ... yang saya benci LOL. Lebih lanjut tentang GUID di sini .

Topik: Tambahkan Perpustakaan Referensi VBA melalui kode

Tautan : 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

Cara 2 (Langsung mereferensikan dll)

Kode ini menambahkan referensi ke 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

Catatan : Saya belum menambahkan Penanganan Kesalahan. Disarankan bahwa dalam kode Anda yang sebenarnya, gunakanlah :)

EDIT Dipukuli oleh mischab1:)


2
Jadi tampaknya alih-alih menambahkan referensi dengan tangan, saya perlu menambahkan referensi terpisah secara manual dan mengubah izin excel? Memang itu akan lebih baik di masa depan, tetapi tampaknya sedikit lucu sekarang.
Ommit

2
Ya kedengarannya lucu tapi begitulah keadaannya saat ini :)
Siddharth Rout

1
Jawaban yang bagus. Untuk diketahui pengguna ini, perhatikan bahwa Anda masih tidak dapat menggunakan Word / PowerPoint / objek lain atau Enum di luar fungsi atau prosedur dengan ini karena kompilator akan gagal sebelum WORKBOOK_OPENacara mulai dijalankan. Jadi Anda tidak dapat membuat objek Word Publik dan Anda tidak dapat menentukan tipe parameter sebagai tipe Word / PPT (misalnya Anda tidak dapat melakukan sesuatu seperti itu Sub CopyActiveChartToWord(FormatType as WdPasteDataType)).
s_a

3
Tidakkah lokasi folder dari beberapa DLL berbeda di versi Windows yang berbeda? (mis. Win 8, Win 7, Vista, XP, dll). Dalam hal ini, tidakkah menambahkan GUID akan lebih aman (jika pengguna Anda menggunakan versi Win yang berbeda)?
johny mengapa

10
Sebagai catatan, GUID untuk MS Scripting Runtime adalah {420B2830-E718-11CF-893D-00A0C9054228}. Anda dapat mengetahui GUID lain dengan menambahkannya secara manual, kemudian mengulanginya masing-masing Ref ThisWorkbook.VBProject.Referencesdan menggunakanDebug.Print Ref.Name, Ref.Guid
serangan udara

26

Ada dua cara untuk menambahkan referensi menggunakan VBA. .AddFromGuid(Guid, Major, Minor)dan .AddFromFile(Filename). Mana yang terbaik tergantung pada apa yang Anda coba tambahkan referensi. Saya hampir selalu menggunakan .AddFromFilekarena hal yang saya rujuk adalah Proyek VBA Excel lainnya dan tidak ada di Windows Registry.

Kode contoh yang Anda tunjukkan akan menambahkan referensi ke buku kerja tempat kode tersebut masuk. Saya biasanya tidak melihat ada gunanya melakukan itu karena 90% dari waktu, sebelum Anda dapat menambahkan referensi, kode tersebut telah gagal untuk dikompilasi karena referensinya hilang. (Dan jika tidak gagal dikompilasi, Anda mungkin menggunakan pengikatan terlambat dan Anda tidak perlu menambahkan referensi.)

Jika Anda mengalami masalah dalam menjalankan kode, ada dua kemungkinan masalah.

  1. Untuk dengan mudah menggunakan model objek VBE, Anda perlu menambahkan referensi ke Microsoft Visual Basic untuk Ekstensibilitas Aplikasi . (VBIDE)
  2. Untuk menjalankan kode VBA Excel yang mengubah apa pun di VBProject, Anda perlu mempercayai akses ke Model Objek Proyek VBA . (Di Excel 2010, ini terletak di Pusat Kepercayaan - Pengaturan Makro.)

Selain itu, jika Anda bisa sedikit lebih jelas tentang apa pertanyaan Anda atau apa yang Anda coba lakukan yang tidak berhasil, saya dapat memberikan jawaban yang lebih spesifik.


10

Menjelajahi registri untuk mencari panduan atau menggunakan jalur, metode mana yang terbaik. Jika menjelajahi registri tidak lagi diperlukan, bukankah itu cara yang lebih baik untuk menggunakan guids? Office tidak selalu diinstal di direktori yang sama. Jalur instalasi dapat diubah secara manual. Juga nomor versi adalah bagian dari jalan. Saya tidak pernah bisa meramalkan bahwa Microsoft akan menambahkan '(x86)' ke 'Program Files' sebelum diperkenalkannya prosesor 64 bit. Jika memungkinkan saya akan mencoba menghindari penggunaan jalan setapak.

Kode di bawah ini diturunkan dari jawaban Siddharth Rout, dengan fungsi tambahan untuk mendaftar semua referensi yang digunakan dalam buku kerja yang aktif. Bagaimana jika saya membuka buku kerja saya di versi Excel yang lebih baru? Akankah buku kerja tetap berfungsi tanpa mengadaptasi kode VBA? Saya sudah memeriksa bahwa panduan untuk Office 2003 dan 2010 identik. Semoga Microsoft tidak mengubah panduan di versi mendatang.

Argumen 0,0 (dari .AddFromGuid) harus menggunakan versi referensi terbaru (yang belum dapat saya uji).

Apa yang kamu pikirkan Tentu saja kami tidak dapat memprediksi masa depan tetapi apa yang dapat kami lakukan untuk membuat versi kode kami terbukti?

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

Kode di atas tidak lagi memerlukan referensi ke objek "Microsoft Visual Basic for Applications Extensibility".


3
Perhatikan bahwa Anda harus memiliki makro yang diaktifkan dan Percayai Akses ke Proyek Visual Basic diperiksa (poin a dan b sebagai jawaban dari @Siddharth_Rout), tetapi +1 untuk menghilangkan referensi VBIDE! Juga, saya menghargai bahwa DebugPrintExistingRefs mengeluarkannya dalam format untuk menyalin dan menempel baris ke dalam kode.
GlennFromIowa

7

Berikut adalah cara mendapatkan Panduan secara terprogram! Anda kemudian dapat menggunakan panduan / jalur file ini dengan jawaban di atas untuk menambahkan referensi!

Referensi: 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

Berikut adalah kode yang sama tetapi mencetak ke terminal jika Anda tidak ingin mendedikasikan lembar kerja untuk keluaran.

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 
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.