Corregir la detención de una subrutina VBA de Word a mitad de ejecución en una operación específica del documento
🔍 WiseChecker

Corregir la detención de una subrutina VBA de Word a mitad de ejecución en una operación específica del documento

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.

ADVERTISEMENT

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

  1. Abra el Editor VBA
    Presione Alt+F11 en Word para abrir el Editor de Visual Basic.
  2. Abra Opciones
    Haga clic en Herramientas > Opciones. Vaya a la pestaña General.
  3. Establezca la captura de errores
    Seleccione “Interrumpir en errores no controlados”. Haga clic en Aceptar.
  4. 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

  1. Inserte On Error Resume Next
    Al inicio de la subrutina, agregue la línea On Error Resume Next. Esto le dice a VBA que continúe con la siguiente línea incluso si ocurre un error.
  2. 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
  3. Vea la ventana Inmediato
    Presione Ctrl+G para abrir la ventana Inmediato. Ejecute la macro. El error registrado aparecerá allí.
  4. Restablezca el manejo de errores normal
    Después de la prueba, elimine la línea On Error Resume Next o reemplácela con On Error GoTo 0.

Paso 3: Verifique la protección del documento

  1. Abra la pestaña Revisar
    En Word, vaya a Revisar > Proteger > Restringir edición.
  2. 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.
  3. Verifique Marcado como final
    Vaya a Archivo > Información > Proteger documento. Si aparece “Marcado como final”, haga clic para eliminar el estado final.
  4. Ejecute la macro nuevamente
    Si la subrutina ya no se detiene, la protección era la causa.

Paso 4: Desactive los complementos temporalmente

  1. 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.
  2. Ejecute la macro
    Si la subrutina se completa sin detenerse, un complemento está interfiriendo.
  3. 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

  1. Divida la operación en pasos más pequeños
    Si la línea que falla es Selection.Find.Execute Replace:=wdReplaceAll, divídala en una búsqueda y luego un reemplazo.
  2. Use referencias de objeto explícitas
    Reemplace Selection con un objeto Range definido:
    Dim rng As Range
    Set rng = ActiveDocument.Content
    rng.Find.Execute FindText:="old", ReplaceWith:="new", Replace:=wdReplaceAll
  3. Agregue una llamada a DoEvents
    Inserte DoEvents antes de la operación que falla para permitir que Word procese eventos pendientes.

ADVERTISEMENT

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ó.

ADVERTISEMENT