Cómo capturar errores de VBA en Word sin detener la macro a mitad de la operación
🔍 WiseChecker

Cómo capturar errores de VBA en Word sin detener la macro a mitad de la operación

Cuando una macro de VBA en Word encuentra un error en tiempo de ejecución, detiene la ejecución y muestra un cuadro de diálogo de error predeterminado. Esto detiene la operación y, a menudo, deja el documento en un estado incompleto o dañado. La causa es el comportamiento predeterminado de control de errores en VBA, que trata cualquier error no controlado como un fallo crítico. Este artículo explica cómo usar la captura estructurada de errores con las instrucciones On Error Resume Next y On Error GoTo para mantener la macro en ejecución sin problemas.

Puntos clave: Capturar errores de VBA en Word de forma controlada

  • On Error Resume Next: Indica a VBA que ignore un error en tiempo de ejecución y continúe con la siguiente línea de código; es ideal para operaciones no críticas.
  • On Error GoTo [Label]: Envía la ejecución a una rutina de control de errores etiquetada cuando se produce un error, lo que permite registrar o corregir el problema.
  • Objeto Err (Err.Number, Err.Description, Err.Clear): Proporciona detalles sobre el último error; use Err.Clear después de controlarlo para restablecer el estado de error.

ADVERTISEMENT

Cómo funciona el control de errores de VBA en las macros de Word

VBA, el lenguaje de macros de Word, utiliza un modelo de ejecución secuencial. Cuando se produce un error en una línea, el comportamiento predeterminado es detener la macro y mostrar un cuadro de diálogo con el número y la descripción del error. Esto lo controla el controlador de errores integrado del entorno de ejecución de VBA. Para cambiar este comportamiento, inserte instrucciones específicas de control de errores al inicio del procedimiento o antes del bloque de código riesgoso.

Los dos métodos principales son la supresión de errores en línea con On Error Resume Next y la bifurcación estructurada de errores con On Error GoTo. Cada uno tiene una finalidad diferente. On Error Resume Next es mejor cuando se esperan errores ocasionales que no afectan el resultado general, como un marcador faltante o un rango protegido. On Error GoTo es mejor cuando se necesita registrar el error, limpiar recursos o salir del procedimiento de forma segura.

Después de capturar un error, debe comprobar el objeto Err para ver si se produjo un error. La propiedad Err.Number devuelve el código de error y Err.Description devuelve el mensaje. Después de controlarlo, llame a Err.Clear para restablecer el estado de error. Si no borra el error, las llamadas posteriores a On Error Resume Next seguirán viendo el error anterior.

Pasos para implementar On Error Resume Next en operaciones no críticas

Este método es ideal para operaciones que podrían fallar pero en las que el fallo es aceptable, como eliminar un marcador que puede no existir o aplicar formato a una selección que podría estar vacía.

  1. Abrir el editor de VBA
    Presione Alt+F11 en Word para abrir el editor de Microsoft Visual Basic for Applications. Localice el módulo que contiene su macro en el panel Explorador de proyectos.
  2. Insertar la instrucción On Error antes del código riesgoso
    Coloque el cursor al inicio del procedimiento o justo antes de la línea que podría fallar. Escriba On Error Resume Next. Esto indica a VBA que ignore cualquier error en tiempo de ejecución y pase a la siguiente línea.
  3. Escribir la operación que puede fallar
    Por ejemplo, para eliminar un marcador sin que se bloquee si no existe: ActiveDocument.Bookmarks("Temp").Delete. Si el marcador no existe, la macro continúa.
  4. Comprobar el objeto Err después de la operación
    Agregue un bloque If Err.Number <> 0 Then para registrar o ignorar opcionalmente el error. Por ejemplo:
    If Err.Number <> 0 Then
    Debug.Print "Error " & Err.Number & ": " & Err.Description
    Err.Clear
    End If
  5. Restaurar el control de errores predeterminado
    Después de la sección riesgosa, agregue On Error GoTo 0 para volver al control de errores predeterminado durante el resto de la macro. Esto garantiza que los errores inesperados posteriores en el código no se ignoren de forma silenciosa.

