Corregir el depurador VBA de Word que omite líneas al ejecutar paso a paso en procedimientos largos
🔍 WiseChecker

Corregir el depurador VBA de Word que omite líneas al ejecutar paso a paso en procedimientos largos

Cuando presionas F8 para recorrer una macro VBA larga en Word, el depurador a veces salta varias líneas de código sin ejecutarlas. Esto impide rastrear cambios de variables o confirmar el flujo lógico. La causa principal es una optimización de rendimiento conocida en el motor VBA que omite líneas que considera “código muerto” o inalcanzable durante el paso rápido. Este artículo explica por qué el depurador omite líneas, proporciona una solución confiable para forzar el paso línea por línea y cubre problemas relacionados como puntos de interrupción que no se activan o procedimientos que parecen colgarse.

Conclusiones clave: Forzar al depurador VBA para que recorra cada línea

  • Editor VBA > Herramientas > Opciones > General > Interrumpir en todos los errores: Evita que el depurador omita líneas después de que un error silencioso sea capturado y manejado.
  • Agregar DoEvents después de cada bloque lógico: Fuerza al depurador a pausar y procesar eventos de la interfaz de usuario, lo que evita la omisión de líneas en bucles largos.
  • Compilar el proyecto antes de depurar: Asegura que todas las variables estén declaradas y que los errores de sintaxis se detecten, eliminando una causa de líneas omitidas.

ADVERTISEMENT

Por qué el depurador VBA omite líneas en procedimientos largos

El depurador VBA en Word utiliza una estrategia de compilación justo a tiempo para el rendimiento. Cuando recorres un procedimiento largo, el depurador compila solo el bloque de código actual. Si detecta que una línea no tiene efectos secundarios—por ejemplo, un comentario, una asignación redundante o una variable que nunca se usa más adelante—puede omitir esa línea para acelerar la ejecución. Esto no es un error; es una optimización intencional que se vuelve problemática cuando necesitas verificar cada paso.

Una segunda causa es el manejo de errores. Si tu procedimiento usa On Error Resume Next, el depurador trata los errores como eventos no disruptivos. Después de que ocurre un error, el depurador puede saltar varias líneas para continuar la ejecución, omitiendo las líneas que se habrían ejecutado si el error no hubiera ocurrido. De manera similar, si tienes una declaración GoTo o un Exit Function dentro de un bucle, el depurador puede omitir todas las líneas restantes en el bloque actual.

Una tercera causa es el uso de etiquetas de línea o caracteres de continuación. El depurador puede evaluar una etiqueta de línea como una operación nula y saltar directamente a la siguiente declaración ejecutable. Esto es especialmente común en procedimientos largos que contienen múltiples bloques Select Case o If...ElseIf...End If.

Pasos para evitar que el depurador omita líneas

