Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.
  • Initiateur de la discussion Initiateur de la discussion David
  • Date de début Date de début

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 !

David

XLDnaute Occasionnel
Bonjour à tous

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

Merci d'avance
 
Re : Tri aléatoire

Bonsoir David
Ce code devrait fonctionner :​
Code:
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...​
Bonne nuit !
ROGER2327
 
Dernière édition:
Re : Tri aléatoire

Bonsoir roger2327

Merci pour ta modif;

J'ai un code erreur9 l'indice n'appartient pas à la selection :

Code:
tablo(i, UBound(tablo, 1)) = Rn

Je me demande si cette ligne va pas limiter mon tri aussi ?

Code:
 .Range("B1:D40") = tablo

Ce n'est pas très grave je pourrais le remplacer facilement, mais faudrait régler l'erreur d'exécution.

[edit] j'ai remplacè par :

Code:
.Range("B12:D" & .Range("B65536").End(xlUp).Row) = tablo
ça devrait marcher, reste l'erreur d'éxécution.

Pour l'optimisation, je ne sais pas trop, mais il n'est que pour 100 ligne maxi, ça devrait donc pas poser de problème.

Merci d'avance

Ps: il y en a qui se couche tard, même très tard !!! 🙂
 
Dernière édition:
Re : Tri aléatoire

Bonjour à tous

Oui, DAVID, tard... d'où les "erreurs".
Mais vous avez tout rétabli. Bravo !​
Je corrige le code ci-dessus.​

A plus tard,
ROGER2327
 
Dernière édition:
Re : Tri aléatoire

Bonjour à tous
C'est encore moi 🙂

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

Merci d'avance.
 
Re : Tri aléatoire

Bonjour DAVID
D'accord avec ça​
tablo(i, UBound(tablo, 2)) = Rnd
C'est bien 2 qui convient !​
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...​
À bientôt,
ROGER2327
 
Re : Tri aléatoire

Bonjour roger2327

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.
 
Dernière édition:
Re : Tri aléatoire

Bonjour à tous,
Pour DAVID, à propos du fonctionnement de sa procédure :​
Je suppose que le bloc à mélanger (plutôt qu'à trier) est B12 à D21, soit dix lignes. Qu'en fait la procédure ?
Code:
[COLOR="Teal"]tablo = .Range("B12:D" & .Range("B65536").End(xlUp).Row)[/COLOR]
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]
Enfin, on affiche le résultat :
Code:
[COLOR="Teal"]        .Range("B12:D" & .Range("B65536").End(xlUp).Row) = tablo[/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.​
On peut le faire, si vous voulez...​
À suivre...​
ROGER2327
 
Re : Tri aléatoire

J'en ai révé Roger2327 l'a fait !!

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.


Merci beaucoup.
 
Re : Tri aléatoire

Bonjour à tous

Je me permets un petit up si ROGER2327 ou quelqu'un d'autre peut regarder pour faire un tri aléatoire "organisé". 😉

Je mets une pièce jointe, le but est d'avoir un tri aléatoire sur la colonne Clubs, sans qu'il n'y ait plus de 2 fois le même club à la suite.

Merci d'avance.
 

Pièces jointes

Re : Tri aléatoire

Bonsoir David
Ç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 !​
ROGER2327
 
Re : Tri aléatoire

Re-bonsoir David
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...
Je vais reprendre le problème.
 

Pièces jointes

Dernière édition:
Re : Tri aléatoire

Bonsoir roger2327

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. 😉


Merci d'avance c'est hyper génial.
 
- 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

Discussions similaires

Réponses
15
Affichages
786
Réponses
8
Affichages
390
Réponses
4
Affichages
735
Réponses
5
Affichages
912
Réponses
4
Affichages
281
  • Question Question
Microsoft 365 Erreur UBound
Réponses
4
Affichages
293
Réponses
8
Affichages
782
Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…