Ejecuta una macro VBA en Word y se detiene a mitad de camino, siempre en la misma operación del documento, como una búsqueda y reemplazo, una ordenación de tabla o una inserción de rango. Este síntoma apunta a un error en tiempo de ejecución que el controlador de errores predeterminado no captura, o a una condición que activa la protección integrada de Word. La causa raíz suele ser un error no controlado, una estructura de documento protegida o un conflicto entre VBA y un complemento en segundo plano. Este artículo explica las razones técnicas exactas por las que una subrutina se detiene a mitad de ejecución y proporciona métodos paso a paso para aislar y corregir la operación que falla.
Conclusiones clave: Detener fallos de subrutinas VBA en operaciones específicas del documento
- Editor VBA > Herramientas > Opciones > General > Interrumpir en errores no controlados: Fuerza al depurador a detenerse en la línea exacta que falla, revelando el número y la descripción del error.
- On Error Resume Next / On Error GoTo 0: Suprime temporalmente los errores en tiempo de ejecución para que la macro continúe; agregue un registro de errores para identificar la operación que falla.
- Archivo > Opciones > Centro de confianza > Configuración del Centro de confianza > Configuración de macros > Deshabilitar todas las macros con notificación: Desactive temporalmente los complementos que podrían interceptar operaciones del documento y causar una detención.
Por qué una subrutina VBA se detiene a mitad de ejecución en una operación específica
Cuando una subrutina VBA se detiene en una línea específica como Selection.Find.Execute o ActiveDocument.Tables(1).Sort, la causa inmediata es un error en tiempo de ejecución que el runtime de VBA no puede manejar. Sin un controlador de errores activo, VBA muestra un cuadro de mensaje y detiene la ejecución. Los errores comunes en tiempo de ejecución en estos puntos incluyen:
Errores de objeto requerido (Error 424)
Esto ocurre cuando el código hace referencia a un objeto que ya no existe. Por ejemplo, si la macro elimina una tabla y luego intenta ordenarla, el objeto de tabla ya no está. La subrutina se detiene en la línea de ordenación.
Método o miembro de datos no encontrado (Error 438)
Esto sucede cuando el código llama a un método que el objeto actual no admite. Por ejemplo, llamar a .Sort en un rango que abarca varias celdas de tabla puede fallar si el rango no es un objeto Table válido.
Permiso denegado (Error 70) o errores de documento protegido
Si el documento tiene restricciones de edición, campos de formulario o está marcado como final, ciertas operaciones como Range.Insert o Find.Execute con reemplazo generarán un error y detendrán la macro.
Memoria insuficiente o recursos del sistema (Error 7)
Documentos grandes con muchos cambios controlados o imágenes incrustadas pueden agotar la memoria disponible durante una operación de búsqueda y reemplazo, lo que hace que la subrutina se detenga.
Pasos para diagnosticar y corregir la subrutina que se detiene
Siga estos pasos en orden. Cada paso aísla una posible causa diferente.
Paso 1: Habilitar Interrumpir en errores no controlados
- Abra el Editor VBA
Presione Alt+F11 en Word para abrir el Editor de Visual Basic. - Abra Opciones
Haga clic en Herramientas > Opciones. Vaya a la pestaña General. - Establezca la captura de errores
Seleccione “Interrumpir en errores no controlados”. Haga clic en Aceptar. - Ejecute la macro nuevamente
Cuando la subrutina se detenga, el depurador resaltará la línea que falla. Anote el número y la descripción del error en el cuadro de mensaje.
Paso 2: Agregar un controlador de errores temporal
- Inserte On Error Resume Next
Al inicio de la subrutina, agregue la líneaOn Error Resume Next. Esto le dice a VBA que continúe con la siguiente línea incluso si ocurre un error. - Registre el error
Después de la operación que falla, agregue este código para capturar el error:If Err.Number <> 0 Then
Debug.Print "Error " & Err.Number & ": " & Err.Description
Err.Clear
End If - Vea la ventana Inmediato
Presione Ctrl+G para abrir la ventana Inmediato. Ejecute la macro. El error registrado aparecerá allí. - Restablezca el manejo de errores normal
Después de la prueba, elimine la líneaOn Error Resume Nexto reemplácela conOn Error GoTo 0.
Paso 3: Verifique la protección del documento
- Abra la pestaña Revisar
En Word, vaya a Revisar > Proteger > Restringir edición. - Revise la configuración de protección
Si el panel de tareas muestra “Su documento está protegido”, haga clic en Detener protección. Ingrese la contraseña si se le solicita. - Verifique Marcado como final
Vaya a Archivo > Información > Proteger documento. Si aparece “Marcado como final”, haga clic para eliminar el estado final. - Ejecute la macro nuevamente
Si la subrutina ya no se detiene, la protección era la causa.
Paso 4: Desactive los complementos temporalmente
- Abra Word en modo seguro
Mantenga presionada la tecla Ctrl mientras inicia Word. Haga clic en Sí cuando se le pregunte si desea iniciar en modo seguro. En modo seguro, todos los complementos están deshabilitados. - Ejecute la macro
Si la subrutina se completa sin detenerse, un complemento está interfiriendo. - Identifique el complemento problemático
Salga del modo seguro. Vaya a Archivo > Opciones > Complementos. Desactive los complementos uno por uno, reiniciando Word cada vez, hasta que la macro funcione.
Paso 5: Simplifique la operación que falla
- Divida la operación en pasos más pequeños
Si la línea que falla esSelection.Find.Execute Replace:=wdReplaceAll, divídala en una búsqueda y luego un reemplazo. - Use referencias de objeto explícitas
ReemplaceSelectioncon un objeto Range definido:Dim rng As Range
Set rng = ActiveDocument.Content
rng.Find.Execute FindText:="old", ReplaceWith:="new", Replace:=wdReplaceAll - Agregue una llamada a DoEvents
InserteDoEventsantes de la operación que falla para permitir que Word procese eventos pendientes.
Si la subrutina aún se detiene después de las correcciones principales
“La subrutina VBA de Word se detiene en Find.Execute pero funciona manualmente”
El objeto Find puede estar apuntando a un rango contraído. Establezca el rango en un área válida antes de llamar a Execute. Por ejemplo, rng.Start = 0: rng.End = ActiveDocument.Content.End.
“La macro se detiene en Table.Sort con el error 4605”
Este error indica que el método no es válido para el objeto. Asegúrese de que la tabla tenga más de una fila y que el rango incluya toda la tabla. Use ActiveDocument.Tables(1).Range en lugar de Selection.
“VBA se detiene en Range.Insert con el error 4198”
El comando falló porque el documento contiene cambios controlados. Acepte todos los cambios antes de ejecutar la macro: ActiveDocument.AcceptAll.
“La subrutina se detiene silenciosamente sin mensaje de error”
Esto sucede a menudo cuando la macro llama a End o Stop dentro de un bloque condicional. Busque en el código las declaraciones End o Stop y coméntelas temporalmente.
Métodos de depuración: Editor VBA vs. Ventana Inmediato vs. Archivo de registro
| Elemento | Modo de interrupción del Editor VBA | Ventana Inmediato Debug.Print | Archivo de registro (escribir en archivo de texto) |
|---|---|---|---|
| Esfuerzo de configuración | Ninguno (integrado) | Agregar líneas Debug.Print | Agregar código Open/Print/Close |
| Muestra la línea exacta | Sí, resaltada | No, solo mensajes registrados | No, solo mensajes registrados |
| Funciona sin interacción del usuario | No, se detiene en el error | Sí, continúa | Sí, continúa |
| Mejor para | Bloqueo inmediato en una línea conocida | Errores intermitentes | Macros de producción donde no puede supervisar |
Ahora puede identificar el error exacto en tiempo de ejecución que detiene su subrutina VBA y corregir la operación específica del documento que lo causa. Comience habilitando Interrumpir en errores no controlados para ver el número de error. Luego aplique el controlador de errores o la verificación de protección que coincida con el síntoma. Para el mantenimiento continuo de macros, agregue un controlador de errores simple con registro a cada subrutina que toque el contenido del documento. Esto evita detenciones silenciosas y le brinda un registro de qué operación falló.