excel - sub - Cómo agregar una referencia mediante programación
solver excel 2010 vba (4)
He escrito un programa que ejecuta y envía mensajes a Skype con información cuando termina. Necesito agregar una referencia para Skype4COM.dll
para poder 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.
Parece que no puedo entender cómo 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 formas de hacerlo en Access Vb.net y sigue apareciendo un código similar a este, 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 ahora, en las soluciones presentadas, para agregar la referencia mediante programación necesitaré 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 otro pensamiento sería genial.
¡Aquí está cómo obtener el Guid programáticamente! ¡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
Aquí está el mismo código, pero imprimiendo en la terminal si no desea dedicar una hoja de trabajo a la salida.
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
Buscando en el registro las guías o el uso de rutas, qué método es el mejor. Si ya no es necesario explorar el registro, ¿no será la mejor manera de utilizar las guías? Office no siempre está instalado 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 procesadores de 64 bits. Si es posible, trataría de evitar usar un camino.
El siguiente código 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 pautas 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 tus 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 "Extensibilidad de Microsoft Visual Basic para Aplicaciones".
Hay dos formas 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 se encuentra el código. En general, no veo ningún sentido al hacerlo porque el 90% del tiempo, antes de que pueda agregar la referencia, el código ya no se pudo compilar porque la referencia falta (Y si no falló en la compilación, probablemente esté utilizando el enlace tardío y no necesita agregar una referencia).
Si tiene problemas para ejecutar el código, existen dos posibles problemas.
- Para usar fácilmente el modelo de objetos de VBE, debe agregar una referencia a Microsoft Visual Basic para Extensibilidad de la aplicación . (VBIDE)
- Para ejecutar el código Excel VBA que cambia cualquier cosa en un VBProject, necesita Confiar en el acceso al Modelo de Objeto del Proyecto VBA . (En Excel 2010, se encuentra en el Centro de confianza - Configuración de macros).
Aparte de eso, si puede aclarar un poco más sobre cuál es su pregunta o qué está tratando de hacer, eso no está funcionando, podría darle una respuesta más específica.
Ommit
Hay dos maneras de agregar referencias a través de VBA a sus proyectos
1) Usando GUID
2) Directamente referenciando el dll.
Déjame cubrir ambos.
Pero primero estas son 3 cosas de las que debes ocuparte
a) Las macros deberían estar habilitadas
b) En la configuración de Seguridad, asegúrese de que esté marcado "Confiar en el acceso al proyecto de Visual Basic"
c) Ha establecido manualmente una referencia al objeto `Microsoft Visual Basic para Aplicaciones Extensibilidad ''
Camino 1 (usando GUID)
Normalmente evito esto porque tengo que buscar el GUID en el registro ... que odio LOL. Más sobre GUID here .
Tema: Agregar una biblioteca de referencia de VBA a través del código
Enlace : http://www.vbaexpress.com/kb/getarticle.php?kb_id=267
Modo 2 (hacer referencia directa al dll)
Este código agrega 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 agregué el Manejo de errores. Se recomienda que en tu código real, lo uses :)
EDIT Beaten por mischab1
:)