Inicio / Excel / Excel Avanzado: Power User / Manejo de errores y debugging en VBA

Manejo de errores y debugging en VBA

On Error, breakpoints, Debug.Print, logging y patrones robustos.

Avanzado
🔒 Solo lectura
📖

Estás en modo lectura

Puedes leer toda la lección, pero para marcar progreso, hacer ejercicios y ganar XP necesitas una cuenta Pro.

Desbloquear por $9/mes

Manejo de errores y debugging en VBA

Técnicas profesionales para escribir código VBA robusto y depurable.

Tipos de errores

Errores de compilación

Se detectan antes de ejecutar: sintaxis incorrecta, variables no declaradas.

' Error de compilación: variable no declarada (con Option Explicit)
Sub Ejemplo()
    x = 10  ' ❌ x no está declarada
End Sub

Errores de ejecución (Runtime)

Ocurren durante la ejecución: división por cero, archivo no encontrado.

Sub Ejemplo()
    Dim resultado As Double
    resultado = 10 / 0  ' ❌ Error 11: División por cero
End Sub

Errores lógicos

El código se ejecuta sin errores pero produce resultados incorrectos.

On Error: manejo de errores

On Error GoTo

Sub ConManejoErrores()
    On Error GoTo ErrorHandler
    
    ' Código que puede fallar
    Dim wb As Workbook
    Set wb = Workbooks.Open("C:\archivo.xlsx")
    
    ' Si todo va bien, saltar el handler
    Exit Sub

ErrorHandler:
    MsgBox "Error " & Err.Number & ": " & Err.Description, vbCritical
    ' Opciones:
    ' Resume        → reintentar la línea que falló
    ' Resume Next   → saltar a la siguiente línea
    ' Exit Sub      → salir del procedimiento
End Sub

On Error Resume Next

Sub BuscarValor()
    On Error Resume Next
    
    Dim valor As Variant
    valor = Application.WorksheetFunction.VLookup("clave", Range("A:B"), 2, False)
    
    If Err.Number <> 0 Then
        valor = "No encontrado"
        Err.Clear
    End If
    
    On Error GoTo 0  ' Restaurar manejo normal
    
    Debug.Print valor
End Sub

Errores personalizados

Sub ValidarDatos(edad As Integer)
    If edad < 0 Or edad > 150 Then
        Err.Raise Number:=vbObjectError + 1, _
                  Source:="ValidarDatos", _
                  Description:="Edad no válida: " & edad
    End If
End Sub

El objeto Err

Propiedad Descripción
.Number Código del error
.Description Mensaje descriptivo
.Source Origen del error
.Clear Limpia el error actual
.Raise Genera un error

Patrón de manejo robusto

Sub ProcesoRobusto()
    On Error GoTo ErrorHandler
    
    ' Configuración
    Application.ScreenUpdating = False
    Application.Calculation = xlCalculationManual
    
    ' *** CÓDIGO PRINCIPAL ***
    Dim datos As Variant
    datos = Range("A1:D100").Value
    
    Dim i As Long
    For i = 1 To UBound(datos)
        ' Procesar con validación
        If IsNumeric(datos(i, 3)) Then
            datos(i, 4) = datos(i, 2) * datos(i, 3)
        Else
            datos(i, 4) = "ERROR"
        End If
    Next i
    
    Range("A1:D100").Value = datos
    ' *** FIN CÓDIGO PRINCIPAL ***

Cleanup:
    ' SIEMPRE se ejecuta (como finally)
    Application.ScreenUpdating = True
    Application.Calculation = xlCalculationAutomatic
    Exit Sub

ErrorHandler:
    MsgBox "Error en fila " & i & ": " & Err.Description, vbCritical
    Resume Cleanup  ' Ir a limpieza
End Sub

Debugging

Herramientas del editor VBA

Herramienta Atajo Función
Punto de interrupción F9 Pausa la ejecución en esa línea
Paso a paso F8 Ejecuta línea por línea
Paso sobre procedimiento Shift+F8 Ejecuta sub completo
Ventana de inspección Monitorea variables
Ventana Inmediato Ctrl+G Ejecuta código y muestra valores
Ventana Locales Ve todas las variables locales

Debug.Print

Sub ConDebug()
    Dim total As Double
    Dim i As Long
    
    For i = 1 To 100
        total = total + Cells(i, 1).Value
        
        ' Imprimir en ventana Inmediato
        If i Mod 10 = 0 Then
            Debug.Print "Fila " & i & " | Total acumulado: " & total
        End If
    Next i
    
    Debug.Print "=== RESULTADO FINAL: " & total & " ==="
End Sub

Debug.Assert

Sub ConAssert()
    Dim valor As Double
    valor = CalcularTotal()
    
    ' Detiene ejecución si la condición es False
    Debug.Assert valor >= 0  ' ¿El total es positivo?
    Debug.Assert valor < 1000000  ' ¿Es razonable?
End Sub

Watch Expressions

En el editor VBA:

  1. Debug → Add Watch
  2. Define la expresión a monitorear
  3. Tipo: Watch Expression, Break When True, Break When Changed

Logging

' modLogger
Private logFile As Integer

Sub IniciarLog(ruta As String)
    logFile = FreeFile
    Open ruta For Append As #logFile
    Log "=== Sesión iniciada ==="
End Sub

Sub Log(mensaje As String)
    Print #logFile, Format(Now, "yyyy-mm-dd hh:mm:ss") & " | " & mensaje
End Sub

Sub CerrarLog()
    Log "=== Sesión finalizada ==="
    Close #logFile
End Sub

Uso

Sub ProcesoConLog()
    IniciarLog ThisWorkbook.Path & "\log.txt"
    
    On Error GoTo ErrorHandler
    
    Log "Iniciando proceso..."
    Log "Filas a procesar: " & ultimaFila
    
    ' ... proceso ...
    
    Log "Proceso completado. " & contadorOK & " OK, " & contadorError & " errores"
    CerrarLog
    Exit Sub

ErrorHandler:
    Log "ERROR: " & Err.Number & " - " & Err.Description
    CerrarLog
    Resume Next
End Sub

Resumen

El manejo de errores y debugging profesional en VBA requiere: patrones On Error con cleanup, Debug.Print estratégico, breakpoints, y logging a archivo. Siempre restaura Application settings en la sección Cleanup.

🔒

Ejercicio práctico disponible

Diagnóstico y corrección de errores

Desbloquear ejercicios
// Diagnóstico y corrección de errores
// Desbloquea Pro para acceder a este ejercicio
// y ganar +50 XP al completarlo

function ejemplo() {
    // Tu código aquí...
}

¿Te gustó esta lección?

Con Pro puedes marcar progreso, hacer ejercicios, tomar quizzes, ganar XP y obtener tu constancia.

Ver planes desde $9/mes