Cuando ejecutas una macro de VBA para insertar un Quick Part en Word, puedes recibir el error de tiempo de ejecución 5398 con el mensaje “The requested member of the collection does not exist.” Este error ocurre específicamente cuando la macro intenta acceder a un building block que no está presente en la plantilla o documento de destino. La causa raíz suele ser un desajuste entre el nombre, la galería o la categoría del building block referenciado en el código y lo que realmente está almacenado en el Organizador de Building Blocks. Este artículo explica por qué aparece el error 5398 durante la inserción de Quick Parts mediante VBA y proporciona pasos precisos para corregir tu código y entorno.
Puntos clave: Cómo corregir el error 5398 de VBA al insertar Quick Parts
- Método BuildingBlockEntries.Item: El error 5398 significa que el nombre, la galería o la categoría específica del building block no existe en la plantilla referenciada por la macro.
- Propiedad Application.Templates: La macro debe apuntar a la plantilla correcta (Normal.dotm, .dotx personalizada o .dotm) que contiene el Quick Part; de lo contrario, la colección está vacía.
- Método BuildingBlock.Insert: Después de localizar el building block correcto, llama a Insert donde se encuentra el cursor de selección; no especificar un rango válido también provoca el error 5398.
Por qué ocurre el error 5398 de VBA al insertar Quick Parts
Word almacena los Quick Parts como building blocks dentro de plantillas. Cada building block pertenece a una galería (como wdBuiltInGalleryQuickParts) y a una categoría (como “General” o un nombre personalizado). Cuando tu código VBA ejecuta BuildingBlockEntries.Item("MyQuickPart"), Word busca en la colección de building blocks de la plantilla adjunta al documento o referenciada explícitamente en el código. Si el nombre, la galería o la categoría exactos no coinciden, Word lanza el error 5398.
Tres condiciones principales causan este desajuste:
- El building block está almacenado en una plantilla diferente a la que la macro está consultando. Por ejemplo, el Quick Part vive en Normal.dotm pero la macro lee desde la plantilla adjunta del documento activo.
- El nombre del building block en el argumento
Itemde VBA tiene un error tipográfico o usa mayúsculas/minúsculas diferentes a las del nombre almacenado. Los nombres de building blocks distinguen entre mayúsculas y minúsculas. - La constante de galería o la cadena de categoría en el código no coinciden con la galería o categoría donde realmente reside el building block. Un Quick Part almacenado bajo la categoría “Custom” no se puede encontrar buscando en “General”.
Entender estas tres causas es el primer paso para resolver el error. La solución implica verificar la ubicación exacta del building block y ajustar el código VBA en consecuencia.
Pasos para identificar y corregir la referencia del building block
Sigue estos pasos para localizar el building block correcto y modificar tu macro para evitar el error 5398.
- Abrir el Organizador de Building Blocks
Presiona Alt+F11 para abrir el editor de VBA, luego vuelve a Word. Presiona Alt+N, B, O (o ve a Insertar > Quick Parts > Organizador de Building Blocks). Esto muestra todos los building blocks en la plantilla actual. - Identificar el nombre, la galería y la categoría exactos del building block
En el Organizador de Building Blocks, localiza el Quick Part que deseas insertar. Anota el Nombre, la Galería (por ejemplo, Quick Parts) y la Categoría (por ejemplo, General). Haz clic derecho en la entrada y elige Editar propiedades para ver el nombre exacto sin espacios finales. - Determinar qué plantilla contiene el building block
En el Organizador de Building Blocks, la columna de plantilla muestra la plantilla principal (por ejemplo, Normal.dotm o una plantilla personalizada). Anota el nombre completo del archivo. Tu macro debe referenciar esta plantilla específica. - Actualizar tu código VBA para apuntar a la plantilla correcta
Reemplaza cualquier referencia genérica de plantilla con la plantilla específica. Por ejemplo, cambia:Set objTemplate = ActiveDocument.AttachedTemplate
a:Set objTemplate = Application.Templates("Normal.dotm")
Reemplaza “Normal.dotm” con el nombre exacto de la plantilla del paso 3. - Usar las constantes correctas de galería y categoría
Verifica la constante de galería. Para Quick Parts, usawdBuiltInGalleryQuickParts(valor 17). Para la categoría, usa la cadena exacta del paso 2. Ejemplo:Set objBB = objTemplate.BuildingBlockEntries.Item("MyQuickPart")
Si la categoría no es “General”, incluye el parámetro Category al usar la colecciónBuildingBlocks:Set objBB = objTemplate.BuildingBlockTypes(wdBuiltInGalleryQuickParts).Categories("Custom").BuildingBlocks("MyQuickPart") - Insertar el building block en la selección
Después de obtener el objetoBuildingBlockcorrecto, llama al métodoInsert. Ejemplo:objBB.Insert Selection.Range
Esto coloca el Quick Part en la posición actual del cursor. Si necesitas un rango específico, usaActiveDocument.Range(Start:=0, End:=0)para insertar al principio del documento. - Probar la macro
Ejecuta la macro actualizada. Si el error 5398 aún aparece, vuelve al paso 1 y verifica el nombre del building block en busca de caracteres ocultos o espacios. UsaDebug.Print objTemplate.BuildingBlockEntries.Countpara confirmar que la plantilla contiene building blocks.
Si el error 5398 persiste después de corregir el código
Incluso después de ajustar la plantilla, el nombre, la galería y la categoría, el error 5398 puede ocurrir debido a factores menos obvios. Las secciones siguientes cubren las causas restantes más frecuentes.
El building block se creó en una versión de Word en otro idioma
Los nombres de building blocks y las cadenas de categoría son específicos del idioma. Si el Quick Part se creó en una versión de Word en francés o alemán, el nombre de la galería puede diferir. En el Organizador de Building Blocks, examina la columna Galería: puede mostrar “QuickParties” en lugar de “Quick Parts”. Usa la cadena localizada exacta en tu código VBA o, mejor, usa la constante numérica para la galería (por ejemplo, 17 para Quick Parts) para evitar la dependencia del idioma.
La macro se ejecuta antes de que la plantilla esté completamente cargada
Si tu macro se ejecuta durante el evento Document_Open o inmediatamente después de iniciar Word, la colección de building blocks puede no estar disponible aún. Agrega un pequeño retraso usando Application.Wait Now + TimeValue("00:00:01") o llama a DoEvents antes de acceder a la plantilla. Esto asegura que el Organizador de Building Blocks esté completamente inicializado.
El building block está almacenado en un complemento de plantilla global
Los Quick Parts pueden residir en plantillas globales cargadas a través de Archivo > Opciones > Complementos. Si la macro solo verifica la plantilla adjunta del documento activo, no encontrará building blocks almacenados en una plantilla global. Recorre Application.Templates y verifica la colección BuildingBlockEntries de cada plantilla hasta encontrar el bloque deseado.
Patrones de código VBA: referencia directa vs. bucle a través de todas las plantillas
| Elemento | Referencia directa a plantilla | Bucle a través de todas las plantillas |
|---|---|---|
| Complejidad del código | Asignación simple de una línea | Requiere bucle For Each y manejo de errores |
| Rendimiento | Rápido: consulta de una sola plantilla | Más lento: verifica cada plantilla cargada |
| Riesgo de error 5398 | Alto si el nombre de la plantilla es incorrecto | Bajo: encuentra el bloque independientemente de su ubicación |
| Recomendado para | Plantilla conocida con bloque garantizado | Documentos compartidos o orígenes de plantilla desconocidos |
Conclusión
El error 5398 en Word VBA al insertar Quick Parts es causado por un desajuste entre la referencia del building block en el código y el building block realmente almacenado. Al verificar la plantilla, el nombre, la galería y la categoría a través del Organizador de Building Blocks, puedes corregir tu macro y eliminar el error. Para un código robusto, recorre todas las plantillas cargadas o usa constantes numéricas de galería para evitar problemas de idioma. Después de corregir la referencia, el método BuildingBlock.Insert colocará el Quick Part exactamente donde se necesite.