Vba asignar tarea a empleado libre

Tengo filas con tareas con hora inicio, hora fin y num empleado. Tal como esto,,,

8:00 - 8:20 - emp1

8:10 - 8:35 - emp2

8:25 - 8:40 - emp1

9:15 - 9:30 - emp2

,,,,, etc

Ahora bien entra nueva tarea 8:37 - 9:10

Y tengo que asignar un empleado, en este caso puede hacerlo el emp2

Intento hacerlo primero con un for al final lista, posicionándose en primero con empleado vacío y posteriormente con otro for que se posiciona en primera fila y voy comparando, aunque me quedo estancado, ya que depende si tengo que comprobar con primera fila, ultima o intermedia.

1 Respuesta

Respuesta
2

Te propongo lo siguiente, en la hoja en una columna debes tener la lista completa de los empleados, y en otras celdas el horario a asignar.

Por ejemplo:


Ahora ejecuta la siguiente macro:

Sub Asignar_Empleado_Libre()
'Por Dante Amor
    '
    Set h = Sheets("Hoja2")
    Set rangoemp = h.Range("H2:H" & h.Range("H" & Rows.Count).End(xlUp).Row)
    rangoemp.Offset(0, 1).Value = ""
    ini = h.Range("E2")
    fin = h.Range("F2")
    '
    Set r = h.Columns("C")
    For Each empleado In rangoemp
        nombre = empleado.Value
        ocupado = False
        Set b = r.Find(empleado.Value, LookAt:=xlWhole)
        If Not b Is Nothing Then
            celda = b.Address
            Do
                'detalle
                If h.Cells(b.Row, "A").Value <= ini And _
                   h.Cells(b.Row, "B").Value >= ini Then
                    empleado.Offset(0, 1).Value = "No"
                    ocupado = True
                    Exit Do
                End If
                Set b = r.FindNext(b)
            Loop While Not b Is Nothing And b.Address <> celda
        End If
        If ocupado = False Then
            empleado.Offset(0, 1).Value = "Si"
            Exit For
        End If
    Next
    MsgBox "Fin"
End Sub

Lo que hace la macro es revisar empleado por empleado, si el empleado está ocupado, pasa al siguiente empleado. Si encuentra un empleado que no está ocupado en el horario a asignar, entonces en la lista de empleados lo marca con un "Sí" como disponible y se detiene la macro:


En esta parte de la macro se sabe si el empleado está disponible:

        If ocupado = False Then
            empleado.Offset(0, 1).Value = "Si"
            Exit For
        End If

Dentro del If puedes agregar más código si lo necesitas, por ejemplo, si quieres que se agregue el empleado y el horario a las columnas A,B y C, sería algo así:

Sub Asignar_Empleado_Libre()
'Por Dante Amor
    '
    Set h = Sheets("Hoja2")
    Set rangoemp = h.Range("H2:H" & h.Range("H" & Rows.Count).End(xlUp).Row)
    rangoemp.Offset(0, 1).Value = ""
    ini = h.Range("E2")
    fin = h.Range("F2")
    '
    Set r = h.Columns("C")
    For Each empleado In rangoemp
        nombre = empleado.Value
        ocupado = False
        Set b = r.Find(empleado.Value, LookAt:=xlWhole)
        If Not b Is Nothing Then
            celda = b.Address
            Do
                'detalle
                If h.Cells(b.Row, "A").Value <= ini And _
                   h.Cells(b.Row, "B").Value >= ini Then
                    empleado.Offset(0, 1).Value = "No"
                    ocupado = True
                    Exit Do
                End If
                Set b = r.FindNext(b)
            Loop While Not b Is Nothing And b.Address <> celda
        End If
        If ocupado = False Then
            empleado.Offset(0, 1).Value = "Si"
            u = h.Range("A" & Rows.Count).End(xlUp).Row + 1
            h.Range("A" & u).Value = ini
            h.Range("B" & u).Value = fin
            h.Range("C" & u).Value = empleado.Value
            Exit For
        End If
    Next
    MsgBox "Fin"
End Sub

'.[Sal u dos. Dante Amor. No olvides valorar la respuesta. 
'.[Avísame cualquier duda

¡Gracias! Voy a intentar comprender el codigo. Sólo me manejo un poco. En principio intentaba realizarlo solo en tres columnas A, B, C (tal y como lo pones) ya que el horario a asignar (tus columnas E, F) me salen en A y B. Ya que me descargo listados cada cierto tiempo y me van saliendo tareas nuevas, en A, B,C. Los empleados, los tengo simplemente con un numero, 1, 2, 3, 4,,,,si no hay ninguno disponible,,,sumo 1 y tendria el empleado 5. Muchas gracias por las molestias,  Si no se puede realizar solo en estas tres columnas, intento adaptarlo a su propuesta. Un saludo

Hola Buenas, si tengo varias tareas en las columnas E y F, solo me asigna la primera, imagino que tal vez ini y fin debería indicar algo parecido a lo siguiente y posteriormente recorrer cada una de esas filas, ¿cómo.se haría?

Set ini = h.Range("E2:E" & h.Range("E" & Rows.Count).End(xlUp).Row)

Set fin = h.Range("F2:F" & h.Range("F" & Rows.Count).End(xlUp).Row)

Muchas gracias!

Seria posible realizar la asignación, si estuvieran todas las filas, asignadas, como sin asignar solo en las columnas A, B, y C y sin contar con las columnas H, I, ayundandose de alguna variable para la disponibilidad.

Gracias, nuevamente y saludos

En tu petición solamente mencionas una nueva tarea.

Ahora bien entra nueva tarea 8:37 - 9:10

No mencionas en dónde están tus empleados, ni en dónde piensas poner las tareas nuevas a asignar.


Lo que te entregué es un diseño de cómo podrías poner tus datos.

Tampoco imagino que si tienes 100 tareas tengas 100 empleados, supongo que tienes un número específico de empleados, ¿o por cada tarea nueva vas a contratar a un nuevo empleado?


El diseño y la macro cumple con lo primero que solicitaste.

Si me entregas un diseño de cómo vas a acomodar los datos y me explicas cómo quieres la asignación te creo una nueva macro.


Con todo gusto te ayudo con una nueva macro. Valora esta respuesta y crea una nueva pregunta con el detalle de la asignación. Procura utilizar imágenes para explicar lo que necesitas.

¡Gracias!

¿Realizo nueva pregunta o puedo continuar explicando esta? Los datos están dispuestos como has indicado en columna A, B, C y las nuevas tareas entran junto a las ya asignadas, (en este caso con empleado vacío en esas row) Debo comprobar, si de los ya asignados pueden hacer la tarea, porque no hay solapamiento o si no es posible añado un nuevo empleado.

Gracias, si tengo que formular pregunta nueva dímelo. La aplicación no me permite poner titulo parecido

Valora esta respuesta y crea una nueva.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas