Ejercicio práctico 6: Cómo buscar errores con macros, mostrándolos en un cuadro de diálogo (msgbox).

Escrito por Administrador

25 de agosto de 2021

Hoy seguimos con el ciclo de casos prácticos, con un ejemplo sencillo pero muy interesante.

Cuando programamos 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 este motivo, es importante realizar validaciones dentro de nuestro código conforme programamos, para 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.

He querido preparar algo sencillo para que se vea rápido. 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. Simple. Pero, ¿qué pasa si al maestro se le ha olvidado introducir una nota como vemos en la figura? 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.

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.

El código es el siguiente.

Macro 1. Comprobación de datos introducidos y cálculo de 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. Borrado de 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 paso a paso.

Como es habitual, lo primero que hacemos es desactivar el refresco de pantalla por temas de optimización de recursos.

Sub evaluar()

'Desactivamos el refresco de pantalla para agilizar la macro

Application.ScreenUpdating = False

Ahora debemos comprobar 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). Así, por cada iteración i (alumno), tendremos tres iteraciones j (notas). Lo explico con numeritos…

Iteración i=3 y j=3. 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. 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. 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. 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. En nuestro ejemplo, el valor de dicha celda está vacío. Se le ha olvidado rellenarla al profesor. 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

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

total-operaciones-matematicas-macros

Posteriormente 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. Espero que te esté gustando el curso y que me plantees cualquier duda que te surja. También puedes proponerme macros que te interese desarrollar y las voy incluyendo en el temario, 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