En Excel contamos con números aleatorios que nos pueden servir para cambiar el orden de un conjunto de números al azar, sortear la entrega de elementos, ya se considerando repeticiones (algunos afortunados en el sorteo pueden recibir más de un regalo), y sin considerar repeticiones (cada persona puede recibir un máximo de un regalo).
Sorteo - desordenar datos en Excel
Asumamos que tenemos una lista de personas en una hoja de Excel, en alguna columna disponible podemos colocar la función "aleatorio" tal como se muestra en la siguiente imagen.
Luego de ello podemos aplicar lo mismo para todas las filas, ya sea haciendo doble click en el controlador de relleno, arrastrando el controlador de relleno, o simplemente copiando la fórmula al resto de líneas.
Tomando en cuenta que la función "Aleatorio" simplemente nos entrega números al azar, podemos usar F9 para cambiar estos números las veces que sea necesario, y finalmente ordenar en base al a columna "orden".
Para efectos del sorteo podemos considerar los primeros elementos luego de ejecutado el ordenamiento.
Sorteo con VBA en Excel
Si ya tenemos experiencia en el uso de VBA, podemos resolver situaciones más complejas como por ejemplo una en la que preguntemos el número de regalos a ser distribuidos para luego ir distribuyendo cada uno de los regalos entre los participantes.
Sorteo con repeticiones
Para el mismo conjunto de datos asumamos que cada persona puede recibir uno o más regalos. Examinemos el siguiente código:
Sub sorteo1()
cantidad = InputBox("ingrese cantidad", "Título")
ult = Cells(Rows.Count, 1).End(xlUp).Row
For x = 1 To cantidad
ganador = WorksheetFunction.RandBetween(2, ult)
Cells(ganador, 3) = Cells(ganador, 3) & "regalo" & x
Next
End Sub
Paso 1: Usamos Inputbox para mostrar un recuadro en el que pedimos la cantidad de regalos a ser distribuidos, puedes conocer más del Inputbox en:
Paso 2: Utilizamos el código que nos permite encontrar la última fila con VBA, esto con la finalidad de saber el número de la fila hasta la cual encontramos a las personas que participan en el sorteo.
Paso 3: Usamos el bucle For Next en VBA, donde cada iteración del for sirve para entregar un regalo del sorteo, por ejemplo, si existen 10 regalos el for se ejecutará 10 veces (una vez para cada regalo)
Paso 4: Se utiliza WorksheetFunction.RandBetween a fin de determinar la fila en la que se encuentra el ganador del sorteo
Paso 5: Por medio de Cells en VBA, marcamos a los ganadores en la hoja.
Sorteo sin repeticiones
En este segundo caso vamos a tener algunas variantes en el código en VBA.
Sub sorteo2()
cantidad = InputBox("ingrese cantidad", "Título")
ult = Cells(Rows.Count, 1).End(xlUp).Row
For x = 1 To cantidad
ganador = WorksheetFunction.RandBetween(2, ult)
If Cells(ganador, 3) = "" Then
Cells(ganador, 3) = "regalo" & x
Else
x = x - 1
End If
Next
End Sub
A diferencia del primer código incluimos el uso de IF THEN ELSE, por medio del IF detectamos si la persona elegida ya tiene un regalo o no, si no tiene regalo se le entrega uno, si ya tiene un regalo retrocedemos el valor de X para intentar entregar el mismo regalo nuevamente.
Consideraciones finales:
Es importante, en particular para el segundo caso, que el número de regalos a distribuir no supera el número de personas, sino se entrará en un bucle infinito.
Adicionalmente podemos agregar una macro para limpiar la columna con los resultados si necesitamos volver a distribuir los regalos.
En el siguiente enlace descarga el archivo con el ejemplo completo del sorteo: Sorteo en Excel con Macros