Cómo hacer referencia a la biblioteca de objetos de office en VBA de Word sin enlace anticipado
🔍 WiseChecker

Cómo hacer referencia a la biblioteca de objetos de office en VBA de Word sin enlace anticipado

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.

ADVERTISEMENT

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.

  1. 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.
  2. Identifique todas las declaraciones de variables de enlace anticipado
    En sus módulos de código, busque cada instrucción Dim o Set que use un tipo específico de Office. Los tipos comunes incluyen Office.CommandBar, Office.CommandBarButton, Office.FileDialog, Office.MsoFileDialogType y Office.MsoThemeColorIndex. También busque palabras clave New que crean objetos de Office.
  3. Cambie los tipos de variables a Object
    Reemplace cada tipo específico con Object. Por ejemplo, cambie Dim cb As Office.CommandBar a Dim cb As Object. Cambie Dim fd As Office.FileDialog a Dim fd As Object. Haga lo mismo con todas las variables relacionadas con Office.
  4. Reemplace New con CreateObject
    Cualquier línea que use Set cb = New Office.CommandBar debe cambiarse a Set 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").
  5. Reemplace las constantes con nombre por sus valores numéricos
    Office define muchas constantes como msoFileDialogFilePicker o msoThemeColorAccent1. 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, msoFileDialogFilePicker tiene el valor 1. Reemplace msoFileDialogFilePicker con 1. 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.
  6. 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.
  7. 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.

ADVERTISEMENT

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.

ADVERTISEMENT