re bonjour
voici le code avec quelques commentaires, n'hésite pas à me revenir si les commentaires ne sont pas compréhensibles.
Sub tirage()
nj = Cells(Rows.Count, 1).End(xlUp).Row - 3 ' nj = nombre d'agents
For i = 1 To nj ' on recopie les noms des agents en ligne 4 (1 agent par jour)
Cells(4, i + 5) = Cells(i + 3, 1)
Next i
'on crée d'abord un tableau on l'on est sûr d'avoir un agent différent par tache et différent pour chaque jour
'exemple sur un carré 4x4
'ABCD
'BCDA
'CDAB
'DABC
'pour cela, on remplit tout le tableau en décalant les agents vers la gauche, l'agent le plus à gauche va à la droite du tableau
For i = 2 To nj 'on prend chaque ligne
For j = 1 To nj 'on prend chaque colonne
If j = nj Then ' si jour le plus à droite on prend l'agent qui se trouve le plus à gauche
Cells(i + 3, j + 5) = Cells(i + 2, 6)
Else
Cells(i + 3, j + 5) = Cells(i + 2, j + 6) 'on copie l'agent qui se trouve dans la case supérieure de droite
End If
Next j
Next i
' le tableau est rempli sans doublon ligne ni colonne
'on peut mélanger les lignes et les colonnes
For i = 1 To 25 ' on mélange 25 fois les lignes et les colonnes
'melange colonne
d = Application.RandBetween(6, 5 + nj) 'choix aléatoire d'une colonne à déplacer
Range(Cells(4, d), Cells(3 + nj, d)).Cut
c = d
While c = d
c = Application.RandBetween(6, 5 + nj) ' choix aléatoire d'une colonne de destination
Wend
Range(Cells(4, c), Cells(3 + nj, c)).Insert shift:=xlToRight ' déplacement de la colonne au nouvel endroit
'melange ligne
d = Application.RandBetween(4, 3 + nj) ' choix aléatoire d'une ligne à déplacer
Range(Cells(d, 6), Cells(d, 5 + nj)).Cut
c = d
While c = d
c = Application.RandBetween(4, 3 + nj) 'choix alétoire d'une ligne de destination
Wend
Range(Cells(c, 6), Cells(c, 5 + nj)).Insert shift:=xlDown ' déplacement de la ligne au nouvel endroit
Next i
For c = 6 To 5 + nj 'on recopie les couleurs de l'entête
Range(Cells(4, c), Cells(3 + nj, c)).Interior.Color = Cells(3, c).Interior.Color
Next c
End Sub