Ves el error 91 de VBA en Word: ‘Object Variable or With Block Variable Not Set’ cuando tu macro intenta acceder a un ContentControl específico. Este error ocurre porque el código hace referencia a un objeto ContentControl que no existe, no ha sido asignado o ha sido liberado de la memoria. La macro intenta usar una variable de objeto que contiene el valor Nothing, por lo que Word no puede realizar ningún método o propiedad sobre ella. Este artículo explica las causas exactas del error 91 con ContentControls y proporciona pasos probados para identificar, asignar y hacer referencia de forma segura al ContentControl objetivo en tu proyecto de VBA.
Conclusiones clave: Corregir el error 91 de VBA para objetos ContentControl
- Establece la variable de objeto con la palabra clave Set: Sin Set, la variable permanece Nothing y causa el error 91.
- Verifica que el ContentControl exista antes de acceder a él: Comprueba el recuento de ActiveDocument.ContentControls o usa un índice o título específico.
- Usa enlace temprano y WithEvents explícito: Declara el objeto como tipo ContentControl para habilitar IntelliSense y evitar variables sin tipo.
Por qué ocurre el error 91 de VBA en Word al acceder a un ContentControl
El error 91 significa que tu código está intentando usar una variable de objeto que no ha sido establecida a un objeto válido. En VBA, una variable de objeto debe asignarse usando la palabra clave Set antes de poder leer sus propiedades o llamar a sus métodos. Si declaras una variable como Dim cc As ContentControl pero luego escribes cc = ActiveDocument.ContentControls(1) sin la palabra clave Set, la variable permanece Nothing. Cualquier línea posterior como cc.Range.Text generará el error 91.
Otra causa común es hacer referencia a un ContentControl que no existe en el documento. Por ejemplo, usar ContentControls(99) cuando el documento contiene solo cinco controles, o usar ContentControls("NameThatDoesNotExist"). El índice o título debe coincidir exactamente con un control existente. Una tercera causa es que el objeto ContentControl haya sido eliminado o que la colección del documento se haya modificado entre el momento en que asignaste la variable y el momento en que la usas. Esto puede suceder cuando una macro recorre los controles y elimina uno, dejando la referencia no válida.
Pasos para diagnosticar y corregir el error de variable de objeto
Sigue estos pasos para corregir el código de VBA y eliminar el error 91 al trabajar con ContentControls. Los pasos asumen que tienes el Editor de Visual Basic abierto con la macro que produce el error.
- Agrega la palabra clave Set a la asignación del objeto
Localiza la línea donde asignas el ContentControl a una variable. Cambiacc = ActiveDocument.ContentControls(1)aSet cc = ActiveDocument.ContentControls(1). La palabra clave Set es obligatoria para todas las asignaciones de objetos en VBA. Sin ella, la variable permanece Nothing. - Verifica que el índice o título del ContentControl exista
Antes de acceder a un ContentControl específico, verifica que exista. Usa la propiedad Count:If ActiveDocument.ContentControls.Count >= 1 Then Set cc = ActiveDocument.ContentControls(1). Para acceso basado en título, usa un bucle:For Each cc In ActiveDocument.ContentControls: If cc.Title = "MyTitle" Then Exit For: Next. Esto evita codificar un índice que pueda cambiar. - Declara la variable con el tipo de objeto correcto
UsaDim cc As ContentControlen lugar deDim cc As ObjectoDim cc. El enlace temprano te da IntelliSense y detecta errores de tipo en tiempo de compilación. Si falta la referencia a la biblioteca de objetos de Word, ve a Herramientas > Referencias y marca "Microsoft Word 16.0 Object Library". - Asegúrate de que el documento sea el documento activo
Si tu macro se ejecuta en un documento que no es la ventana activa, usaDocuments("YourDocName.docx")en lugar deActiveDocument. Asigna el objeto de documento a una variable primero:Dim doc As Document: Set doc = Documents("YourDocName.docx"). Luego usadoc.ContentControls. - Prueba la macro paso a paso con la ventana Locales
Presiona F8 para recorrer el código línea por línea. Abre Ver > Ventana Locales. Observa el valor de tu variable ContentControl. Si muestra "Nothing" cuando llegas a una línea que la accede, tienes un problema de asignación o existencia. Corrige la línea que debería establecer la variable. - Usa el manejo de errores para capturar el fallo de manera elegante
Agrega On Error Resume Next antes de la línea problemática, luego verifica si la variable es Nothing después. Ejemplo:On Error Resume Next: Set cc = ActiveDocument.ContentControls(99): If cc Is Nothing Then MsgBox "Control not found.": Exit Sub: On Error GoTo 0. Esto evita que la macro se bloquee y te dice exactamente qué control falta.
Si Word aún tiene problemas después de la corrección principal
Error 91 aparece después de eliminar un ContentControl en la misma macro
Cuando eliminas un ContentControl del documento usando cc.Delete, la variable de objeto se vuelve no válida. Cualquier referencia posterior a esa variable desencadena el error 91. La solución es establecer la variable a Nothing después de la eliminación y evitar usar la misma variable nuevamente. Ejemplo: cc.Delete: Set cc = Nothing. Si necesitas trabajar con otro control, asigna un nuevo objeto a la variable usando Set.
Error 91 al recorrer ContentControls por índice
Si eliminas controles dentro de un bucle For que usa un número de índice, la colección se reduce y el puntero de índice se vuelve incorrecto. Por ejemplo, eliminar el control 3 desplaza el control 4 a la posición 3. El bucle entonces omite el nuevo control 3. Esto puede causar un error de índice fuera de rango o el error 91 si el bucle continúa más allá del último control. La solución es recorrer en orden inverso: For i = ActiveDocument.ContentControls.Count To 1 Step -1. De esta manera, las eliminaciones no afectan los índices de los controles restantes.
Error 91 cuando el documento está protegido
Si el documento tiene restricciones de edición, tu macro puede no poder acceder a la colección ContentControls. Verifica si ActiveDocument.ProtectionType no es wdAllowOnlyFormFields o wdAllowOnlyComments. Para acceder a ContentControls en un documento protegido, debes desprotegerlo primero: If ActiveDocument.ProtectionType <> wdNoProtection Then ActiveDocument.Unprotect. Después de hacer cambios, puedes volver a aplicar la protección con la misma contraseña.
Patrones de codificación VBA que evitan el error 91 con ContentControls
| Patrón | Código correcto | Código incorrecto |
|---|---|---|
| Asignación de variable | Set cc = ActiveDocument.ContentControls(1) |
cc = ActiveDocument.ContentControls(1) |
| Verificación de existencia | If ActiveDocument.ContentControls.Count > 0 Then |
Sin verificación, asume que el control existe |
| Bucle con eliminación | For i = Count To 1 Step -1 |
For i = 1 To Count |
| Objeto de documento | Set doc = ActiveDocument: Set cc = doc.ContentControls(1) |
Set cc = ContentControls(1) sin referencia de documento |
Cada patrón en la tabla aborda una causa específica del error 91. Usa la columna de código correcto como plantilla para tus propias macros.
Ahora puedes identificar la línea exacta que causa el error 91 en tu proyecto de VBA y corregir la asignación del objeto, la verificación de existencia o la referencia al documento. A continuación, aplica la palabra clave Set a cada asignación de variable de objeto y agrega una verificación de Count antes de acceder a un ContentControl por índice. Para protección avanzada, escribe una función reutilizable que devuelva un ContentControl válido o Nothing, y llámala desde cualquier macro que necesite acceder a un control específico.