ADVERTISEMENT

Pasos para implementar On Error GoTo para el control centralizado de errores

Use este método cuando necesite realizar acciones de limpieza o salir de la macro de forma controlada después de que se produzca un error. Centraliza toda la lógica de errores en una sección etiquetada.

  1. Declarar la etiqueta de error al inicio del procedimiento
    En la parte superior de la macro, después de la línea Sub o Function, agregue On Error GoTo ErrorHandler. El nombre de la etiqueta puede ser cualquiera, pero ErrorHandler es el estándar.
  2. Escribir el código principal de la macro normalmente
    Incluya todas las operaciones que necesite. Si alguna línea provoca un error, la ejecución salta inmediatamente a la etiqueta.
  3. Agregar Exit Sub o Exit Function antes de la etiqueta
    Coloque Exit Sub o Exit Function justo antes de la etiqueta de error. Esto evita que el código de control de errores se ejecute cuando no se produce ningún error.
  4. Escribir el bloque de control de errores
    Escriba ErrorHandler: en su propia línea. Debajo, agregue código para controlar el error. Por ejemplo:
    ErrorHandler:
    MsgBox "Error " & Err.Number & ": " & Err.Description, vbCritical
    Resume Next

    La instrucción Resume Next devuelve la ejecución a la línea inmediatamente posterior a la que provocó el error. Como alternativa, use Resume para reintentar la línea que falló, o Resume ExitHere para saltar a una segunda etiqueta que realice la limpieza.
  5. Borrar el objeto de error
    Agregue Err.Clear al final del controlador de errores para restablecer el estado de error antes de que la macro continúe o finalice.

Errores comunes de captura y cómo evitarlos

Olvidar restaurar el control de errores predeterminado después de On Error Resume Next

Si no agrega On Error GoTo 0 después de la sección riesgosa, todo el resto de la macro se ejecuta con los errores suprimidos. Esto puede ocultar errores y hacer imposible la depuración. Restaure siempre el control predeterminado en cuanto finalice la operación riesgosa.

Usar Resume sin una etiqueta válida después de On Error GoTo

La instrucción Resume solo se puede usar dentro de un controlador de errores activo. Si llama a Resume sin una etiqueta, o si la etiqueta está mal escrita, VBA genera un nuevo error. Asegúrese de que el nombre de la etiqueta coincida exactamente y de que se pueda acceder al controlador.

No borrar el objeto Err antes de la siguiente comprobación de errores

Si comprueba Err.Number después de una operación pero no llama a Err.Clear, el siguiente bloque On Error Resume Next seguirá viendo el error anterior. Esto provoca falsos positivos en las comprobaciones de errores. Borre siempre el objeto después de controlarlo.

ADVERTISEMENT

On Error Resume Next vs On Error GoTo: diferencias clave

Elemento On Error Resume Next On Error GoTo
Comportamiento ante errores Ignora el error y continúa en la siguiente línea Salta a un controlador etiquetado
Mejor caso de uso Fallos esperados y no críticos Fallos críticos que requieren limpieza o registro
Visibilidad de errores Debe comprobar el objeto Err manualmente El controlador se ejecuta automáticamente al producirse un error
Restauración necesaria Sí, use On Error GoTo 0 No es necesario, pero el controlador debe salir correctamente
Opciones de Resume No aplicable Resume, Resume Next, Resume [label]

Ahora dispone de dos métodos fiables para capturar errores de VBA en Word sin detener la macro. Comience aplicando On Error Resume Next a operaciones simples y no críticas para evitar interrupciones. Para macros más complejas que requieren limpieza, use On Error GoTo con un controlador dedicado. Pruebe las macros primero en una copia del documento y compruebe siempre el objeto Err después de la supresión de errores en línea. Un consejo avanzado: combine ambos métodos usando On Error Resume Next para operaciones individuales dentro de un bucle, y envuelva todo el bucle en un controlador On Error GoTo para capturar errores fatales inesperados.

ADVERTISEMENT