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.
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.
- 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. - 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. EscribaOn Error Resume Next. Esto indica a VBA que ignore cualquier error en tiempo de ejecución y pase a la siguiente línea. - 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. - Comprobar el objeto Err después de la operación
Agregue un bloqueIf Err.Number <> 0 Thenpara registrar o ignorar opcionalmente el error. Por ejemplo:If Err.Number <> 0 Then
Debug.Print "Error " & Err.Number & ": " & Err.Description
Err.Clear
End If - Restaurar el control de errores predeterminado
Después de la sección riesgosa, agregueOn Error GoTo 0para 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.
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.
- Declarar la etiqueta de error al inicio del procedimiento
En la parte superior de la macro, después de la líneaSuboFunction, agregueOn Error GoTo ErrorHandler. El nombre de la etiqueta puede ser cualquiera, peroErrorHandleres el estándar. - 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. - Agregar Exit Sub o Exit Function antes de la etiqueta
ColoqueExit SuboExit Functionjusto 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. - Escribir el bloque de control de errores
EscribaErrorHandler: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ónResume Nextdevuelve la ejecución a la línea inmediatamente posterior a la que provocó el error. Como alternativa, useResumepara reintentar la línea que falló, oResume ExitHerepara saltar a una segunda etiqueta que realice la limpieza. - Borrar el objeto de error
AgregueErr.Clearal 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.
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.