Programlı olarak nasıl referans eklenir


89

Bittiğinde Skype'ı çalıştıran ve bilgi ile mesaj gönderen bir program yazdım. Skype4COM.dllSkype üzerinden mesaj göndermek için referans eklemem gerekiyor . Bir ağda bir düzine kadar bilgisayarımız ve paylaşılan bir dosya sunucumuz (diğer şeylerin yanı sıra) var. Diğer tüm bilgisayarların bu programı çalıştırabilmesi gerekir. Referansı elle oluşturmaktan kaçınmayı umuyordum. Referansı paylaşılan bir konuma koymayı ve program çalıştığında programlı olarak eklemeyi planlamıştım.

VBA kullanarak Excel 2007'ye programlı olarak nasıl başvuru ekleyeceğimi çözemiyorum. Manuel olarak nasıl yapılacağını biliyorum: Açın VBE --> Tools --> References --> browse --_> File Location and Name. Ama bu benim amaçlarım için pek kullanışlı değil. Bunu Access Vb.net'te yapmanın yolları olduğunu biliyorum ve buna benzer bir kod ortaya çıkmaya devam ediyor, ancak anladığımdan emin değilim veya alakalı olup olmadığını:

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

Şimdiye kadar, sunulan çözümlerde referansı programlı olarak eklemek için elle bir referans eklemem ve referansı eklemekten daha fazlası olan Güven Merkezini değiştirmem gerekecek. Yine de önerilen çözümleri uygularsam ilerideki referansları programlı olarak ekleyebileceğimi tahmin ediyorum. Muhtemelen bu çabaya değer.

Başka düşünceler olursa harika olur.


2
Excel 2010 altında referansı eklemeden CreateObject () kullanabilir
Qbik

1
Bunun neden yeniden canlandığına dair hiçbir fikriniz yok - ancak erken / geç bağlanmaya bir göz atın. Bir referans eklerseniz (elle veya programla), kodunuzu belirli bir sürüme bağlar. Örneğin, Excel 11 kitaplığı Excel 2003'e bağlıdır. İstediğiniz buysa, her şey iyidir, ancak oldukça sık (özellikle çalıştığım yerde) 2003, 2007 ve 2010'da çalışmasına ihtiyacım var.
Darren Bartrup-Cook

Yanıtlar:


110

Ommit

Projelerinize VBA aracılığıyla referans eklemenin iki yolu vardır

1) GUID kullanarak

2) Doğrudan dll'ye atıfta bulunmak.

İkisini de ele alayım.

Ama önce bunlar ilgilenmeniz gereken 3 şey

a) Makrolar etkinleştirilmelidir

b) Güvenlik ayarlarında, "Visual Basic Project'e Erişime Güven" seçeneğinin işaretli olduğundan emin olun.

görüntü açıklamasını buraya girin

c) `` Microsoft Visual Basic for Applications Extensibility "nesnesine manuel olarak bir başvuru ayarladınız

görüntü açıklamasını buraya girin

Yol 1 (GUID Kullanarak)

LOL'den nefret ettiğim ... GUID'i kayıt defterinde aramak zorunda olduğum için genellikle bu şekilde kaçınıyorum. GUID hakkında daha fazla bilgiyi burada bulabilirsiniz .

Konu: Kod aracılığıyla bir VBA Referans Kitaplığı ekleyin

Bağlantı : 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 (Doğrudan dll'ye gönderme)

Bu kod, bir referans ekler 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

Not : Hata İşleme'yi eklemedim. Gerçek kodunuzda kullanmanız önerilir :)

EDIT Beaten by mischab1:)


2
Öyleyse, referansı elle eklemek yerine elle ayrı bir referans eklemem ve excel izinlerini değiştirmem gerekiyor gibi görünüyor? Gelecekte daha iyi olacağı kabul edildi, ama şimdi biraz komik görünüyor.
Ommit

2
Evet kulağa komik geliyor ama o zaman şu anda böyle :)
Siddharth Rout

1
Mükemmel cevap. Bilginize, bununla birlikte herhangi bir Word / PowerPoint / diğer nesneyi veya Enum'u bir işlevin veya yordamın dışında kullanamayacağınıza dikkat edin, çünkü WORKBOOK_OPENolay yürütülmeye başlamadan önce derleyici başarısız olacaktır . Dolayısıyla, bir Genel Word nesnesi oluşturamazsınız ve bir parametrenin türünü bir Word / PPT türü olarak tanımlayamazsınız (örneğin, böyle bir şey yapamazsınız Sub CopyActiveChartToWord(FormatType as WdPasteDataType)).
s_a

3
Bazı DLL'lerin klasör konumları Windows'un farklı sürümlerinde farklı olmayacak mı? (örneğin Win 8, Win 7, Vista, XP, vb.). Hangi durumda GUID ile ekleme yapmak daha güvenli olmaz (kullanıcılarınız farklı Win sürümlerindeyse)?
johny why

10
Kayıt için, MS Scripting Runtime GUID değeri {420B2830-E718-11CF-893D-00A0C9054228}. Diğer GUID'leri manuel olarak ekleyerek, ardından her birinde döngü yaparak Ref ThisWorkbook.VBProject.ReferencesveDebug.Print Ref.Name, Ref.Guid
airstrike

26

VBA kullanarak referans eklemenin iki yolu vardır. .AddFromGuid(Guid, Major, Minor)ve .AddFromFile(Filename). Hangisinin en iyisi, neye referans eklemeye çalıştığınıza bağlıdır. Neredeyse her zaman kullanıyorum .AddFromFileçünkü referans verdiğim şeyler diğer Excel VBA Projeleri ve Windows Kayıt Defteri'nde değiller.

Gösterdiğiniz örnek kod, kodun içinde bulunduğu çalışma kitabına bir referans ekleyecektir. Genelde bunu yaparken herhangi bir nokta görmüyorum çünkü zamanın% 90'ı, referansı eklemeden önce kod zaten derlenemedi çünkü referans eksik. (Ve derleme başarısız olmadıysa, muhtemelen geç bağlama kullanıyorsunuzdur ve bir referans eklemenize gerek yoktur.)

Çalıştırmak için kodu almakta sorun yaşıyorsanız, iki olası sorun vardır.

  1. VBE'nin nesne modelini kolayca kullanmak için, Uygulama Genişletilebilirliği için Microsoft Visual Basic'e bir referans eklemeniz gerekir . (VBIDE)
  2. Bir VBProject'teki herhangi bir şeyi değiştiren Excel VBA kodunu çalıştırmak için, VBA Proje Nesne Modeli erişimine güvenmeniz gerekir . (Excel 2010'da, Güven Merkezi - Makro Ayarları'nda bulunur.)

Bunun dışında, sorunuzun ne olduğu veya neyi yapmaya çalıştığınız konusunda biraz daha net olabilirseniz, daha spesifik bir cevap verebilirim.


10

Kılavuzlar için kayıt defterine göz atmak veya yolları kullanmak, hangi yöntem en iyisidir. Kayıt defterine göz atmak artık gerekli değilse, kılavuzları kullanmanın daha iyi bir yolu olmayacak mı? Office her zaman aynı dizine yüklenmez. Kurulum yolu manuel olarak değiştirilebilir. Ayrıca sürüm numarası yolun bir parçasıdır. Microsoft'un 64 bit işlemcilerden önce 'Program Dosyaları'na' (x86) 'ekleyeceğini asla tahmin edemezdim. Mümkünse bir yol kullanmaktan kaçınmaya çalışırdım.

Aşağıdaki kod, etkin çalışma kitabında kullanılan tüm başvuruları listelemek için ek bir işlevle birlikte Siddharth Rout'un yanıtından türetilmiştir. Çalışma kitabımı Excel'in sonraki bir sürümünde açarsam ne olur? Çalışma kitabı, VBA kodunu uyarlamadan yine de çalışacak mı? 2003 ve 2010 ofis kılavuzlarının aynı olup olmadığını zaten kontrol ettim. Umarım Microsoft gelecekteki sürümlerde kılavuzları değiştirmez.

0,0 (.AddFromGuid'den) bağımsız değişkenleri, bir başvurunun (test edemediğim) en son sürümünü kullanmalıdır.

Düşüncelerin neler? Elbette geleceği tahmin edemeyiz ama kod sürümümüzü kanıtlamak için ne yapabiliriz?

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

Yukarıdaki kod, artık "Microsoft Visual Basic for Applications Extensibility" nesnesine başvurmaya ihtiyaç duymamaktadır.


3
Makroların etkinleştirilmesi ve Visual Basic Project'e Güven Erişiminin işaretlenmesi gerektiğini unutmayın ( @Siddharth_Rout'tan yanıt olarak a ve b'yi işaret eder), ancak VBIDE referansını ortadan kaldırmak için +1! Ayrıca, DebugPrintExistingRefs'in satırı koda kopyalayıp yapıştıracak biçimde çıktısını aldığını da takdir ediyorum.
GlennFromIowa

7

Kılavuzları programlı olarak nasıl edineceğiniz aşağıda açıklanmıştır! Bu kılavuzları / dosya yollarını, referansı eklemek için yukarıdaki yanıtla birlikte kullanabilirsiniz!

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

İşte aynı kod ama çıktıya bir çalışma sayfası ayırmak istemiyorsanız terminale yazdırın.

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 
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.