2010-10-01 37 views
5

Estoy implementando un módulo de VBA de estilo de límite temprano que necesita Scripting.Dictionary y RegExp.¿Cómo agrego programáticamente una referencia a un proyecto de VBA?

El script, de forma predecible, falla cuando se ejecuta en otra computadora. El usuario debe ir a Herramientas-> Referencia en el IDE de VBA y agregar manualmente una referencia a esas dos bibliotecas para que funcione.

Por lo tanto, yace el problema. Pedir al usuario final no técnico que vaya al IDE y agregar referencias manualmente es pedir demasiado.

La otra alternativa es reescribir todo (script muy largo escrito por otra persona) para utilizar el enlace tardío. Prefiero no tomar este camino si hay otros métodos.

Como altervative, algunas personas sugieren que se añada una referencia mediante programación de este modo:

Application.VBE.ActiveVBProject.References.AddFromFile [Path to library]

  1. ¿Es esta la solución correcta y si es así ¿hay desventajas de esta estrategia?
  2. De lo contrario, existen otros métodos que permitirán que el código permanezca enlazado previamente, pero no requieren que el usuario agregue referencias manualmente.

Sugerencias que implican llamadas directas a la API Win32/64 también son bienvenidas.

Gracias.

+0

El único inconveniente que se me ocurre al ir por la ruta VBE es que el usuario deberá habilitar específicamente el acceso programático al modelo de proyecto de VBA. Un problema bastante menor sin embargo. Esa es la ruta que tomaría si estuviera en su lugar. –

Respuesta

3

En mi propio entorno limitado (pequeño # de otras personas que usan hojas de cálculo que desarrollo, configuraciones de máquina relativamente estándar), si creo el archivo y agrego las referencias, y luego le doy una copia a alguien más, pueden abrirlo con sin problemas y sin tener que hacer nada, así que tenlo en cuenta con esta respuesta. (Me pregunto por qué eso no funciona para ti.) Además, esto fue con Excel.

En lugar de agregar una referencia desde una ruta de archivo, puede considerar usar la propiedad GUID en su lugar.

Aquí hay un código que una vez usé para crear automáticamente referencias en un libro de trabajo recién creado. (Es parte de un script que exportaría códigos, referencias y pruebas unitarias en hojas de trabajo al texto para usar con Subversion y luego reconstituir el libro de trabajo a partir de los archivos de texto.) Puede que le resulte útil para su situación. (EH y limpieza retiran para que sea breve ...)

'Export refs in existing workbook to text file 
Private Sub exportRefs_(srcWbk As Workbook) 
    Dim fs As FileSystemObject 
    Set fs = New FileSystemObject 

    Dim tsout As TextStream 
    Set tsout = fs.CreateTextFile(fs.BuildPath(getTargetPath_(srcWbk), "refs.refs")) 

    Dim ref As Reference 
    For Each ref In Application.ThisWorkbook.VBProject.References 
     Call tsout.WriteLine(ref.GUID) 
    Next ref 

    '<EH + cleanup...> 
End Sub 


'Add refs to newly created workbook based on previously exported text file 
Private Sub importRefs_(wbk As Workbook, path As String) 
    Dim fs As FileSystemObject 
    Set fs = New FileSystemObject 

    Dim tsin As TextStream 
    Set tsin = fs.OpenTextFile(path) 

    Dim line As String 
    Dim ref As Reference 

    While Not tsin.AtEndOfStream 
     line = tsin.ReadLine() 

     Set ref = Nothing 

     On Error Resume Next 
      Set ref = wbk.VBProject.References.AddFromGuid(line, 0, 0) 
     On Error GoTo 0 

     If ref Is Nothing Then 
      Debug.Print "add failed: " & line 
     End If 
    Wend 

    '<EH + cleanup...> 
End Sub 

Como dije, el medio ambiente limitado, pero espero que ayude.

+0

Parece interesante. Voy a tratar de salir. Gracias. ;-) – GeneQ

Cuestiones relacionadas