Ejercicio práctico 6: Control de errores en VBA, mostrándolos en un cuadro de diálogo (msgbox).

control-de-errores-vba

Escrito por Administrador

28 de agosto de 2021

Vamos a aprender hoy sobre el control y manejo de errores en VBA.

En realidad, al programar tareas automáticas, el ojo no es capaz de detectar errores que a lo mejor sí que podrías evitar al trabajar de manera manual.

Por eso, es importante realizar validaciones dentro de nuestro código conforme programamos. De esta manera, podemos hacer que la automatización se detenga si no se cumplen ciertos requisitos para continuar en un determinado punto.

Por ejemplo, si partimos de una tabla original o calculada a partir de otra, y los datos de partida tienen que ser positivos, no está de más crear una regla que compruebe que no existe ningún número negativo que haya podido introducir el usuario de manera errónea o que hubiera nacido del resultado de un cálculo previo.

Con todo esto, he querido preparar un ejemplo sencillo para que se vea rápido el control y manejo de errores en VBA. De hecho, se trata de una tabla de alumnos con sus respectivas notas de las tres evaluaciones de cualquier asignatura.

total-operaciones-matematicas-macros

Nuestro propósito es calcular la nota de la evaluación final a partir de la media de las tres evaluaciones. Pero, ¿qué pasa si al maestro se le ha olvidado introducir una nota como vemos en la figura? Como consecuencia, el alumno solo tendría dos notas de las tres evaluaciones, la nota final no sería la real, y lo peor de todo es que no se daría cuenta confiando en la automatización.

Por eso, para evitarlo, vamos a hacer que el código antes de calcular la evaluación final, compruebe que se encuentran rellenas todas las evaluaciones de cada alumno.

A continuación, os dejo el código.

Macro 1. Comprobar datos introducidos y calcular la evaluación final.

Sub evaluar()

'Desactivamos el refresco de pantalla para agilizar la macro

Application.ScreenUpdating = False

'Comprobamos que están rellenos los datos de las tres primeras evaluaciones de todos los alumnos

'Bucle para las filas

For i = 3 To 23

'Bucle para las columnas

For j = 3 To 5

'Si la celda se encuentra vacía mostramos cual en una ventana emergente y salimos de la macro

If IsEmpty(Cells(i, j)) Then

MsgBox "El valor de la celda de la fila " & i & " y la columna " & j & " está vacía"

Exit Sub

End If

Next j

Next i

'En caso de que todos los datos se encuentren rellenos, realizamos el cálculo de la evaluación final

For i = 3 To 23

Cells(i, "F") = Application.WorksheetFunction.Sum(Range(Cells(i, "C"), Cells(i, "E"))) / 3

Next

'Podemos hacer que los aprobados luzcan en verde y los suspensos en rojo

For i = 3 To 23

If Cells(i, "F") < 5 Then

Cells(i, "F").Font.ColorIndex = 3

Else

Cells(i, "F").Font.ColorIndex = 10

End If

Next

End Sub

Macro 2. Borrar datos de la evaluación final.

Sub borrar()

'Borramos los datos de la evaluación final.

Range(Cells(3, "F"), Cells(23, "F")).ClearContents

End Sub

Vamos a analizar la primera macro, que realiza el control y manejo de errores en VBA.

En primer lugar, desactivamos el refresco de pantalla por temas de optimización de recursos.

A continuación, te dejo el enlace donde explico cómo usar la función ScreenUpdate en una macro.

Sub evaluar()

'Desactivamos el refresco de pantalla para agilizar la macro

Application.ScreenUpdating = False

En segundo lugar, comprobamos que todos los alumnos tienen sus tres notas correspondientes a cada evaluación. Para ello, hacemos uso de la anidación de bucles, que no es más que un bucle dentro de otro.

El primero de ellos (variable i) recorre los alumnos, mientras que el segundo recorre las notas de cada uno (variable j). De esta forma, por cada iteración i (alumno), tendremos tres iteraciones j (notas).

Iteración i=3 y j=3. Así, en nuestro ejemplo, el valor de dicha celda es 6.

'Comprobamos que están rellenos los datos de las tres primeras evaluaciones de todos los alumnos

'Bucle para las filas

For i = 3 To 23

'Bucle para las columnas

For j = 3 To 5

total-operaciones-matematicas-macros

Como la celda está rellena, sumamos una unidad a la variable j.

'Si la celda se encuentra vacía mostramos cual en una ventana emergente y salimos de la macro

If IsEmpty(Cells(i, j)) Then

MsgBox "El valor de la celda de la fila " & i & " y la columna " & j & " está vacía"

Exit Sub

End If

Next j

Iteración i=3 j=4. Así, en nuestro ejemplo, el valor de dicha celda es 7.

total-operaciones-matematicas-macros

Como la celda está rellena, sumamos una unidad a la variable j.

Iteración i=3 j=5. Así, en nuestro ejemplo, el valor de dicha celda es 4.

total-operaciones-matematicas-macros

Como la celda está rellena, sumamos una unidad a la variable j. Como j sería igual a 6 y el bucle es entre j=3 y j=5, j vuelve a tomar el valor 3 y se ejecuta la siguiente línea,

Next i

sumando una unidad a la variable i, tomando el valor 4.

Iteración i=4 j=3. Así, en nuestro ejemplo, el valor de dicha celda es 5.

total-operaciones-matematicas-macros

Como la celda está rellena, sumamos una unidad a la variable j.

Iteración i=4 j=4. Ahora, sin embargo, el valor de dicha celda está vacío porque se le ha olvidado rellenarla al profesor. Entonces, en este caso se cumple el condicional,

If IsEmpty(Cells(i, j)) Then

MsgBox "El valor de la celda de la fila " & i & " y la columna " & j & " está vacía"

Exit Sub

total-operaciones-matematicas-macros

Por lo tanto, nos mostrará una ventana emergente con la información celda (fila y columna) que se encuentra vacía.

total-operaciones-matematicas-macros

A continuación, detendrá la macro a la espera de que corrijamos el error y volvamos a ejecutarla. En nuestro caso hemos rellenado la celda vacía con el valor 8 y hemos vuelto a ejecutar la macro, obteniendo el cálculo de la evaluación final.

total-operaciones-matematicas-macros

Notad que, si no hubiéramos introducido esta comprobación en el código, y el profesor no se hubiera dado cuenta de que le faltaba por introducir una nota, el alumno habría suspendido.

Con esto llegamos al final de la vigesimonovena lección, en la que has aprendido sobre el control y manejo de errores en VBA.

Finalmente, desear que te esté gustando el curso y pedirte que me plantees cualquier duda que te surja. También puedes proponerme macros que te interese desarrollar y las voy incluyendo en el temario. De hecho, soy todo oídos. Nos vemos en el próximo capítulo.

Descarga el archivo del ejemplo

« EP5. Cómo filtrar registros de una tabla con macros.

EP7. Cómo usar Change e Intersect en macros. »

0 comentarios

Enviar un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.

Quizá te interese,

Contacto