Hacer una distribución con Visual Basic Excel

Tengo una tabla de excel 2003 donde me constan:

Num personas

Salas

Personas por Salas

Personas por turnos

Tengo que distribuirlas en dos turnos

Numero de personas: 128

Numero de salas:16

Numero de turnos: 2

En este caso la distribución sería perfecta: en los dos turnos entrarían 4 personas por sala

Necesito un código en visual basic para que me distribuya a las personas de tal manera que los dos turnos tengan sus salas completas en los dos turnos. Bien con 4 personas o bien con 3

Por ejemplo si se me presentan 122

Turno 1: 16 salas con 4 personas

Turno 2: 10 salas con 4 personas y 6 con 3 personas

Si se me presentan 113:

Turno 1: 16 salas con 4 personas

Turno 2; 1 sala con 4 personas y 15 con 3 personas

Es decir, cuando el código prevea que no se van a completar las salas con 4, que empiece a completarlas con 3, pero en ningún caso, ninguna sala se ha de quedar vacía

2 respuestas

Respuesta
1

Este código te dirá como repartir los turnos y salas según el valor de la celda A1

Sub contar()
T = 128 - [A1]
S = 112 - [A1]
'T1
x = 16
y = 0
'T2
Z = 16
w = 0
If T <= 16 Then
MsgBox ("TURNO 1 - " & x & " salas con 4 personas" & Chr(13) & Chr(13) & "TURNO 2 - " & Z - T & " salas con 4 personas y " & Chr(13) & "                   " & w + T & " salas con 3 personas")
Else
MsgBox ("TURNO 1 - " & x - S & " salas con 4 personas" & Chr(13) & "                     " & y + S & " salas con 3 personas" & Chr(13) & Chr(13) & Chr(13) & "TURNO 2 - 16 salas con 3 personas")
End If
End Sub

Ten en cuenta que como mínimo tendrás que tener 96 personas para que haya 3 personas en cada turno y cada sala

Ok. Está perfecto para saber la distribución a priori. Pero lo que necesito es lo siguiente:

Voy a tener un listado de X (hasta 128)...

Verás, no tengo idea y lo mismo estoy pidiendo demasiado

Yo te lo cuento y ya me dices

Como decía. Me pasarán un listado con números del 1 al 128 (si vienen todos) o del 1 al que sea (si no vienen todos)

Necesito que con la programación, al lado de mi columna donde tengo a las personas calificadas por números consecutivos me cree dos nuevas columnas: una de TURNO (1 ó 2) y otra de SALA (1 a 16). Y teniendo en cuenta la distribución que ya te comenté, me las rellene, asignado a cada asistente su turno y su sala.

En el primer turno se completarán primero por 4 asistentes por sala y en el segundo turno por 4 o por 3 por sala porque la distribución perfecta de 4-4 es con el total de asistentes. Según baje el número de asistentes, las salas del segundo turno se completarán con 3. Hasta 112 que tendré primer turno con las 16 salas de 4 y segundo turno con las 16 salas de 3

Por debajo de 112, las salas del segundo turno serían siempre de 3 y las del primer turno comenzarían a distribuirse entre 4 y 3 (siendo siempre las primeras salas del turno 1 las que queden completas con 4 y dejando las últimas con 3).

Muchísimas gracias por tu atención. Un saludo

Entiendo que es una pregunta nueva y que la primera ha quedado respondida completamente.

Haz una pregunta nueva en el foro poniendo un link a este post. Así cualquier experto te podrá ayudar

Respuesta
1

Te propongo lo siguiente.

En la celda A2 pon el número de personas, en la columna C y en la columna E te aparecerá el número de personas por sala, turnos 1 y 2 respectivamente. Ver siguiente imagen:

Asigna la siguiente macro a un botón:

Sub Distribuir()
'Por.Dante Amor
    Range("C4:C19") = ""
    Range("E4:E19") = ""
    per_t = [A2]            'personas totales
    per_1 = 16 * 4          'personas sala 1
    'validaciones
    If per_t > 128 Then
        MsgBox "Número máximo permitido 128"
        Exit Sub
    End If
    '
    If per_t < 96 Then
        MsgBox "Número mínimo permitido 96"
        Exit Sub
    End If
    '
    'Proceso
    If per_t >= 112 Then
        Range("C4:C19") = 4
        per2 = per_t - per_1
        col = "E"
    Else
        Range("E4:E19") = 3
        per2 = per_t - 48
        col = "C"
    End If
    x = per2 - 48
    y = 16 - x
    j = 4
    For i = 1 To x
        Cells(j, col) = 4
        j = j + 1
    Next
    For i = 1 To y
        Cells(j, col) = 3
        j = j + 1
    Next
    MsgBox "fin"
End Sub

Cambia el número de personas en la celda A2 y ejecuta nuevamente la macro.

.

'S aludos. Dante Amor. Recuerda valorar la respuesta. G racias

.

.

.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas