bonjour,
ce n'est qu'un début
Sub aleatoire()
Dim Débit, Fin, Arr, Result, Pauze
Pauze = 5 '5 jours après tache
t = Timer 'chrometre
début = DateSerial(2022, 12, 1)
Fin = DateSerial(2023, 4, 30)
ReDim Result(1 To Fin - début + 1, 1 To 2) 'preparer l'array RESULTAT
Arr = Sheets("Nom").Range("A4:B25") 'lire les données des monteurs
ReDim Preserve Arr(1 To UBound(Arr), 1 To 3) 'ajouter une colonne supplementaire a cet array
For i = 1 To UBound(Result) 'boucle les jours
Result(i, 1) = début + i - 1 'jour
If WorksheetFunction.Weekday(Result(i, 1), 2) <> 6 Then 'ce n'est pas un samedi
seq = Evaluate("=column(A1:zz1)") 'serie de 1 a 700 (exagéré), (=1,2,3,4,5,6, ...., 702)
For j = UBound(Arr) To 1 Step -1 'boucle tous les monteurs
b = False 'drapeau
r = WorksheetFunction.RandBetween(1, j) 'monteur aleatoire
r1 = seq(r) 'numéro du monteur
If Arr(r1, 3) >= Arr(r1, 2) Then 'monteur a déjà fait tous ces tâches
seq(r) = seq(j) 'effacer ce monteur du liste pour ce jour
Else
For i1 = Application.Max(1, i - Pauze) To i - 1 'reculer tant de jours
If Result(i1, 2) = Arr(r1, 1) Then 'monteur a fait un tache pendant ces jours
seq(r) = seq(j) 'alors un autre
b = True 'drapeau
Exit For
End If
Next
If Not b Then 'drapeau bas
Result(i, 2) = Arr(r1, 1) 'assigner monteur à ce jour
Arr(r1, 3) = Arr(r1, 3) + 1 'incremer le nombre de taches de ce monteur
b = True 'drapeau haut
Exit For 'fin du boucle
End If
End If
Next
End If
Next
Sheets("nom").Range("E1").Resize(UBound(Result), UBound(Result, 2)).Value = Result 'array resultat >>> feuille
MsgBox "prêt en " & Format(Timer - t, "0.00\s")
End Sub