Come aggiungere un riferimento a livello di codice


89

Ho scritto un programma che funziona e invia messaggi a Skype con le informazioni quando finisce. Devo aggiungere un riferimento per Skype4COM.dllper inviare un messaggio tramite Skype. Abbiamo una dozzina di computer su una rete e un file server condiviso (tra le altre cose). Tutti gli altri computer devono essere in grado di eseguire questo programma. Speravo di evitare di impostare manualmente il riferimento. Avevo pianificato di mettere il riferimento in una posizione condivisa e di aggiungerlo a livello di codice durante l'esecuzione del programma.

Non riesco a capire come aggiungere un riferimento a livello di codice a Excel 2007 utilizzando VBA. So come farlo manualmente: Apri VBE --> Tools --> References --> browse --_> File Location and Name. Ma non è molto utile per i miei scopi. So che ci sono modi per farlo in Access Vb.net e codice simile a questo continuava a comparire, ma non sono sicuro di averlo capito o se è rilevante:

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

Finora, nelle soluzioni presentate, per aggiungere il riferimento a livello di codice dovrò aggiungere manualmente un riferimento e modificare il Centro protezione, che è più che aggiungere il riferimento. Anche se immagino che se seguo le soluzioni proposte sarò in grado di aggiungere riferimenti futuri a livello di programmazione. Il che probabilmente ne vale la pena.

Qualsiasi ulteriore pensiero sarebbe fantastico.


2
è possibile utilizzare CreateObject () senza aggiungere riferimenti in Excel 2010
Qbik

1
Non ho idea del perché sia ​​tornato in vita, ma dai un'occhiata alla rilegatura anticipata / tardiva. Se aggiungi un riferimento (manualmente o in modo programmatico), il codice viene collegato a una versione specifica. es. la libreria Excel 11 è legata a Excel 2003. Va bene se è quello che vuoi, ma abbastanza spesso (soprattutto dove lavoro) ne ho bisogno per funzionare nel 2003, 2007 e 2010.
Darren Bartrup-Cook

Risposte:


110

Ommit

Esistono due modi per aggiungere riferimenti tramite VBA ai progetti

1) Utilizzo del GUID

2) Riferimento diretto alla dll.

Fammi coprire entrambi.

Ma prima queste sono 3 cose di cui devi prenderti cura

a) Le macro dovrebbero essere abilitate

b) Nelle impostazioni di protezione, assicurarsi che "Considera attendibile l'accesso al progetto Visual Basic" sia selezionato

inserisci qui la descrizione dell'immagine

c) Hai impostato manualmente un riferimento all'oggetto "Estensibilità di Microsoft Visual Basic, Applications"

inserisci qui la descrizione dell'immagine

Modo 1 (utilizzando GUID)

Di solito evito in questo modo perché devo cercare il GUID nel registro ... che odio LOL. Maggiori informazioni su GUID qui .

Argomento: aggiungere una libreria di riferimento VBA tramite codice

Collegamento : 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 (riferimento diretto alla dll)

Questo codice aggiunge un riferimento a 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

Nota : non ho aggiunto la gestione degli errori. Si consiglia di utilizzarlo nel codice effettivo :)

EDIT Picchiato da mischab1:)


2
Quindi sembra che invece di aggiungere il riferimento a mano devo aggiungere un riferimento separato a mano e modificare i permessi di Excel? Certo, andrà meglio in futuro, ma ora sembra un po 'divertente.
Ommit

2
Sì, suona divertente, ma al momento è così :)
Siddharth Rout

1
Bella risposta. Cordiali saluti, gli utenti di questo, notano che non è ancora possibile utilizzare alcun oggetto Word / PowerPoint / altro o Enum al di fuori di una funzione o procedura con questo poiché il compilatore fallirà prima che l' WORKBOOK_OPENevento inizi l'esecuzione. Quindi non puoi creare un oggetto Word pubblico e non puoi definire il tipo di un parametro come tipo Word / PPT (ad esempio non puoi fare qualcosa di simile Sub CopyActiveChartToWord(FormatType as WdPasteDataType)).
s_ un

