Asignación aleatoria

Hola amigo selu123, quiero realizar una hoja de la siguiente forma:
Tengo 14 alumnos y 14 tareas y lo que quiero es que diariamente al oprimir un botón o algo similar le coloque a cada alumno una tarea distinta y que no se repita ninguna tarea hasta el día 15 y así sucesivamente... De antemano muchas gracias su amigo Jorge

1 respuesta

Respuesta
1
En realidad en este caso, dado que el numero de tareas es igual al numero de alumnos, lo más sencillo es preestablecer el orden de las tareas.
Si tenemos ordenadas de forma fija las tareas, asignamos al alumno 1 la tarea 1, al alumno 2 le asignamos la tarea 2, y así sucesivamente.
Al día siguiente, le asignamos al alumno 1 la tarea 2, al alumno 2, la tarea 3, y así sucesivamente hasta el alumno 14 que le asignamos la tarea 1.
Una forma de mostrar qué hacer sería:
1.- Columna A: inserto nombre de los alumnos (a partir de A1)
2.- Columna B: indico el día en que se encuentra cada alumno (1,2,... 14) (a partir de B1)
En la columna C aparecería la tarea a realizar. Esto se pondría con un código en un botón:
    Dim tareas(14) As String
    Dim i As Long
    Dim valorActual As Integer
    'inicializamos las posibles tareas
    tareas(1) = "tarea1"
    tareas(2) = "tarea2"
    tareas(3) = "tarea3"
    tareas(4) = "tarea4"
    tareas(5) = "tarea5"
    tareas(6) = "tarea6"
    tareas(7) = "tarea7"
    tareas(8) = "tarea8"
    tareas(9) = "tarea9"
    tareas(10) = "tarea10"
    tareas(11) = "tarea11"
    tareas(12) = "tarea12"
    tareas(13) = "tarea13"
    tareas(14) = "tarea14"
    'Recalculámos el día que le corresponde a cada alumno:
    For i = 1 To 14
        valorActual = Range("b" & i)
        If valorActual < 14 Then
            Range("b" & i) = valorActual + 1
        Else 'si el dia es 14, debe pasar a valer 1:
            Range("b" & i) = 1
        End If
        'una vez asignada la nueva tarea que corresponde a cada uno, indicamos en la
'columna C cual es esa tarea:
        Range("c" & i) = tareas(Range("B" & i))
    Next i
Hola y muchas gracias por tu respuesta la cual encuentro muy bien, el problema es que de esta forma los alumnos sabrían, que tarea les tocaría el día de mañana y lo que yo quiero es que no puedan ni imaginarse la tarea que les tacara en los siguientes días, que el acomodo laumnos tarea sea al azar para que no tengan ni idea la tarea que les tocara al siguiente día... de antemano muchas gracias amigo selu123
Buenos, eso se puede hacer un poco más complicado.
Te planteo una opción para hacerlo. Para ello solo voy a tener en cuenta 4 alumnos y 4 tareas:
Desde la posición "A1" pondríamos la siguiente tabla:
a 1 2 3 4
b 2 3 4 1
c 3 4 1 2
d 4 1 2 3
La columna A son los nombres, y desde la columna B hasta la E ponemos las tareas de esa forma.
Con el botón ponemos el siguiente código:
Private Sub CommandButton1_Click()
    Dim columna As Integer
    Dim encontrado As Boolean
    Dim tareasCompletas As Boolean
    Range("a1").Select
    'En primer lugar verifico si cada alumna ha hecho
    'todas las tareasalguna vez:
    i = 1
    tareasCompletas = True
    While i <= 4 And tareasCompletas
        If (Range("a1").Offset(4, i) = "") Then
            tareasCompletas = False
        End If
        i = i + 1
    Wend
    'si se han completado todas las tareass
    'se empieza de nuevo:
    If tareasCompletas Then
        MsgBox "Se han realizado todas las tareas. Se empieza de nuevo"
        For i = 1 To 4
            Range("a1").Offset(4, i) = ""
        Next i
    End If
    'ahora vamos a elegir tarea de entre las que quedan
    encontrado = False
    While Not encontrado
        Randomize ' inicia el generador de numeros aleatorios
        columna = Int((4 * Rnd) + 1) 'genera un numero entre 1 y 4
        If Range("a1").Offset(4, columna).Value <> "x" Then
            encontrado = True
            Range("a1").Offset(4, columna).Value = "x" 'marcamos la columna como ya elegida
        End If
    Wend
    'en este punto ya hemos encontrado una columna que nunca se ha realizado
'el numero aleatorio está entre 1 y 4, pero las columnas de las tareas empiezan en el 2
columna = columna + 1
    For i = 2 To 5 'tenemos que tener en cuenta que las tareas empiezan en B
        If i = columna Then
            Columns(i).EntireColumn.Hidden = False
        Else
            Columns(i).EntireColumn.Hidden = True
        End If
    Next i
End Sub
Lo que hace es analizar qué columna aún no ha mostrado, y muestra esa (oculta el resto). Cuando se han mostrado todas las columnas se empieza de cero.
Puedes adaptarlo  para tus 14 alumnos y 14 tareas.
Un saludo
<div id="_mcePaste" style="overflow: hidden; position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px;">
<table style="border-collapse: collapse; width: 100pt;" border="0" cellspacing="0" cellpadding="0" width="135">
<col style="width: 20pt;" span="5" width="27"></col>
<tbody>
<tr style="height: 12.75pt;" height="17">
<td style="height: 12.75pt; width: 20pt;" width="27" height="17">a</td>
<td style="width: 20pt;" width="27" align="right">1</td>
<td style="width: 20pt;" width="27" align="right">2</td>
<td style="width: 20pt;" width="27" align="right">3</td>
<td style="width: 20pt;" width="27" align="right">4</td>
</tr>
<tr style="height: 12.75pt;" height="17">
<td style="height: 12.75pt;" height="17">b</td>
<td align="right">2</td>
<td align="right">3</td>
<td align="right">4</td>
<td align="right">1</td>
</tr>
<tr style="height: 12.75pt;" height="17">
<td style="height: 12.75pt;" height="17">c</td>
<td align="right">3</td>
<td align="right">4</td>
<td align="right">1</td>
<td align="right">2</td>
</tr>
<tr style="height: 12.75pt;" height="17">
<td style="height: 12.75pt;" height="17">d</td>
<td align="right">4</td>
<td align="right">1</td>
<td align="right">2</td>
<td align="right">3</td>
</tr>
</tbody>
</table>
</div>

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas