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.
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.
- 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ónOn Error Resume Nexty 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. - 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. - Insertar DoEvents después de cada bloque principal
En procedimientos largos, agregaDoEventsdespués de cada bucleFor, bucleWhileo bloqueIf. Por ejemplo, después deEnd IfoNext i, agrega una nueva línea conDoEvents. 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íneaDoEventsmisma y luego en la siguiente línea ejecutable. - Eliminar temporalmente todas las declaraciones On Error Resume Next
Si tu procedimiento usaOn Error Resume Next, coméntalo agregando un apóstrofo al inicio de la línea. Reemplázalo conOn Error GoTo 0para 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. - 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).
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.