Técnicas de depuración y de control de errores (1ª parte)

En el presente apartado vamos a abordar un acuestión no trivial, y que nos puede reportar ciertos beneficios al realizar nuestros programas. Los errores son casi inevitables, aun planificando bien nuestro código podemos cometer errores de diseño, de sintáxis, de compilación o lógicos.

Si VBA encuentra un error y no hemos insertado un código de comprobación de error, el programa se detiene y el usuario se encontrará con un mensaje embarazoso: Continuar,Finalizar o Depurar. Si este error se nos presenta a nosotros en el momento en que estamos probando nuestro código, o es un programa realizado por nosotros mismos, al seleccionar la opción de depurar se nos va a presentar la ventana de código con una línea en amarillo en donde se resalta la localización del error. Podemos por tanto detener la ejecución del programa, corregir el error y ejecutarlo de nuevo.

Pero qué ocurriría si estos errores se le presenta a un usuario que no tiene porque saber de programación. Tenemos por tanto que establecer una estrategia para interceptar los errores. Para comenzar vamos a tratar el siguiente ejemplo:

Introduzca el módulo siguiente:

Sub division()
Dim x, y, z As Double
x = InputBox(“Introduzca el dividendo”, “DIVISION”)
y = InputBox(“Introduzca el divisor”, “DIVISION”)
z = x / y
MsfBox x & ” dividido entre ” & y & “es igual a ” & z

End Sub

Verá que he marcado en negrita el mensaje de respuesta, en el que intencionadamente he introducido un primer error de sintáxis. El mensaje que le aparecerá cuando lo intente  ejecutar es ¡ERROR DE COMPILACION! NO SE ENCUENTRA SUB O FUNCTION. Es decir que cuando VBA compila (traduce a lenguaje máquina) el código que le hemos insertado, no lo entiende.

Corríja el error y ejecútelo de nuevo.

Ahora en tiempo de ejecución cuando el programa le solicite introducir el divisor, introduzca un cero. Afortunadamente ese error VBA ha sido capaz de interpretarlo.  Está dentro de la lista de errores interceptables.

Inserte ahora debajo de la declaración de variables la siguiente línea:

On error resume next

Ejecute de nuevo el código y observará que le arrojará la división entre 0, como solución cero. O sea que con esta sentencia le indicamos a VBA que en caso de que encuentre algún error lo ignore y continúe ejecutando el código.

Es fácil pensar que con esta línea se resuelve todos los problemas pero realmente no es así tan sólo se enmascara, con lo que si no se hace nada para corregir la causa del error, se podrán generar futuros errores.

Vamos a crear por tanto unas líneas de código para manejar los errores. Una opción bastante usada es introducir una condición con el bucle Do—While, por ejemplo:

Sub obtenernumeros()
Dim hecho As Boolean
Dim divisor, dividendo, division As Double

hecho = False
Do While Not divisor <> 0

    dividendo = InputBox(“Introduzca el dividendo”, “DIVISION”)
    divisor = InputBox(“Introduzca el divisor”, “DIVISION”)

    Loop
division = Format(dividendo / divisor, “#0.00”)
MsgBox division

End Sub

Con ello forzamos sin más que hasta que  se introduzca una cifra distinta de cero como divisor. Una manera más directa es crear una función personalizada para la operación en sí, y hacer una llamada a la misma desde un procedimiento. De esa forma para la función podríamos escribir el siguiente código:

Function dividir(dividendo, divisor) As Boolean

‘declaramos las variables
Dim msg As String
Dim resultado As Double
‘establecemos la salida en caso de error
On Error GoTo controldivcero

‘si no hay errores dividimos
resultado = Format(dividendo / divisor, “#0.00”)
‘presentamos el resultado
msg = dividendo & ” entre ” & divisor & ” es igual a ” & resultado
MsgBox msg

dividir = True

‘salimos y finalizamos la función dividir
Exit Function

‘aquí el manejador de error
controldivcero:

‘se ha detectado un divisor=0 se le pregunta al usuario si pretende continuar
resultado = MsgBox(“No se puede dividir entre 0 ¿Desea continuar?”, _
vbYesNo + vbQuestion, “Dividir”)

‘si dice que sí rcomenzamos el bucle
If resultado = vbYes Then
    dividir = False
Else
    dividir = True
End If

End Function

Y con el procedimiento siguiente obtenemos los operadores y llamamos a la función:

Sub obtenernumeros_bis()
Dim hecho As Boolean
Dim divisor, dividendo As Variant

hecho = False
Do While Not hecho
    dividendo = InputBox(“Introduzca el dividendo”, “DIVISION”)
    divisor = InputBox(“Introduzca el divisor”, “DIVISION”)
    hecho = dividir(dividendo, divisor)
Loop

End Sub

En este ejemplo preparar un rutina de control de errores no es muy difícil dado lo previsible y obvio del error que se puede presentar. Aunque por desgracia no siempre es así.

A menudo necesitamos ofrecer al usuario la opción de continuar el programa o abandonarlo. Para ello podemos añadir una o varias sentencias Resume al manejador de errores. VBA define tres tipos:

  • Resume: se le dice a VBA que continúe la ejecución del programa desde la misma sentencia donde se produjo el error.
  • Resume Next: a partir de la primera sentencia ejecutable que encuentre después de la línea que provocó el error.
  • Resume Line: a partir de la etiqueta especificada con Line.

En cualquier momento podemos desactivar el manejador con la sentencia: On Error GoTo 0.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: