2012-03-26 33 views
66

He escrito un programa que ejecuta y envía un mensaje a Skype con información cuando termina. Necesito agregar una referencia para Skype4COM.dll para enviar un mensaje a través de Skype. Tenemos una docena de computadoras en una red y un servidor de archivos compartido (entre otras cosas). Todas las otras computadoras necesitan poder ejecutar este programa. Esperaba evitar configurar la referencia a mano. Había planeado poner la referencia en una ubicación compartida y agregarla programáticamente cuando se ejecutó el programa.Cómo agregar una referencia mediante programación

Parece que no puedo encontrar la manera de agregar una referencia programáticamente a Excel 2007 usando VBA. Sé cómo hacerlo manualmente: abra VBE --> Tools --> References --> browse --_> File Location and Name. Pero eso no es muy útil para mis propósitos. Sé que hay maneras de hacerlo en Access Vb.net y código similar a este seguía apareciendo, pero no estoy seguro de entenderlo, o si es relevante:

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

Hasta el momento, en las soluciones presentadas, en Para agregar la referencia mediante programación, tendré que agregar una referencia a mano y cambiar el Centro de confianza, que es más que solo agregar la referencia. Aunque supongo que si sigo con las soluciones propuestas, podré agregar futuras referencias programáticamente. Lo que probablemente hace que valga la pena el esfuerzo.

Cualquier otra idea sería genial.

+1

puede utilizar CreateObject() sin adición de referencia en virtud de Excel 2010 – Qbik

+0

Ni idea de por qué esto ha cobrado vida de nuevo - pero echar un vistazo a temprana/tardía de unión. Si agrega una referencia (ya sea a mano o mediante programación) vincula su código a una versión específica. p.ej. La biblioteca de Excel 11 está vinculada a Excel 2003. Todo bien si eso es lo que quiere, pero con bastante frecuencia (especialmente donde trabajo) Necesito que funcione en 2003, 2007 y 2010. –

Respuesta

77

Ommit

Hay dos formas de añadir referencias a través de VBA para sus proyectos

1) Uso de GUID

2) referencia directa a la DLL.

Déjame cubrir ambos.

Pero primero estos son 3 cosas que hay que tener cuidado de

a) macros deben estar habilitadas

b) En Configuración de seguridad, asegúrese de que "La confianza de acceso a proyectos de Visual Basic" se comprueba

enter image description here

c) tienes ma establecer nuamente una referencia a `Microsoft Visual Basic para aplicaciones de extensibilidad" objeto

enter image description here

Camino 1 (Uso de GUID)

por lo general evitar de esta manera ya que tengo que buscar el GUID en el registro ... que odio LOL. Más sobre GUID here.

Tema: Añadir una biblioteca de referencia de VBA a través de código

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


manera 2 (referencia directa a la DLL)

Este código añade una referencia 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: No he agregado Error Handling. Se recomienda que en su código real, lo uso :)

EDITAR Golpeado por mischab1 :)

+4

+ 1 para detalles increíbles Gran respuesta. – Ommit

+0

Parece que en lugar de agregar la referencia manualmente, necesito agregar una referencia separada a mano y cambiar los permisos de Excel. De acuerdo, será mejor en el futuro, pero ahora parece un poco gracioso. – Ommit

+0

Sí, suena raro, pero así es en este momento :) –

17

Hay dos maneras de agregar referencias usando VBA. .AddFromGuid(Guid, Major, Minor) y .AddFromFile(Filename). Cuál es mejor depende de lo que está tratando de agregar una referencia. Casi siempre uso .AddFromFile porque las cosas a las que me refiero son otros proyectos de Excel VBA y no están en el registro de Windows.

El código de ejemplo que está mostrando agregará una referencia al libro en el que está el código. En general, no veo ningún sentido al hacerlo porque el 90% del tiempo, antes de poder agregar la referencia, el código tiene ya no pudo compilar porque falta la referencia. (Y si no falló en la compilación, probablemente esté utilizando el enlace tardío y no necesite agregar una referencia).

Si tiene problemas para ejecutar el código, hay dos posibles cuestiones.

  1. Con el fin de utilizar simplemente modelo de objetos de la VBE, es necesario agregar una referencia a Microsoft Visual Basic para Aplicación extensibilidad. (VBIDE)
  2. Para ejecutar el código Excel VBA que cambia cualquier cosa en un VBProject, necesita Confiar en el acceso al Modelo de objetos del proyecto VBA. (En Excel 2010, se encuentra en el Centro de confianza - Configuración de macros.)

Aparte de eso, si puede ser un poco más claro sobre cuál es su pregunta o qué está tratando de hacer eso no es t trabajando, podría dar una respuesta más específica.

+0

+1 para publicarlo delante de mí;) –

3

Navegar por el registro de los GUID o el uso de caminos, que es el mejor método. Si ya no es necesario explorar el registro, ¿no será la mejor manera de utilizar las guías? Office no siempre se instala en el mismo directorio. La ruta de instalación puede ser alterada manualmente. Además, el número de versión es una parte de la ruta. Nunca podría haber predicho que Microsoft agregaría alguna vez '(x86)' a 'Archivos de programa' antes de la introducción de los procesadores de 64 bits. De ser posible, trataría de evitar usar una ruta.

El código siguiente se deriva de la respuesta de Siddharth Rout, con una función adicional para enumerar todas las referencias que se utilizan en el libro de trabajo activo. ¿Qué sucede si abro mi libro de trabajo en una versión posterior de Excel? ¿Funcionará el libro de trabajo sin adaptar el código VBA? Ya he comprobado que las guías para Office 2003 y 2010 son idénticas. Esperemos que Microsoft no cambie las guías en futuras versiones.

Los argumentos 0,0 (de .AddFromGuid) deberían usar la última versión de una referencia (que no he podido probar).

¿Cuáles son sus pensamientos? Por supuesto, no podemos predecir el futuro, pero ¿qué podemos hacer para que nuestra versión de código sea a prueba?

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 

El código anterior ya no necesita la referencia al objeto "Microsoft Visual Basic para aplicaciones extensibles".

+0

Tenga en cuenta que debe tener las macros habilitadas y Confiar en el acceso al proyecto de Visual Basic verificado (puntos ayb en [respuesta] (https://stackoverflow.com/a/9880276/2712565) desde @Siddharth_Rout), pero +1 para eliminar la referencia VBIDE. Además, agradezco que DebugPrintExistingRefs lo emita en el formato para copiar y pegar la línea en el código. – GlennFromIowa

2

¡Aquí está cómo obtener el Guid programmatically! ¡Luego puede usar estas guids/filepaths con la respuesta anterior para agregar la referencia!

Referencia: 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 
Cuestiones relacionadas