Limitar Do ... Loop
S.Court
-
michel_m Mensajes publicados 18903 Fecha de registro Estado Colaborador Última intervención -
michel_m Mensajes publicados 18903 Fecha de registro Estado Colaborador Última intervención -
Bonjour,
En el marco de mi pasantía, debo crear un plan automático a través de VBA.
He implementado un sistema de registro de asistencia que debe completarse antes de proceder a una asignación automática y aleatoria del personal.
Por lo tanto, cuando un empleado está presente, se le asigna un puesto aleatoriamente y si está ausente, debe aparecer "Ausente / Vacaciones".
Sin embargo, también he establecido una condición que impide que dos celdas en la misma hoja o la misma celda en hojas diferentes contengan el mismo valor para evitar duplicados.
La condición funciona bien, incluso demasiado bien... Es decir, suponiendo que dos empleados estén ausentes al mismo tiempo o que un empleado esté ausente dos semanas consecutivas, la condición realiza un bucle infinito.
¿Es posible remediarlo? Aquí hay un fragmento de la fórmula:
Public Sub Affectation2()
Do Until (Sheets(5).Range("B10") <> Sheets(5).Range("C10")) And (Sheets(5).Range("B10") <> Sheets(5).Range("D10")) And (Sheets(5).Range("B10") <> Sheets(5).Range("E10")) And (Sheets(5).Range("B10") <> Sheets(5).Range("F10")) And (Sheets(5).Range("B10") <> Sheets(5).Range("G10")) And (Sheets(5).Range("B10") <> Sheets(5).Range("H10")) And (Sheets(5).Range("B10") <> Sheets(5).Range("I10")) And (Sheets(5).Range("B10") <> Sheets(5).Range("J10")) And (Sheets(5).Range("B10") <> Sheets(5).Range("K10")) And (Sheets(5).Range("B10") <> Sheets(5).Range("L10")) _
And (Sheets(5).Range("C10") <> Sheets(5).Range("D10")) And (Sheets(5).Range("C10") <> Sheets(5).Range("E10")) And (Sheets(5).Range("C10") <> Sheets(5).Range("F10")) And (Sheets(5).Range("C10") <> Sheets(5).Range("G10")) And (Sheets(5).Range("C10") <> Sheets(5).Range("H10")) And (Sheets(5).Range("C10") <> Sheets(5).Range("I10")) And (Sheets(5).Range("C10") <> Sheets(5).Range("J10")) And (Sheets(5).Range("C10") <> Sheets(5).Range("K10")) And (Sheets(5).Range("C10") <> Sheets(5).Range("L10")) _
And (Sheets(5).Range("D10") <> Sheets(5).Range("E10")) And (Sheets(5).Range("D10") <> Sheets(5).Range("F10")) And (Sheets(5).Range("D10") <> Sheets(5).Range("G10")) And (Sheets(5).Range("D10") <> Sheets(5).Range("H10")) And (Sheets(5).Range("D10") <> Sheets(5).Range("I10")) And (Sheets(5).Range("D10") <> Sheets(5).Range("J10")) And (Sheets(5).Range("D10") <> Sheets(5).Range("K10")) And (Sheets(5).Range("D10") <> Sheets(5).Range("L10")) _
And (Sheets(5).Range("E10") <> Sheets(5).Range("F10")) And (Sheets(5).Range("E10") <> Sheets(5).Range("H10")) And (Sheets(5).Range("E10") <> Sheets(5).Range("J10")) And (Sheets(5).Range("E10") <> Sheets(5).Range("K10")) And (Sheets(5).Range("E10") <> Sheets(5).Range("L10")) _
And (Sheets(5).Range("F10") <> Sheets(5).Range("G10")) And (Sheets(5).Range("F10") <> Sheets(5).Range("H10")) And (Sheets(5).Range("F10") <> Sheets(5).Range("I10")) And (Sheets(5).Range("F10") <> Sheets(5).Range("J10")) And (Sheets(5).Range("F10") <> Sheets(5).Range("K10")) And (Sheets(5).Range("F10") <> Sheets(5).Range("L10")) _
And (Sheets(5).Range("H10") <> Sheets(5).Range("I10")) And (Sheets(5).Range("H10") <> Sheets(5).Range("J10")) And (Sheets(5).Range("H10") <> Sheets(5).Range("K10")) And (Sheets(5).Range("H10") <> Sheets(5).Range("L10")) _
And (Sheets(5).Range("J10") <> Sheets(5).Range("K10")) And (Sheets(5).Range("J10") <> Sheets(5).Range("L10")) _
And (Sheets(5).Range("K10") <> Sheets(5).Range("L10")) _
And (Sheets(5).Range("B10") <> Sheets(3).Range("B10")) And (Sheets(5).Range("C10") <> Sheets(3).Range("C10")) And (Sheets(5).Range("D10") <> Sheets(3).Range("D10")) And (Sheets(5).Range("E10") <> Sheets(3).Range("E10")) And (Sheets(5).Range("F10") <> Sheets(3).Range("F10")) And (Sheets(5).Range("G10") <> Sheets(3).Range("G10")) And (Sheets(5).Range("H10") <> Sheets(3).Range("H10")) And (Sheets(5).Range("I10") <> Sheets(3).Range("I10")) And (Sheets(5).Range("J10") <> Sheets(3).Range("J10")) And (Sheets(5).Range("K10") <> Sheets(3).Range("K10")) And (Sheets(5).Range("L10") <> Sheets(3).Range("L10"))
If Range("J2") = 0 Then
Sheets(5).Range("B10") = "Ausente / Vacaciones"
ElseIf Sheets(3).Range("B10") = "PT 9 S" Then
Application.Run ("Samedi")
Else: Application.Run ("BoucleCampergue2")
End If
...
Configuración: Windows Vista / Firefox 27.0
En el marco de mi pasantía, debo crear un plan automático a través de VBA.
He implementado un sistema de registro de asistencia que debe completarse antes de proceder a una asignación automática y aleatoria del personal.
Por lo tanto, cuando un empleado está presente, se le asigna un puesto aleatoriamente y si está ausente, debe aparecer "Ausente / Vacaciones".
Sin embargo, también he establecido una condición que impide que dos celdas en la misma hoja o la misma celda en hojas diferentes contengan el mismo valor para evitar duplicados.
La condición funciona bien, incluso demasiado bien... Es decir, suponiendo que dos empleados estén ausentes al mismo tiempo o que un empleado esté ausente dos semanas consecutivas, la condición realiza un bucle infinito.
¿Es posible remediarlo? Aquí hay un fragmento de la fórmula:
Public Sub Affectation2()
Do Until (Sheets(5).Range("B10") <> Sheets(5).Range("C10")) And (Sheets(5).Range("B10") <> Sheets(5).Range("D10")) And (Sheets(5).Range("B10") <> Sheets(5).Range("E10")) And (Sheets(5).Range("B10") <> Sheets(5).Range("F10")) And (Sheets(5).Range("B10") <> Sheets(5).Range("G10")) And (Sheets(5).Range("B10") <> Sheets(5).Range("H10")) And (Sheets(5).Range("B10") <> Sheets(5).Range("I10")) And (Sheets(5).Range("B10") <> Sheets(5).Range("J10")) And (Sheets(5).Range("B10") <> Sheets(5).Range("K10")) And (Sheets(5).Range("B10") <> Sheets(5).Range("L10")) _
And (Sheets(5).Range("C10") <> Sheets(5).Range("D10")) And (Sheets(5).Range("C10") <> Sheets(5).Range("E10")) And (Sheets(5).Range("C10") <> Sheets(5).Range("F10")) And (Sheets(5).Range("C10") <> Sheets(5).Range("G10")) And (Sheets(5).Range("C10") <> Sheets(5).Range("H10")) And (Sheets(5).Range("C10") <> Sheets(5).Range("I10")) And (Sheets(5).Range("C10") <> Sheets(5).Range("J10")) And (Sheets(5).Range("C10") <> Sheets(5).Range("K10")) And (Sheets(5).Range("C10") <> Sheets(5).Range("L10")) _
And (Sheets(5).Range("D10") <> Sheets(5).Range("E10")) And (Sheets(5).Range("D10") <> Sheets(5).Range("F10")) And (Sheets(5).Range("D10") <> Sheets(5).Range("G10")) And (Sheets(5).Range("D10") <> Sheets(5).Range("H10")) And (Sheets(5).Range("D10") <> Sheets(5).Range("I10")) And (Sheets(5).Range("D10") <> Sheets(5).Range("J10")) And (Sheets(5).Range("D10") <> Sheets(5).Range("K10")) And (Sheets(5).Range("D10") <> Sheets(5).Range("L10")) _
And (Sheets(5).Range("E10") <> Sheets(5).Range("F10")) And (Sheets(5).Range("E10") <> Sheets(5).Range("H10")) And (Sheets(5).Range("E10") <> Sheets(5).Range("J10")) And (Sheets(5).Range("E10") <> Sheets(5).Range("K10")) And (Sheets(5).Range("E10") <> Sheets(5).Range("L10")) _
And (Sheets(5).Range("F10") <> Sheets(5).Range("G10")) And (Sheets(5).Range("F10") <> Sheets(5).Range("H10")) And (Sheets(5).Range("F10") <> Sheets(5).Range("I10")) And (Sheets(5).Range("F10") <> Sheets(5).Range("J10")) And (Sheets(5).Range("F10") <> Sheets(5).Range("K10")) And (Sheets(5).Range("F10") <> Sheets(5).Range("L10")) _
And (Sheets(5).Range("H10") <> Sheets(5).Range("I10")) And (Sheets(5).Range("H10") <> Sheets(5).Range("J10")) And (Sheets(5).Range("H10") <> Sheets(5).Range("K10")) And (Sheets(5).Range("H10") <> Sheets(5).Range("L10")) _
And (Sheets(5).Range("J10") <> Sheets(5).Range("K10")) And (Sheets(5).Range("J10") <> Sheets(5).Range("L10")) _
And (Sheets(5).Range("K10") <> Sheets(5).Range("L10")) _
And (Sheets(5).Range("B10") <> Sheets(3).Range("B10")) And (Sheets(5).Range("C10") <> Sheets(3).Range("C10")) And (Sheets(5).Range("D10") <> Sheets(3).Range("D10")) And (Sheets(5).Range("E10") <> Sheets(3).Range("E10")) And (Sheets(5).Range("F10") <> Sheets(3).Range("F10")) And (Sheets(5).Range("G10") <> Sheets(3).Range("G10")) And (Sheets(5).Range("H10") <> Sheets(3).Range("H10")) And (Sheets(5).Range("I10") <> Sheets(3).Range("I10")) And (Sheets(5).Range("J10") <> Sheets(3).Range("J10")) And (Sheets(5).Range("K10") <> Sheets(3).Range("K10")) And (Sheets(5).Range("L10") <> Sheets(3).Range("L10"))
If Range("J2") = 0 Then
Sheets(5).Range("B10") = "Ausente / Vacaciones"
ElseIf Sheets(3).Range("B10") = "PT 9 S" Then
Application.Run ("Samedi")
Else: Application.Run ("BoucleCampergue2")
End If
...
Configuración: Windows Vista / Firefox 27.0
2 respuestas
-
Hola,
¿Nada que ver con C, entonces?
¿Cambio la publicación de categoría...?
--
Google es tu amigo -
Hola,
no entendí tu macro, no hay bucle después de "do until".
No sé el por qué de todo esto...
Mientras tanto,
si quieres que se active solo si todos los valores en B10:L10 son diferentes,
If [sum(1/(countif(B10:L10,B10:L10)))] = 11 Then
quizás alivie un código indigesto.
--
Michel