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.
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.
'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.
'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.
'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.
'Bucle para las filas
For i = 3 To 23
'Bucle para las columnas
For j = 3 To 5
Como la celda está rellena, sumamos una unidad a la variable j.
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.
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.
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.
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,
MsgBox "El valor de la celda de la fila " & i & " y la columna " & j & " está vacía"
Exit Sub
Por lo tanto, nos mostrará una ventana emergente con la información celda (fila y columna) que se encuentra vacía.
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.
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.
Por último, quiero invitarte a compartir tus dudas en los comentarios o en el foro. Intentaré ayudarte en todo lo que pueda, y así aprenderemos todos.
Nos vemos en el próximo capítulo.
Si te ha servido y quieres donar
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