Sub random()
'see https://excelmacromastery.com/vba-arraylist/
Dim rij(), kolom()
a0 = Range("C65:O70") '---> les disponibles, je supposes.
a = a0 'copy de cet array
ReDim rij(1 To UBound(a)) 'prepare array des lignes
ReDim kolom(1 To UBound(a, 2)) 'prepare array des columns
Set sca = CreateObject("system.collections.arraylist") 'prepare a sorted arraylist
best = 1E+99 'meilleur solution jusqu'à maintenant = chiffre enorme
For ptr1 = 1 To 100 'loop plusieurs solutions
For ptr2 = 1 To 100 'loop dans une solution
sca.Clear 'vider le SCA
For i = 1 To UBound(a): rij(i) = Application.Sum(Application.Index(a, i, 0)): Next 'nombre the 1's dans chaque ligne = normbre de fois une personne est assignée
For i = 1 To UBound(a, 2): kolom(i) = Application.Sum(Application.Index(a, 0, i)): Next 'nombre de 1's dans une column = nombre de personnes assignées dans une semaine
For i = 1 To UBound(a) 'loop personnes
For j = 1 To UBound(a, 2) 'loop semaines
sca.Add Join(Array(Format(Rnd + a(i, j) * rij(i) * kolom(j), "000.0000000000000"), i, j), "|") 'add a poids pour tous les possibilités présents
Next
Next
sca.Sort 'sort ascending
sca.Reverse 'sort reversed
a1 = sca.toarray 'read SCA dans un array
For k = 0 To UBound(a1) 'loop dans les possibilités à partir avec celui avec le poids le plus grand (=personne avec plus d'assignements dans une semaine trop peuplé)
sp = Split(a1(0), "|") 'split possibilié
b = (rij(sp(1)) > 2) * (kolom(sp(2)) > 1) 'personne avec plus de 2 assignements dans une semaine avec plus d'une personne assignée ?
If b Then a(sp(1), sp(2)) = 0: Exit For 'Oui ? alors effacer
Next
If b = 0 Then Exit For 's'on n'a pas pu effacer une possibilité, arrëtez !
Next
For i = 1 To UBound(a): rij(i) = Application.Sum(Application.Index(a, i, 0)): Next 'nombre de fois une personne est assignée
For i = 1 To UBound(a, 2): kolom(i) = Application.Sum(Application.Index(a, 0, i)): Next 'nombre de personnes par semaine
If Application.Max(kolom) < best Then 'prend la meilleur solution (moindre de personne par semaine)
Range("C80").Resize(UBound(a), UBound(a, 2)).Value = a 'copy array to feuille
best = Application.Max(kolom) 'nouvelle meilleur solution
If best = 1 Then Exit For
End If
Next
End Sub