Cuando escribe macros de VBA en Word que interactúan con otras aplicaciones de Office como Excel o Outlook, necesita hacer referencia a la Biblioteca de objetos de Office. El método estándar utiliza el enlace anticipado, que requiere establecer una referencia en el editor de VBA y bloquea su código a una versión específica de la biblioteca. Esto puede causar macros rotas cuando los usuarios tienen una versión diferente de Office o cuando la ruta de la biblioteca cambia. Este artículo explica cómo usar el enlace tardío en su lugar, para que su código funcione en todas las versiones de Office sin configuración manual de referencias.
Puntos clave: Enlace tardío para la Biblioteca de objetos de Office en VBA de Word
- Declare variables como Object en lugar de tipos específicos (por ejemplo, Excel.Application): Evita la dependencia en tiempo de compilación de la versión de la biblioteca de Office.
- Use CreateObject(“Excel.Application”) en lugar de New Excel.Application: Crea el objeto en tiempo de ejecución sin necesidad de establecer una referencia.
- Elimine la referencia a la Biblioteca de objetos de Office en Herramientas > Referencias: Asegura que la macro se ejecute en cualquier versión de Office sin ajustes manuales.
Qué significan el enlace anticipado y el enlace tardío en VBA de Word
El enlace anticipado, también llamado enlace estático, ocurre cuando establece una referencia a una biblioteca de tipos específica en el editor de VBA. Por ejemplo, va a Herramientas > Referencias y marca “Microsoft Excel 16.0 Object Library”. Luego puede declarar variables como tipos específicos como Dim xlApp As Excel.Application. El compilador resuelve todas las propiedades y métodos del objeto en tiempo de compilación. Esto le proporciona IntelliSense y una ejecución más rápida, pero vincula su macro a esa versión exacta de la biblioteca.
El enlace tardío, o enlace dinámico, resuelve los tipos de objeto en tiempo de ejecución. Declara variables como el tipo genérico Object y usa CreateObject o GetObject para instanciarlos. El compilador de VBA no verifica los miembros del objeto hasta que se ejecuta el código. Esto significa que no necesita ninguna referencia establecida en el editor de VBA. La macro funciona en cualquier máquina que tenga instalada la aplicación de Office de destino, independientemente de la versión.
La Biblioteca de objetos de Office contiene objetos, constantes y funciones comunes compartidos entre las aplicaciones de Office. Es posible que la necesite para objetos como Office.CommandBar, Office.FileDialog o Office.MsoThemeColorIndex. Con el enlace anticipado, debe hacer referencia a la biblioteca. Con el enlace tardío, evita esa referencia por completo.
Por qué usar el enlace tardío para la Biblioteca de objetos de Office
La razón principal es la compatibilidad. Si distribuye una macro de Word a colegas o clientes, no puede garantizar que tengan la misma versión de Office. Una referencia de enlace anticipado a “Microsoft Office 16.0 Object Library” falla en una máquina con Office 2019 u Office 365. El enlace tardío elimina este problema. También evita la necesidad de actualizar referencias cuando Office se actualiza. La contrapartida es que pierde IntelliSense y el código se ejecuta un poco más lento porque el enlace ocurre en tiempo de ejecución.
Pasos para hacer referencia a la Biblioteca de objetos de Office en VBA de Word sin enlace anticipado
Siga estos pasos para reescribir su código de enlace anticipado existente o escribir código nuevo que use el enlace tardío para la Biblioteca de objetos de Office. Estos pasos asumen que ya tiene una macro que usa el enlace anticipado con una referencia establecida.
- Abra el Editor de VBA y verifique las referencias actuales
Presione Alt+F11 para abrir el editor de VBA. Vaya a Herramientas > Referencias. Busque cualquier elemento marcado que diga “Microsoft Office xx.x Object Library” donde xx.x es un número de versión. Anote el nombre exacto de la biblioteca. Eliminará esta marca más adelante. - Identifique todas las declaraciones de variables de enlace anticipado
En sus módulos de código, busque cada instrucciónDimoSetque use un tipo específico de Office. Los tipos comunes incluyenOffice.CommandBar,Office.CommandBarButton,Office.FileDialog,Office.MsoFileDialogTypeyOffice.MsoThemeColorIndex. También busque palabras claveNewque crean objetos de Office. - Cambie los tipos de variables a Object
Reemplace cada tipo específico conObject. Por ejemplo, cambieDim cb As Office.CommandBaraDim cb As Object. CambieDim fd As Office.FileDialogaDim fd As Object. Haga lo mismo con todas las variables relacionadas con Office. - Reemplace New con CreateObject
Cualquier línea que useSet cb = New Office.CommandBardebe cambiarse aSet cb = CreateObject("Office.CommandBar"). El argumento de cadena es el identificador programático (ProgID) del objeto. Para la Biblioteca de objetos de Office, el formato del ProgID es “Office.ObjectName”. Ejemplos comunes:CreateObject("Office.CommandBar"),CreateObject("Office.FileDialog"). - Reemplace las constantes con nombre por sus valores numéricos
Office define muchas constantes comomsoFileDialogFilePickeromsoThemeColorAccent1. En el enlace tardío, estas constantes no están disponibles porque la biblioteca de tipos no está cargada. Debe buscar el valor numérico de cada constante y usar ese número directamente. Por ejemplo,msoFileDialogFilePickertiene el valor 1. ReemplacemsoFileDialogFilePickercon1. Una forma rápida de encontrar valores es abrir el Examinador de objetos en el editor de VBA mientras la referencia aún está establecida, seleccionar la biblioteca de Office y ver el valor de la constante en el panel inferior. Anote todos los valores que necesita antes de eliminar la referencia. - Elimine la referencia a la Biblioteca de objetos de Office
Vaya a Herramientas > Referencias nuevamente. Desmarque el elemento “Microsoft Office xx.x Object Library”. Haga clic en Aceptar. El editor de VBA ya no resolverá los tipos de Office. Su código aún debería compilarse porque cambió todos los tipos a Object y reemplazó las constantes por números. - Pruebe la macro en un documento nuevo
Abra un documento nuevo de Word. Presione Alt+F8, seleccione su macro y haga clic en Ejecutar. Si obtiene un error de compilación, verifique si quedan declaraciones de enlace anticipado o constantes. Corríjalos y pruebe de nuevo. La macro debería ejecutarse sin ninguna referencia a la Biblioteca de objetos de Office.
Problemas comunes y cómo evitarlos
Error “El objeto no admite esta propiedad o método” en tiempo de ejecución
Este error ocurre cuando usa una propiedad o método que existe en una versión más reciente de la Biblioteca de objetos de Office pero no en la versión instalada en la máquina del usuario. El enlace tardío no protege contra miembros faltantes. Para evitar esto, verifique la versión de Office en tiempo de ejecución usando Application.Version o use el manejo de errores con On Error Resume Next alrededor de la línea problemática. Luego pruebe la propiedad o método antes de usarlo.
No se puede encontrar el ProgID correcto para un objeto de Office
No todos los objetos de Office tienen un ProgID. Por ejemplo, Office.FileDialog tiene un ProgID, pero Office.MsoThemeColorIndex es una enumeración, no un objeto. Las enumeraciones no se pueden crear con CreateObject. Para las enumeraciones, debe usar valores numéricos. Para los objetos que no tienen un ProgID, es posible que deba acceder a ellos a través de un objeto principal. Por ejemplo, obtiene un CommandBar a través de Application.CommandBars en lugar de crearlo directamente.
La macro se ejecuta más lenta después de cambiar al enlace tardío
El enlace tardío es inherentemente más lento porque el tiempo de ejecución de VBA debe buscar cada propiedad y método en tiempo de ejecución. La diferencia suele ser insignificante a menos que su macro llame a miles de miembros de objetos de Office en un bucle. Si el rendimiento es crítico, conserve la versión de enlace anticipado para su propio uso y distribuya la versión de enlace tardío. También puede usar la compilación condicional para alternar entre el enlace anticipado y el tardío según una constante.
Enlace anticipado vs enlace tardío para la Biblioteca de objetos de Office en VBA de Word
| Elemento | Enlace anticipado | Enlace tardío |
|---|---|---|
| Configuración de referencia | Debe marcar la biblioteca en Herramientas > Referencias | No se requiere referencia |
| Declaración de variable | Tipo específico (por ejemplo, Office.CommandBar) | Tipo Object genérico |
| Creación de objetos | Palabra clave New o CreateObject con referencia | CreateObject solo con ProgID |
| Compatibilidad con IntelliSense | Sí | No |
| Velocidad de ejecución | Más rápida | Ligeramente más lenta |
| Compatibilidad entre versiones | Puede fallar si la versión de Office es diferente | Funciona en todas las versiones |
| Uso de constantes | Use constantes con nombre directamente | Debe usar valores numéricos |
Cambiar al enlace tardío para la Biblioteca de objetos de Office hace que sus macros de VBA de Word sean portables entre versiones de Office. Renuncia a IntelliSense y a una pequeña cantidad de rendimiento, pero gana una distribución confiable sin conflictos de versión. Comience convirtiendo una macro que use objetos de Office. Una vez que domine el patrón, aplicarlo a otras macros es rápido. Para proyectos complejos, considere usar la compilación condicional para mantener una versión de enlace anticipado para el desarrollo y una versión de enlace tardío para la implementación.