3
Le posizioni delle cartelle di alcune DLL non saranno diverse nelle diverse versioni di Windows? (ad esempio Win 8, Win 7, Vista, XP, ecc.). In tal caso, l'aggiunta tramite GUID non sarà più sicura (se i tuoi utenti sono su diverse versioni di Win)?
johny why

10
Per la cronaca, il GUID per MS Scripting Runtime è {420B2830-E718-11CF-893D-00A0C9054228}. Puoi scoprire altri GUID aggiungendoli manualmente, quindi scorrendoli Ref ThisWorkbook.VBProject.Referencese usandoDebug.Print Ref.Name, Ref.Guid
airstrike

26

Esistono due modi per aggiungere riferimenti utilizzando VBA. .AddFromGuid(Guid, Major, Minor)e .AddFromFile(Filename). Qual è il migliore dipende da cosa stai cercando di aggiungere un riferimento. Lo uso quasi sempre .AddFromFileperché le cose a cui faccio riferimento sono altri progetti VBA di Excel e non sono nel registro di Windows.

Il codice di esempio che stai mostrando aggiungerà un riferimento alla cartella di lavoro in cui si trova il codice. Generalmente non vedo alcun motivo per farlo perché il 90% delle volte, prima di poter aggiungere il riferimento, il codice non è già stato compilato perché manca il riferimento. (E se la compilazione non è riuscita, probabilmente stai utilizzando l'associazione tardiva e non è necessario aggiungere un riferimento.)

In caso di problemi durante l'esecuzione del codice, esistono due possibili problemi.

  1. Per utilizzare facilmente il modello a oggetti di VBE, è necessario aggiungere un riferimento a Microsoft Visual Basic per Application Extensibility . (VBIDE)
  2. Per eseguire il codice VBA di Excel che modifica qualsiasi cosa in un VBProject, è necessario considerare attendibile l'accesso al modello a oggetti del progetto VBA . (In Excel 2010, si trova nel Centro protezione - Impostazioni macro.)

A parte questo, se puoi essere un po 'più chiaro su quale sia la tua domanda o su cosa stai cercando di fare che non funziona, potrei dare una risposta più specifica.


10

Esplorando il registro per le guide o utilizzando i percorsi, qual è il metodo migliore. Se la navigazione nel registro non è più necessaria, non sarà il modo migliore per utilizzare le guide? Office non è sempre installato nella stessa directory. Il percorso di installazione può essere modificato manualmente. Anche il numero di versione fa parte del percorso. Non avrei mai potuto prevedere che Microsoft avrebbe mai aggiunto "(x86)" a "Programmi" prima dell'introduzione dei processori a 64 bit. Se possibile, tenterei di evitare di utilizzare un percorso.

Il codice seguente è derivato dalla risposta di Siddharth Rout, con una funzione aggiuntiva per elencare tutti i riferimenti utilizzati nella cartella di lavoro attiva. Cosa succede se apro la mia cartella di lavoro in una versione successiva di Excel? La cartella di lavoro funzionerà ancora senza adattare il codice VBA? Ho già verificato che le guide per Office 2003 e 2010 siano identiche. Speriamo che Microsoft non modifichi le guide nelle versioni future.

Gli argomenti 0,0 (da .AddFromGuid) dovrebbero utilizzare l'ultima versione di un riferimento (che non sono stato in grado di testare).

Quali sono i tuoi pensieri? Ovviamente non possiamo predire il futuro, ma cosa possiamo fare per rendere la nostra versione del codice prova?

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

Il codice precedente non richiede più il riferimento all'oggetto "Microsoft Visual Basic, Applications Extensibility".


3
Nota che devi avere le macro abilitate e Trust Access To Visual Basic Project controllato (punti aeb in risposta da @Siddharth_Rout), ma +1 per eliminare il riferimento VBIDE! Inoltre, apprezzo che DebugPrintExistingRefs lo restituisca nel formato per copiare e incollare la riga nel codice.
GlennFrom Iowa

7

Ecco come ottenere il Guid a livello di codice! È quindi possibile utilizzare queste guide / percorsi file con una risposta sopra per aggiungere il riferimento!

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

Ecco lo stesso codice ma stampa sul terminale se non vuoi dedicare un foglio di lavoro all'output.

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 
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.