Los siguientes pasos fuerzan al editor VBA a recorrer cada línea, independientemente de la optimización o la lógica de manejo de errores. Realiza estos pasos en el orden mostrado.

  1. Abrir el editor VBA y configurar Interrumpir en todos los errores
    En el editor VBA, haz clic en Herramientas > Opciones. En la pestaña General, en Captura de errores, selecciona Interrumpir en todos los errores. Haz clic en Aceptar. Esta configuración anula cualquier declaración On Error Resume Next y detiene la ejecución en la línea exacta donde ocurre un error, evitando que el depurador omita líneas después de un error silencioso.
  2. Compilar el proyecto antes de comenzar
    En el editor VBA, haz clic en Depuración > Compilar VBAProject. Corrige cualquier error de sintaxis o variable no declarada que aparezca. La compilación elimina rutas de código muerto que el depurador podría omitir. Después de compilar, presiona F8 para comenzar a recorrer el procedimiento.
  3. Insertar DoEvents después de cada bloque principal
    En procedimientos largos, agrega DoEvents después de cada bucle For, bucle While o bloque If. Por ejemplo, después de End If o Next i, agrega una nueva línea con DoEvents. Esto fuerza al depurador a ceder al sistema operativo y procesar cualquier evento pendiente, lo que rompe la optimización que omite líneas. El depurador ahora se detendrá en la línea DoEvents misma y luego en la siguiente línea ejecutable.
  4. Eliminar temporalmente todas las declaraciones On Error Resume Next
    Si tu procedimiento usa On Error Resume Next, coméntalo agregando un apóstrofo al inicio de la línea. Reemplázalo con On Error GoTo 0 para restaurar el manejo de errores predeterminado. Esto evita que el depurador omita líneas después de un error. Después de depurar, descomenta el manejador de errores original.
  5. Establecer un punto de interrupción en la primera línea y recorrer línea por línea
    Haz clic en el margen izquierdo de la primera línea ejecutable del procedimiento para agregar un punto de interrupción rojo. Presiona F5 para ejecutar la macro hasta el punto de interrupción. Luego presiona F8 repetidamente. El depurador ahora debería detenerse en cada línea, incluidos los comentarios si son el único contenido de una línea. Si una línea aún se omite, verifica si contiene una etiqueta de línea o un carácter de continuación (guion bajo).

ADVERTISEMENT

Si el depurador aún omite líneas después de la solución principal

Los puntos de interrupción no se activan en ciertas líneas

Si un punto de interrupción se vuelve gris o no detiene la ejecución, es probable que la línea esté dentro de una ruta de código inactiva. Por ejemplo, un punto de interrupción dentro de un bloque ElseIf que nunca se evalúa como verdadero no se activará. Mueve el punto de interrupción a una línea que siempre se ejecute, como la línea de declaración Sub o Function. Alternativamente, usa declaraciones Debug.Print para enviar valores de variables a la ventana Inmediato en lugar de depender de puntos de interrupción.

Word se congela o no responde mientras se recorre el código

Los procedimientos largos que manipulan objetos de Word—como Selection.Find o ActiveDocument.Tables—pueden hacer que el depurador se cuelgue. Agrega una llamada DoEvents dentro del bucle y reduce la sobrecarga de actualización de pantalla configurando Application.ScreenUpdating = False al inicio de la macro. Restáuralo a True después del bucle. Esto no corrige la omisión de líneas, pero evita que el depurador deje de responder.

El depurador salta de un bucle al final del procedimiento

Esto ocurre cuando la condición del bucle se vuelve falsa inesperadamente. Verifica la variable del contador del bucle en la ventana Inmediato escribiendo ?counterVariable y presionando Enter. Si la variable está fuera de rango, el bucle sale temprano y el depurador omite las iteraciones restantes. Para evitar esto, agrega una vigilancia sobre la variable del bucle: haz clic derecho en el nombre de la variable en la ventana de código y selecciona Agregar vigilancia. Establece el tipo de vigilancia en Interrumpir cuando el valor cambie.

Comportamiento del depurador Antes de la solución (omisión de líneas) Después de la solución (paso forzado línea por línea)
Manejo de errores Omite líneas después de On Error Resume Next Se detiene en cada línea de error
Optimización de bucles Omite líneas en bucles For o While largos Se detiene en cada línea, incluida DoEvents
Compilación Omite líneas con variables no declaradas Compila todo el código, sin rutas muertas
Etiquetas de línea Salta directamente a la siguiente línea ejecutable Se detiene en la línea de etiqueta si es el único contenido

Al habilitar Interrumpir en todos los errores, compilar el proyecto y agregar llamadas DoEvents, puedes forzar al depurador VBA de Word a recorrer cada línea de un procedimiento largo. Usa la ventana Inmediato para inspeccionar variables en cada detención. Para procedimientos que aún omiten líneas, verifica rutas de código inactivas y elimina manejadores de errores temporales. Estos pasos te dan control total sobre el proceso de depuración y te ayudan a identificar errores lógicos que de otro modo pasarían desapercibidos.

ADVERTISEMENT