En este artículo se va a desarrollar un modelo, mediante Visual Basic en Excel, que permite calificar a los alumnos con un criterio específico en función al número de respuestas correctas e incorrectas en un examen.
Planteamiento: La calificación del alumno será el número de respuestas correctas menos una penalización en función al número de respuestas incorrectas. Esta penalización consiste en que se restará 0,33 por cada respuesta incorrecta a partir de la cuarta respuesta incorrecta (con ella incluida), y se restará 1 punto por cada respuesta incorrecta a partir de la decimosexta respuesta incorrecta (con ella incluida).
1. Inserción de tabla de trabajo
Se trabajará con un fichero que constará de 5 columnas:
• Nombres de alumnos
• Nº de respuestas correctas
• Nº de respuestas incorrectas
• Nº de respuestas en blanco
• Calificación
2. Apertura del programador
Debemos abrir el programador de Excel y acudir al apartado Visual Basic. Para ello, debemos habilitar el Programador que no viene activado por defecto ¿como lo activamos?:
- Abrimos la hoja de Excel, vamos al apartado Archivo/Opciones/Personalizar cinta de opciones
- Activamos la opción Programador en Pestañas principales
- Ahora podemos observar como en la cinta superior de opciones aparece Programador
- Clicamos en Visual Basic
- Una vez dentro, clicamos en Insertar/Modulo y ya podemos empezar a implementar nuestro código
3. Declaración de variables
En primer lugar debemos crear variables para almacenar los datos que nos interesen y que posteriormente vayan a ser utilizados. En este caso queremos almacenar el valor de las respuestas correctas, incorrectas así como el valor de la penalización al resultado final.
Después declaramos las variables, Buenas y Malas almacenarán un valor entero porque simplemente guardarán el valor de las respuestas correctas y falladas pero las variables Pen1, Pen2 y CALIFICACION almacenarán un valor decimal, dado que las 2 primeras almacenarán el dato que debemos restar por la penalización establecida por el usuario en función al número de fallos, mientras que la última acumulará el resultado final:
Dim Buenas As Integer
Dim Malas As Integer
Dim Pen1 As Single
Dim Pen2 As Single
Dim CALIFICACION As Single
4. Inicialización
Vamos a inicializar todas las variables declaradas dado que así nos aseguramos que todas las variables se encuentren con un valor 0.
Buenas = 0
Malas = 0
Pen1 = 0
Pen2 = 0
CALIFICACION = 0
5. Código para calificación de alumnos
Para continuar se deberá evaluar las filas en las que haya datos, de manera que cuando la macro lea una línea en blanco responda finalizándola.
For i = 1 To 200
If IsEmpty(Cells(i + 1, 2 + 3)) Then GoTo Salir
Se escribe el código que guardará las respuestas correctas e incorrectas. Asumiendo que las respuestas estarán en las columnas 5 y 6 y que habrá encabezados en la primera fila.
Buenas = Cells(i + 1, 2 + 3).Value
Malas = Cells(i + 1, 3 + 3).Value
Ahora escribiremos el código con el que se calculará la penalización. Esta penalización irá almacenada en 2 variables dado que existen dos tipos de penalización, una que multiplica el número de respuestas incorrectas por 0,33 y otra que multiplica por 1.
Por tanto Pen1 será la variable que multiplica por 0,33 las respuestas incorrectas en el rango [4,15] y Pen2 será la variable que multiplica por 1 las respuestas incorrectas en el rango [16-30].
If Malas > 3 And Malas < 16 Then
Pen1 = (Malas - 3) * 0.33
End If
If Malas > 15 Then
Pen2 = Malas - 15
Pen1 = 0.33 * 12
End If
Posteriormente vamos a escribir el resultado de la calificación ahora que ya tenemos almacenadas todas las variables necesarias para calcularla. El resultado se almacenará en la variable Calificacion y se escribirá en la columna Calificación dada en el fichero. La idea es que el resultado sea expresado en un rango calificatorio del 1 al 10, por ello se divide entre 30, que será el número de respuestas totales, y se multiplica por 10. Finalmente se redondeará a dos decimales.
Calificacion = Buenas - Pen1 - Pen2
Cells(i + 1, 5 + 3).Value = WorksheetFunction.Round(Calificacion * 10 / 30, 2)
Como retoque estético de nuestra macro pintaremos de color rojo las celda cuyo valor sea inferior a 5.
If Cells(i + 1, 5 + 3).Value < 5 Then
Cells(i + 1, 5 + 3).Interior.ColorIndex = 3
Else
Cells(i + 1, 5 + 3).Interior.ColorIndex = 4
End If
Para acabar con cada iteración habrá que reiniciar las variables de Penalización (Pen1 y Pen2).
Pen1 = 0
Pen2 = 0
Todas las funciones descritas anteriormente irán dentro de un bucle for con un número elevado de iteraciones de manera que la finalización del bucle lo marca el condicional que si lee una celda en blanco finaliza la macro, no llegando nunca a cumplirse las iteraciones especificadas.
6. Alternativa
Como mejora de este código se podría proponer que en vez de establecer un número de iteraciones aleatorio elevado, establecer el número de iteraciones que se corresponda con el número de alumnos que haya.
Para llevarlo a cabo necesitamos saber en que punto se encuentra la ultima celda con valor de la columna alumnos.
Range("D1").End(xlDown).Select
alumnos = ActiveCell.Row
Con la función End(xlDown) se busca la última celda con datos de la columna donde nos encontremos en ese momento, en este caso con la función Range(“D1”) seleccionamos la cuarta columna, es decir, donde se encuentra la columna de alumnos proporcionada por el fichero. Después se guarda el número de fila donde se encuentre el último valor de la columna en la variable alumnos.
Ahora el bucle no se establecerá hasta un valor elevado sino hasta el número de alumnos exactamente.
For i = 1 To alumnos - 1
Se observa que se resta 1 a la variable alumnos, esto es debido a que no habrá que tener en cuenta el encabezado de la columna. Ya no nos hará falta el condicional que evaluaba si la celda está en blanco: (If IsEmpty(Cells(i + 1, 2 + 3)) Then GoTo Salir) , dado que ya hemos establecido que las iteraciones serán justo para el número de alumnos.
0 comentarios