Boostez vos compétences Excel avec notre communauté !
Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force.
Apprenez, échangez, progressez – et tout ça gratuitement !
👉 Inscrivez-vous maintenant !
En cherchant sur le forum, j'ai trouvé cette macro de tri aléatoire, elle marche sur la colonne B, mais je voudrais que ça tri les colonnes B/C et D ensemble, je ne trouve pas ou lui dire choisir les 3 colonnes et faire un tri alétoire pour les 3 colonnes. Les données sur la même ligne doivent suivres le tri de la colonne B.
Code:
Sub Bouton1_QuandClic()
Dim tablo, temp
Dim i As Integer, j As Integer
With Sheets("Récapitulatif")
tablo = .Range("B12:D" & .Range("B65536").End(xlUp).Row)
End With
ReDim Preserve tablo(1 To UBound(tablo), 1 To 2)
For i = 1 To UBound(tablo)
tablo(i, 2) = Rnd
Next i
For i = 1 To UBound(tablo)
For j = 1 To UBound(tablo)
If tablo(i, 2) > tablo(j, 2) Then
For k = 1 To 2
temp = tablo(i, k)
tablo(i, k) = tablo(j, k)
tablo(j, k) = temp
Next k
End If
Next j
Next i
For i = 1 To UBound(tablo)
Cells(i + 11, 2) = tablo(i, 1)
Next i
End Sub
Sub Bouton1_QuandClic()
Dim tablo, temp
Dim i As Integer, j As Integer, k As Integer
With Sheets("Récapitulatif")
tablo = .Range("B12:D" & .Range("B65536").End(xlUp).Row)
ReDim Preserve tablo(1 To UBound(tablo, 1), 1 To UBound(tablo, 2) + 1)
For i = 1 To UBound(tablo, 1)
tablo(i, UBound(tablo, [COLOR="Red"]2[/COLOR])) = Rnd
Next i
For i = 1 To UBound(tablo, 1)
For j = 1 To UBound(tablo, 1)
If tablo(i, UBound(tablo, 2)) > tablo(j, UBound(tablo, 2)) Then
For k = 1 To UBound(tablo, 2)
temp = tablo(i, k)
tablo(i, k) = tablo(j, k)
tablo(j, k) = temp
Next k
End If
Next j
Next i
ReDim Preserve tablo(1 To UBound(tablo, 1), 1 To UBound(tablo, 2) - 1)
[COLOR="Red"].Range("B12:D" & .Range("B65536").End(xlUp).Row) = tablo[/COLOR]
End With
End Sub
Il n'est certainement pas optimisé (nombreux recours à UBound) et il peut être lent sur une longue liste de valeurs. À vous de voir...
Si je veux que le tri aléatoire soit sur la colonne C, je dois changer quoi ?
Code:
Sub Tri_inscription()
Dim tablo, temp
Dim i As Integer, j As Integer, k As Integer
With Sheets("Récapitulatif")
tablo = .Range("B12:D" & .Range("B65536").End(xlUp).Row)
ReDim Preserve tablo(1 To UBound(tablo, 1), 1 To UBound(tablo, 2) + 1)
For i = 1 To UBound(tablo, 1)
tablo(i, UBound(tablo, 2)) = Rnd
Next i
For i = 1 To UBound(tablo, 1)
For j = 1 To UBound(tablo, 1)
If tablo(i, UBound(tablo, 2)) > tablo(j, UBound(tablo, 2)) Then
For k = 1 To UBound(tablo, 2)
temp = tablo(i, k)
tablo(i, k) = tablo(j, k)
tablo(j, k) = temp
Next k
End If
Next j
Next i
ReDim Preserve tablo(1 To UBound(tablo, 1), 1 To UBound(tablo, 2) - 1)
.Range("B12:D" & .Range("B65536").End(xlUp).Row) = tablo
End With
End Sub
Pour ce qui est de la nouvelle demande, je ne saisis pas bien le problème. Comme elle est, la procédure mélange les lignes de la colonne B à la colonne D. S'agit-il maintenant de ne prendre que les colonnes C et D ? Ou autre chose ? Merci de préciser.
A noter : je déménage demain, donc si je n'ai pas le temps de reprendre contact ce soir, je ne pourrai peut-être revenir sur le forum que mercredi ou jeudi. Mais je reviendrai...
Je veux trier les 3 colonnes mais il faut que le mélange se fasse sur la seconde.
Sur la première colonne j'ai les noms et prénom sur la seconde le club sur la 3ème le n° de licence.
Quand je trie sur les noms il n'est pas rare de voir dans la colonne club 3 voir 4 fois de suite le club, je voudrais donc que ça brasse un peu mieux de façon à ne pas vaoir plus de 2 fois le club à la suite.
Je ne sais pas si c'est possible, vu que je ne comprend pas très bien le code que j'utilise. quelle est le critère de mélange ? le nombre de lignes ? les noms ? autre chose ?
Merci pour votre aide
Je serais patient au cas ou vous ne pourriez pas revenir avant votre déménagement.
Elle place les valeurs de la plage B12 à D21 dans la variable tablo. Ainsi tablo(1,1) prend la valeur de la cellule B12, tablo(1,2) prend la valeur de la cellule C12, tablo(1,3) prend la valeur de la cellule D12, tablo(2,1) prend la valeur de la cellule B13, etc. jusqu'à tablo(10,3) qui prend la valeur de la cellule D21.
Puis :
Code:
[COLOR="Teal"]ReDim Preserve tablo(1 To UBound(tablo, 1), 1 To UBound(tablo, 2) + 1)[/COLOR]
Elle ajoute une colonne supplémentaire à tablo. Cette colonne ne correspond à aucune cellule de la feuille de travail, c'est une colonne vide et...
Code:
[COLOR="Teal"] For i = 1 To UBound(tablo, 1)
tablo(i, UBound(tablo, 2)) = Rnd
Next i[/COLOR]
... la remplit avec des valeurs pseudo-aléatoires : il y a maintenant dix nombres presque "tirés au hasard" entre ZÉRO (inclus) et UN (exclu). Ce sont ces valeurs numériques qui vont être classées en ordre décroissant par :
Code:
[COLOR="Teal"] For i = 1 To UBound(tablo, 1)
For j = 1 To UBound(tablo, 1)
If tablo(i, UBound(tablo, 2)) > tablo(j, UBound(tablo, 2)) Then
[COLOR="DarkOrange"]For k = 1 To UBound(tablo, 2)
temp = tablo(i, k)
tablo(i, k) = tablo(j, k)
tablo(j, k) = temp
Next k[/COLOR]
End If
Next j
Next i[/COLOR]
La partie écrite en orange réalise le déplacement des lignes dans le tableau. Pour l'instant, RIEN N'A CHANGÉ sur la feuille de travail. On va coller tablo dans la feuille, mais avant, on supprime la colonne ajoutée (qui contient maintenant les nombres tirés au hasard ordonnés du plus grand au plus petit) :
Code:
[COLOR="Teal"] ReDim Preserve tablo(1 To UBound(tablo, 1), 1 To UBound(tablo, 2) - 1)[/COLOR]
Si vous admettez que le générateur de nombres aléatoires n'a pas trop de défaut et fournit une suite de nombres à peu près uniformément distribuée dans l'intervalle [0, 1[, les lignes sont mélangées "au hasard", et vous ne trouverez pas facilement une meilleure réponse.
En fait, pour vous le hasard fait trop bien les choses, et ce que vous voulez, c'est organiser la liste de manière raisonnée, selon des critères stricts. Par exemple, "Pas plus de deux fois de suite le même club". Autrement dit "Pas de mélange selon la loi du hasard", mais organisation minutieuse.
On peut au besoin faire intervenir un peu de hasard dans une organisation minutieuse, mais alors il faut, avant de programmer, fixer l'ensemble des règles que l'on veut respecter.
Merci Roger2327, votre explication est super claire, il est vrai que c'est plus un mélange qu'un tri, et effectivement un mixte tri melange serait pas mal. Je ne voudrais pas abuser et franchement je ne suis pas capable de le faire, donc je veux bien de votre aide.
Ça tombe bien, Orange vient de rétablir ma connexion (après moult coups de téléphone). Je traite dix jours de courrier en retard puis je jette un œil sur votre classeur... À bientôt !
La procédure ARRANGER (dans le classeur joint) devrait convenir.
Attention : elle est "brute de fonderie" et ne vérifie pas la condition de possibilité de réaliser l'arrangement que vous souhaitez. Cette condition peut s'énoncer comme suit :
Le double de l'effectif du plus gros club est inférieur ou égal à l'effectif total augmenté de un.
Si cette condition n'est pas réalisée, la procédure boucle indéfiniment.
Je serai heureux que vous me fassiez part de vos remarques. À bientôt...
ROGER2327
P.S. Je m'aperçois que j'ai mal lu la condition imposée : ma solution fait que le nom d'un club est toujours suivi du nom d'un autre club; ce qui est différent de
...qu'il n'y ait plus de 2 fois le même club à la suite...
javais demander 2 clubs max, mais comme cela a été fait ça me parait parfait, par contre si la condition n'est pas réalisée, il faudrait quelque chose qui l'arrête. Un timer peut être ?
Si c'est trop demander, c'est d'avoir les lignes commentées, que je comprenne comment ça marche. 😉
- Navigue sans publicité - Accède à Cléa, notre assistante IA experte Excel... et pas que... - Profite de fonctionnalités exclusives Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel. Je deviens Supporter XLD