Come aggiungere un riferimento a livello di codice

Ho scritto un programma che esegue e invia messaggi a Skype con le informazioni quando finisce. Devo aggiungere un riferimento per Skype4COM.dll per poter inviare un messaggio tramite Skype. Abbiamo una decina 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 il riferimento a mano. Avevo programmato di inserire 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 tramite 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 continua a spuntare, 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, al fine di aggiungere il riferimento a livello di codice, è necessario aggiungere un riferimento a mano e modificare il Trust Center, che è più che l’aggiunta del riferimento. Anche se suppongo che se seguirò le soluzioni proposte, sarò in grado di aggiungere riferimenti futuri a livello di codice. Il che probabilmente ne vale la pena.

Ogni ulteriore pensiero sarebbe fantastico.

ommit

Esistono due modi per aggiungere riferimenti tramite VBA ai tuoi progetti

1) Utilizzo del GUID

2) Facendo direttamente riferimento alla DLL.

Lasciami coprire entrambi.

Ma prima queste sono 3 cose di cui hai bisogno per prendertene cura

a) Le macro dovrebbero essere abilitate

b) Nelle impostazioni di sicurezza, assicurarsi che “Trust Access To Visual Basic Project” sia selezionato

inserisci la descrizione dell'immagine qui

c) È stato impostato manualmente un riferimento all’object “Microsoft Visual Basic per estensibilità delle applicazioni”

inserisci la descrizione dell'immagine qui

Way 1 (Utilizzo di GUID)

Di solito evito in questo modo in quanto devo cercare il GUID nel registro … che odio LOL. Altro su GUID qui .

Argomento: aggiungere una libreria di riferimento VBA tramite codice

Link : http://www.vbaexpress.com/kb/getarticle.php?kb_id=267


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 Gestione degli errori. Si raccomanda che nel tuo codice reale, usalo 🙂

EDIT Beaten di mischab1 🙂

Ci sono due modi per aggiungere riferimenti usando VBA. .AddFromGuid(Guid, Major, Minor) e .AddFromFile(Filename) . Qual è il migliore dipende da ciò che stai cercando di aggiungere un riferimento. Uso quasi sempre .AddFromFile perché le cose a cui faccio riferimento sono altri progetti VBA di Excel e non si trovano nel registro di Windows.

Il codice di esempio che stai visualizzando aggiungerà un riferimento alla cartella di lavoro in cui si trova il codice. Generalmente non vedo alcun punto nel farlo perché il 90% delle volte, prima di poter aggiungere il riferimento, il codice ha già fallito la compilazione perché manca il riferimento. (E se non è riuscito a compilare, probabilmente stai utilizzando l’associazione in ritardo e non è necessario aggiungere un riferimento).

Se hai problemi a far funzionare il codice, ci sono due possibili problemi.

  1. Per utilizzare facilmente il modello a oggetti VBE, è necessario aggiungere un riferimento a Microsoft Visual Basic per Estensibilità applicazione . (VBIDE)
  2. Per eseguire il codice VBA di Excel che modifica qualsiasi cosa in un VBProject, è necessario fidarsi dell’accesso al modello di oggetti del progetto VBA . (In Excel 2010, si trova nel Trust Center – Impostazioni macro.)

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

Navigando nel registro per i GUID o usando i percorsi, quale metodo è il migliore. Se la navigazione nel registro non è più necessaria, non sarà il modo migliore di usare i guids? Office non è sempre installato nella stessa directory. Il percorso di installazione può essere modificato manualmente. Anche il numero di versione è una 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 ansible, proverei a evitare di usare un percorso.

Il codice seguente deriva dalla risposta di Siddharth Rout, con una funzione aggiuntiva per elencare tutti i riferimenti utilizzati nella cartella di lavoro triggers. Cosa succede se apro la mia cartella di lavoro in una versione successiva di Excel? La cartella di lavoro funzionerà ancora senza l’adattamento del codice VBA? Ho già controllato che i GUID per l’ufficio 2003 e 2010 sono identici. Speriamo che Microsoft non cambi i guids nelle versioni future.

Gli argomenti 0,0 (da .AddFromGuid) dovrebbero usare l’ultima versione di un riferimento (che non ho potuto testare).

Quali sono i tuoi pensieri? Naturalmente non possiamo prevedere 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 sopra non ha più bisogno del riferimento all’object “Microsoft Visual Basic per l’estensibilità delle applicazioni”.

Ecco come ottenere il Guid a livello di programmazione! È quindi ansible utilizzare questi guids / filepaths con una risposta sopra per aggiungere il riferimento!

Riferimento: http://www.vbaexpress.com/kb/getarticle.php?kb_id=278

 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 With ThisWorkbook.Sheets(1) .Cells.Clear .Range("A1") = "Reference name" .Range("B1") = "Full path to reference" .Range("C1") = "Reference GUID" End With For i = 1 To ThisWorkbook.VBProject.References.Count With ThisWorkbook.VBProject.References(i) ThisWorkbook.Sheets(1).Range("A65536").End(xlUp).Offset(1, 0) = .Name ThisWorkbook.Sheets(1).Range("A65536").End(xlUp).Offset(0, 1) = .FullPath ThisWorkbook.Sheets(1).Range("A65536").End(xlUp).Offset(0, 2) = .GUID End With Next i On Error GoTo 0 End Sub 

Ecco lo stesso codice, ma stampando sul terminale se non si desidera 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