merci pour ton retour
la feuille c'est la 1 ère (planning)
les variables nom et villes sont fixes, disponibilité et selecte changent après chaque samedi
le code :
Sub planning()
Dim tabville(6, 2)
Randomize Timer
dl = Cells(Rows.Count, 1).End(xlUp).Row
Range("d2").Resize(dl, 1).ClearContents
Set dict = CreateObject("scripting.dictionary")
For i = 2 To dl 'mémorise les dispo par villes
ville = Cells(i, 2) ' les villes dans la colonne B
If Cells(i, 3) = "1" Then ' disponibilité colonne C mais pour le 1 week end après ça change; cells = "1" çàd que employé est disponible
dict(ville) = dict(ville) & " " & i
End If
Next i
For Each ville In dict.keys 'sélectionner les villes avec assez de disponibilités
numeroligne = Split(dict(ville))
If UBound(numeroligne) >= 3 Then
k = k + 1
tabville(k, 1) = ville
tabville(k, 2) = dict(ville)
End If
Next
For i = 1 To k 'melange les villes candidates
a1 = aleatoire(1, k)
a2 = aleatoire(1, k)
a = tabville(a1, 1): tabville(a1, 1) = tabville(a2, 1): tabville(a2, 1) = a
a = tabville(a1, 2): tabville(a1, 2) = tabville(a2, 2): tabville(a2, 2) = a
Next i
For i = 1 To 3 'choisir 3 villes
numeroligne = Split(tabville(i, 2))
For j = 1 To 2 + IIf(i = 1, 1, 0) 'choisir 3 personnes première ville et 2 personnes pour chacune des 2 autres villes
Do
a = aleatoire(1, UBound(numeroligne))
Loop Until Cells(numeroligne(a), 4) = "" ' affectation dans la colonne D
Cells(numeroligne(a), 4) = "W" ' W signifie que employé travaille le samedi
Next j
Next i
End Sub
Function aleatoire(borne_inférieure, borne_supérieure)
aleatoire = Int(Rnd() * (borne_supérieure - borne_inférieure + 1)) + borne_inférieure
End Function