2012-03-26 17 views
66

Ho scritto un programma che esegue e invia messaggi a Skype con informazioni al termine. Devo aggiungere un riferimento per Skype4COM.dll per 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.Come aggiungere un riferimento a livello di codice

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 il codice simile a questo continuava ad emergere, ma io non sono sicuro di aver capito, o se è rilevante:

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

Finora, nelle soluzioni presentate, in Per aggiungere il riferimento a livello di codice, è necessario aggiungere un riferimento a mano e modificare il Centro protezione - 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.

+1

è possibile utilizzare CreateObject() senza l'aggiunta di riferimento in Excel 2010 – Qbik

+0

idea del perché questo è venuto di nuovo vivo - ma dare un'occhiata al precoce/tardiva. Se aggiungi un riferimento (a mano o programmaticamente) lega il tuo codice a una versione specifica. per esempio. La libreria di Excel 11 è legata a Excel 2003. Tutto bene se è quello che vuoi, ma abbastanza spesso (specialmente dove lavoro) ho bisogno che funzioni per il 2003, il 2007 e il 2010. –

risposta

77

ommit

Ci sono due modi per aggiungere i riferimenti tramite VBA per i vostri progetti

1) Uso GUID

2) direttamente riferimento al dll.

Lasciami coprire entrambi.

Ma prima queste sono 3 cose è necessario prendersi cura di

a) macro devono essere abilitati

b) nelle impostazioni di sicurezza, in modo che "La fiducia di accesso al progetto Visual Basic" viene controllato

enter image description here

c) Hai ma nualmente impostare un riferimento a `Microsoft Visual Basic per Applications Extensibility" oggetto

enter image description here

Way 1 (Usando GUID)

Io di solito evitare questo modo devo cercare il GUID nel registro ... che odio LOL. Ulteriori informazioni su GUID here.

Topic: Aggiungere una biblioteca di riferimento VBA tramite codice

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


Way 2 (direttamente riferimento al 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 errori. Si raccomanda che nel codice vero e proprio, non usarlo :)

EDIT Picchiato da mischab1 :)

+4

+ 1 per i dettagli fantastici. Grande risposta. – Ommit

+0

Quindi sembra che invece di aggiungere il riferimento a mano ho bisogno di aggiungere un riferimento separato a mano e modificare le autorizzazioni di Excel? Certo sarà meglio in futuro, ma ora sembra un po 'strano. – Ommit

+0

Sì, sembra divertente ma allora è così che è al momento :) –

17

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 lo .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à non è riuscito a compilare perché manca il riferimento. (E se non è riuscito a compilare, si sta probabilmente utilizzando l'associazione tardiva e non è necessario aggiungere un riferimento.)

Se si verificano problemi durante l'esecuzione del codice, sono possibili due problemi.

  1. Al fine di utilizzare in modo semplice modello a oggetti del VBE, è necessario aggiungere un riferimento a Microsoft Visual Basic for Application estensibilità. (VBIDE)
  2. Per eseguire il codice VBA di Excel che modifica qualsiasi cosa in un VBProject, è necessario Accesso sicuro al modello oggetto 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, non è lavorando, potrei dare una risposta più specifica.

+0

+1 per pubblicarlo prima di me;) –

3

Navigando in Registro di sistema per GUID o utilizzando sentieri, quale metodo è 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 possibile, proverei a evitare di usare 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 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) devono utilizzare l'ultima versione di un riferimento (che non è stato possibile 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 riportato non richiede più il riferimento all'oggetto "Estensibilità di Microsoft Visual Basic".

+0

Nota che devi avere macro abilitate e Controllare l'accesso al progetto Visual Basic selezionato (indica aeb in [risposta] (https://stackoverflow.com/a/9880276/2712565) 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. – GlennFromIowa

2

Ecco come ottenere il Guid a livello di programmazione! È quindi possibile 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 
Problemi correlati