Solución:
Por favor, eche un vistazo a “VBA Early Binding” y “VBA Late Binding”. para conocer las ventajas y desventajas de ambos métodos.
Está utilizando Earling Binding en esta línea: Set oFS = New FileSystemObject
. “Nuevo” es un buen indicador de que se utiliza la vinculación anticipada. Es por eso que debe habilitar una referencia en cada máquina donde se ejecuta la macro.
Si usa Enlace tardío, no es necesario que habilite las referencias. La macro funcionaría en todas las máquinas.
Puede convertir Early Binding
Dim oFS As FileSystemObject
Set oFS = New FileSystemObject
a la vinculación tardía
Dim oFS As Object
Set oFS = CreateObject("Scripting.FileSystemObject")
Atención: Si utiliza Enlace tardío, el sistema desconoce los valores numéricos subyacentes de las variables con nombre. Tienes que convertir esas variables nombradas a su valor numérico correspondiente.
Para obtener el valor numérico, vuelva a habilitar temporalmente su biblioteca (p. Ej. Tiempo de ejecución de secuencias de comandos de Microsoft), vaya al editor de VBA y abra la ventana inmediata (CONTROL+GRAMO). Escribir por ejemplo ?TemporaryFolder
en la ventana inmediata y presione enter. Como ves en la captura de pantalla 2
es el valor de nuestra variable nombrada TemporaryFolder
Repita los pasos para todas las demás variables problemáticas y reemplácelas con su valor. Finalmente, desmarque la referencia de la biblioteca y su código se ejecutará en todas las máquinas, ya sea que la biblioteca esté habilitada o no.
oFS.GetSpecialFolder(TemporaryFolder) 'with Early Binding
oFS.GetSpecialFolder(2) 'with Late Binding
Es bueno saber que
- El enlace temprano (enlaces de referencia comprobados explícitamente) es útil para el desarrollo o la depuración, debido al editor de VBA Intellisense, un fuerte control de tipo de objeto y constantes con nombre. También se informa que es más rápido.
- El enlace tardío (independiente de los enlaces de referencia) es útil para la compatibilidad entre máquinas.
Utilizo con ventaja el cambio rápido de enlace Temprano / Tardío.
- Establecí por el Editor de VBA en las propiedades del proyecto VBA los argumentos de compilación condicional para
EarlyBinding = 1
.
- Entonces utilizo para el desarrollo las directivas de compilación condicional como a continuación, con la rama EarlyBinding activa.
- Cuando esté listo para lanzar, cambio a
EarlyBinding = 0
y el proyecto cambia de encuadernación temprana a encuadernación tardía para la prueba de encuadernación tardía final. - Editar: no olvide cancelar las referencias previamente utilizadas explícitamente para el enlace anticipado
Para el ejemplo de FileSystemObject TemporaryFolder, se puede ilustrar como:
Sub EarlyVsLateBindingtest()
#If Earlybinding Then
Dim oFS As Scripting.FileSystemObject
Set oFS = New Scripting.FileSystemObject
#Else
Const TemporaryFolder = 2
Dim oFS As Object
Set oFS = CreateObject("Scripting.FileSystemObject")
#End If
oFS.GetSpecialFolder (TemporaryFolder)
End Sub