Ejecutas una macro de VBA en Word y se detiene a mitad del código sin mostrar ningún error. La macro simplemente se detiene y no aparece ningún cuadro de diálogo ni depurador. Este comportamiento no es un fallo aleatorio. Está causado por configuraciones específicas de VBA, condiciones de tiempo de ejecución no controladas o la forma en que Word maneja la memoria y las referencias a objetos. Este artículo explica las causas raíz de la terminación silenciosa de macros y proporciona pasos prácticos para prevenirlo.
Conclusiones clave: Evita que las macros de VBA en Word se detengan silenciosamente
- Herramientas > Macros > Macros > Seleccionar macro > Paso a paso (F8): Utiliza la ejecución paso a paso para identificar la línea exacta donde se detiene la ejecución.
- Editor de VBA > Herramientas > Opciones > General > Interrumpir en errores no controlados: Habilita el depurador para capturar errores que de otro modo causan la terminación silenciosa.
- Editor de VBA > Depuración > Compilar VBAProject: Encuentra errores de sintaxis y de compilación antes de que la macro se ejecute.
Por qué una Sub de VBA se detiene sin un cuadro de diálogo de error
Las macros de VBA en Word se detienen silenciosamente por tres razones principales: un error de tiempo de ejecución no controlado que no activa el controlador de errores estándar, una llamada a DoEvents o Application.Wait que permite que la interacción del usuario cancele la macro, o una referencia a objeto corrupta o faltante que hace que Word omita el código restante. Cada causa tiene un mecanismo diferente.
Errores de tiempo de ejecución no controlados con On Error Resume Next
Cuando una macro usa On Error Resume Next, cualquier error después de esa línea no muestra un cuadro de diálogo. El código continúa hasta que encuentra otro error que la instrucción resume no puede omitir. Si el error ocurre dentro de un bucle o un bloque condicional, la macro puede salir del procedimiento temprano sin advertencia. La propiedad Err.Number contiene el código de error, pero si el código no lo verifica, el error es invisible.
DoEvents y cancelación por parte del usuario
La función DoEvents cede la ejecución al sistema operativo para que el usuario pueda interactuar con Word. Si el usuario presiona Escape o hace clic en un botón que interrumpe la macro, Word puede terminar la sub sin un mensaje de error. De manera similar, Application.Wait pausa la ejecución pero no protege contra la cancelación del usuario.
Pérdida de referencia a objeto
Si una macro establece una variable de objeto en Nothing o si Word libera el objeto debido a una llamada a método fallida, las líneas posteriores que hacen referencia a ese objeto causan una falla silenciosa. Word no siempre genera un error capturable para Object variable or With block variable not set en todos los contextos. La macro se detiene en la línea que intenta usar el objeto no válido.
Pasos para identificar y corregir detenciones silenciosas de macros
Ejecutar la macro línea por línea
- Abrir el Editor de VBA
Presiona Alt+F11 en Word para abrir el Editor de Visual Basic. Localiza el módulo que contiene la macro que se detiene en el panel del Explorador de proyectos. - Establecer un punto de interrupción al inicio
Haz clic en el margen izquierdo junto a la primera línea ejecutable de la Sub. Aparece un punto rojo. La macro se pausará antes de ejecutar esa línea. - Ejecutar la macro y presionar F8 repetidamente
Presiona F8 para ejecutar una línea a la vez. Observa el resaltado amarillo. Cuando el resaltado desaparezca y el editor vuelva a la normalidad, esa es la línea donde se detuvo la ejecución. Anota el número de línea y el código.
Habilitar Interrumpir en errores no controlados
- Abrir las opciones del Editor de VBA
En el Editor de VBA, ve a Herramientas > Opciones. Haz clic en la pestaña General. - Seleccionar Interrumpir en errores no controlados
En Captura de errores, elige Interrumpir en errores no controlados. Haz clic en Aceptar. Esta configuración obliga al depurador a detenerse en cualquier error que no sea capturado por una instrucciónOn Error. - Ejecutar la macro nuevamente
Presiona F5 para ejecutar la macro. Si ocurre un error, el depurador ahora muestra la línea y la descripción del error.
Compilar el proyecto VBA
- Abrir el Editor de VBA
Presiona Alt+F11. - Ejecutar Compilar VBAProject
Ve a Depuración > Compilar VBAProject. El editor verifica todos los módulos en busca de errores de sintaxis, variables no declaradas (si Option Explicit está establecido) y discrepancias de tipo. Si aparece un error de compilación, corrígelo y compila de nuevo hasta que no se informen errores.
Verificar On Error Resume Next sin manejo de errores
- Buscar On Error Resume Next en el código
Presiona Ctrl+F en el Editor de VBA y buscaOn Error Resume Next. Examina cada ocurrencia. - Agregar verificación de errores después de operaciones riesgosas
Después de cada línea que pueda fallar, insertaIf Err.Number <> 0 Thenpara registrar o manejar el error. Ejemplo:On Error Resume Next
Selection.TypeText Text:=someVariable
If Err.Number <> 0 Then
Debug.Print "Error " & Err.Number & ": " & Err.Description
Err.Clear
End If
Eliminar DoEvents dentro de bucles
- Localizar llamadas a DoEvents
Presiona Ctrl+F y buscaDoEvents. Si la macro contieneDoEventsdentro de un bucle, coméntalo agregando una comilla simple al inicio de la línea. - Reemplazar con actualizaciones de Application.StatusBar
En lugar deDoEvents, usaApplication.StatusBar = "Processing item " & ipara dar retroalimentación sin ceder el control al usuario.
Verificar que las variables de objeto no sean Nothing
- Agregar comprobaciones explícitas antes de usar objetos
Antes de llamar a un método o propiedad en una variable de objeto, insertaIf Not objVar Is Nothing Then. Ejemplo:Dim doc As Document
Set doc = Documents.Open("C:\test.docx")
If Not doc Is Nothing Then
doc.SaveAs2 "C:\test2.docx"
End If
Si la macro aún se detiene después de las correcciones principales
Word se congela o se cuelga durante una macro de larga duración
Una macro que recorre cientos de párrafos o tablas puede agotar la memoria interna de Word. Word puede dejar de ejecutar la sub sin un error y volverse no receptivo. Para solucionarlo, agrega Application.ScreenUpdating = False al inicio de la macro y restablécelo a True al final. También reduce el número de objetos Selection usando objetos Range directos en su lugar.
La Vista protegida bloquea el objeto Documento
Si la macro abre un documento desde un archivo adjunto de correo electrónico o un recurso compartido de red, Word lo abre en Vista protegida. El objeto Document es de solo lectura, y cualquier intento de modificarlo causa una falla silenciosa. Usa Documents.Open FileName:=path, ReadOnly:=False y verifica la propiedad Document.ProtectedViewWindow. Si el documento está en Vista protegida, habilita la edición mediante ActiveProtectedViewWindow.Edit antes de ejecutar la macro.
Los conflictos de complementos causan terminación temprana
Los complementos de terceros pueden interceptar la ejecución de VBA y detener una sub. Para probar, inicia Word en modo seguro: presiona la tecla de Windows + R, escribe winword /safe y presiona Enter. Ejecuta la macro. Si se completa sin detenerse, deshabilita los complementos uno por uno en Archivo > Opciones > Complementos > Administrar complementos COM.
| Elemento | Detención silenciosa (sin cuadro de diálogo de error) | Cuadro de diálogo de error (con opción de depuración) |
|---|---|---|
| On Error Resume Next activo | Sí, el error se suprime | No |
| Configuración Interrumpir en errores no controlados | Deshabilitada | Habilitada |
| Se usa DoEvents o Application.Wait | Sí, el usuario puede cancelar | No |
| Variable de objeto establecida en Nothing | Sí, el código se detiene en la siguiente línea | A veces, depende del contexto |
Ahora puedes diagnosticar por qué una sub de VBA en Word se detiene a mitad de ejecución sin un mensaje de error. Primero, habilita Interrumpir en errores no controlados en las opciones del Editor de VBA. Luego, ejecuta la macro paso a paso con F8 para localizar la línea que falla. Verifica si hay On Error Resume Next sin manejo de errores y reemplaza DoEvents con actualizaciones de la barra de estado. Para depuración avanzada, usa el panel Inmediato para imprimir Err.Number después de cada línea sospechosa. Este enfoque elimina las conjeturas y te da control total sobre la ejecución de la macro.