Sub Distribuer(Plage As Range, ParamArray Motif())
Dim i&, Source As Range, cellule As Range, k&, nbdepl&
Application.ScreenUpdating = False
Set Source = Plage.Columns(1) ' Source = 1ère colonne de Plage
ReDim deplsucc(0 To UBound(Motif) - 1, 0 To 1) ' tableau des déplacements successifs (ligne & colonne)
For i = LBound(Motif) To UBound(Motif) - 1 ' boucle sur les cellules définissant le motif
deplsucc(i, 0) = Motif(i + 1).Row - Motif(i).Row ' calcul des déplacements d'une cellule à la cellule suivante
deplsucc(i, 1) = Motif(i + 1).Column - Motif(i).Column ' du motif (déplacement en ligne et en colonne)
Next i
Set cellule = Motif(0): k = -1 ' cellule de départ, un compteur k qui donne la ligne des déplacements à faire
For i = 1 To Source.Cells.Count ' boucle sur la plage des valeurs sources
cellule.Value = Source.Cells(i, 1).Value ' on affecte la valeur à la cellule courante du motif en cours
k = (k + 1) Mod UBound(Motif) ' on incrémente k et on prend son modulo par le (nombre de cellules -1) du motif
Set cellule = cellule.Offset(deplsucc(k, 0), deplsucc(k, 1)) ' on définit la prochaine cellule à compléter
Next i
End Sub