Tris aléatoire d'une colonne qui devrait se limiter jusqu'à la première cellule vide

bellenm

XLDnaute Impliqué
Bonjour à tous,

Je cherchais un moyen pour trier aléatoirement une colonne, je l'ai trouver sur ce forum MAIS il y a une chose qui ne vas pas car ce système de tris fonctionne sur toute une colonne jusqu’à la fin de la feuille.

Hors j'ai une limite, une liste de nom à trier aléatoirement mais ce tri ne devrait plus prendre les noms ce situant après une cellule trouvée vide ou ayant une notification du style "***" .

Voici un exemple en fichier joint.

Merci d'avance pour le temps passer a me lire.

Marc..
 

Pièces jointes

  • test tris.xlsx
    19.7 KB · Affichages: 48

JHA

XLDnaute Barbatruc
Re : Tris aléatoire d'une colonne qui devrait se limiter jusqu'à la première cellule

Bonjour à tous,

Un exemple sans VBA mais avec une colonne supplémentaire.

JHA
 

Pièces jointes

  • test tris.xlsx
    17 KB · Affichages: 31

bellenm

XLDnaute Impliqué
Re : Tris aléatoire d'une colonne qui devrait se limiter jusqu'à la première cellule

Bonjour PAF et JHA,

pour PAF, excuse je joint le fichier qui ouvre aussi les macros necessaire la feuille se trouve dans l'onglet " TIRAGELISTING".
pour JHA, je ne comprend pas la méthode et ne vois pas où tu veux en venir.

Je vous explique ce que j'aimerais faire:
- dans un premier temps mais cela ne concerne pas ce problème, j'encode des noms sur une autre feuille "joueurs" pour les importer après avoir trier si le joueur est bien présent, résultat en colonne "A"
- sur cette feuille je les mélange aléatoirement pour obtenir la colonne "B".

Il faudrait que le tris aléatoire de cette colonne "A" s’arrête dés qu'il y a "***" car les noms mis après les trois "*" sont absent SAUF si le nombre atteint est impair alors insérer la ligne "***" elle servira de joker!
- ensuite il faudrait refaire un tris sur la colonne "m2:m13" et mettre le résultat dans la colonne "n2:n13" et également pour la suite "m16:m21" dans la colonne "n16:n21".

J'espère qu'on me comprend, c'est pour un tournoi de double avec maximun 24 participants joueurs tiré au sort pour chaque tour. Les joueurs ayant perdus leurs rencontres sont éliminé.

PS: si quelqu'un saurait comment bougé le petit cadre avec Tirage sur fond orange , merciiii.
Marc.
 

Pièces jointes

  • tournoi2.xlsm
    287.8 KB · Affichages: 36
Dernière modification par un modérateur:

Paf

XLDnaute Barbatruc
Re : Tris aléatoire d'une colonne qui devrait se limiter jusqu'à la première cellule

Re,

pour ne prendre, dans la colonne A de la feuille TIRAGELISTING, que jusqu'à la valeur "***", un essai:

dans la Sub TirageNoms():

remplacer
Code:
With Sheets("TIRAGELISTING")
lig = .Range("A65536").End(xlUp).Row
TabNom = .Range("A3:A" & lig)
.Range("B3:B" & lig).ClearContents
' Fin de liste
n = .Range("A65536").End(xlUp).Row
' Nombre de joueurs inscrits
Nbinscrits = n - 1
End With
par
Code:
With Sheets("TIRAGELISTING")
Set c = .Range("A:A").Find("~***", LookIn:=xlValues)
If c Is Nothing Then Exit Sub
TabNom = .Range("A3:A" & c.Row)
.Range("B3:B" & c.Row).ClearContents
' Fin de liste
' Nombre de joueurs inscrits
Nbinscrits = c.Row - 1
End With

pas regardé les implications de cette modif dans les résultats affichés

A+
 

bellenm

XLDnaute Impliqué
Re : Tris aléatoire d'une colonne qui devrait se limiter jusqu'à la première cellule

Re bonjour PAF,

Ta solution fonctionne, il reste plus que le tri à faire sur les cellules "m3:m13 et m16:m21" et sachant que la les 3 * se transforme en "0" .

Tu aurais une idée sur le petit rectangle orange? (pour le suprimer)

Déjà merci pour la formule

Marc
 
Dernière modification par un modérateur:

bellenm

XLDnaute Impliqué
Re : Tris aléatoire d'une colonne qui devrait se limiter jusqu'à la première cellule

Bonjour à tous,

Paf m'a résolu le premier problème, mais pourquoi même en modifiant le code pour les cellules adéquate à savoir le tri aléatoire sur la colonne "A" et le résultat sur la colonne "B" sur la feuille "TIRAGELISTING"

Mais il me reste deux tris aléatoire à faire sur les cellules "N2:N13" résultat en colonne "O2:O13"et une autre sur les cellules "N16:N21" résultat en " O16:O21".

voici ce qui a été fait pour le premier tri:
Code:
Sub TirageNoms()
Dim TabNom As Variant, temp As Variant, lig As Integer, i As Byte, j As Integer, k As Integer, l As Integer
Dim n As Integer, x As Double, Z As Byte, Nbinscrits As Byte
Randomize
With Sheets("TIRAGELISTING")
Set c = .Range("A:A").Find("~***", LookIn:=xlValues)
If c Is Nothing Then Exit Sub
TabNom = .Range("A3:A" & c.Row)
.Range("B3:B" & c.Row).ClearContents
' Fin de liste
' Nombre de joueurs inscrits
Nbinscrits = c.Row - 1
End With
' Mise en tableau des noms et des nombres aléatoires
ReDim Tablo(1 To UBound(TabNom), 1 To 3)
For j = 1 To UBound(TabNom)
        Tablo(j, 1) = Cells(j + 1, 1)
        Z = 0
            Do
            x = Rnd
               For k = 1 To j
               If Tablo(k, 2) = x Then
               Z = 0
               Else
               Z = 1
               End If
               Next k
            Loop Until Z = 1
        Tablo(j, 2) = x
        Tablo(j, 3) = x
    Next j
' Placer les nombres dans l'ordre décroissant dans la colonne 3 du tableau
For k = 1 To UBound(Tablo)
        For l = 1 To UBound(Tablo)
            If Tablo(k, 3) < Tablo(l, 3) Then
                    temp = Tablo(k, 3)
                    Tablo(k, 3) = Tablo(l, 3)
                    Tablo(l, 3) = temp
            End If
        Next l
Next k
' Mise en place des noms en colonne B
For i = 1 To UBound(Tablo)
      For j = 1 To UBound(Tablo)
         If Tablo(i, 3) = Tablo(j, 2) Then
         Cells(i + 1, 2) = Tablo(j, 1)
         End If
      Next j
Next i
End Sub

j'ai essayer pour le deuxième tri, mais il lance le débogueur et là je comprend pas où le code ne peut ce faire où ce n'est pas la bonne formule :
Code:
Sub TirageNoms2()
Dim TabNom As Variant, temp As Variant, lig As Integer, i As Byte, j As Integer, k As Integer, l As Integer
Dim n As Integer, x As Double, Z As Byte, Nbinscrits As Byte
Randomize
 ' voici le code de PAF que j'ai modifier avec les cellules adéquate mais ne fonctionne pas!
  With Sheets("TIRAGELISTING")
  Set c = .Range("N:N").Find("~***", LookIn:=xlValues)
  If c Is Nothing Then Exit Sub
  TabNom = .Range("N:N" & c.Row)
  .Range("O:O" & c.Row).ClearContents
  ' Fin de liste
  ' Nombre de joueurs inscrits
  Nbinscrits = c.Row - 1
  End With
' Mise en tableau des noms et des nombres aléatoires
ReDim Tablo(1 To UBound(TabNom), 1 To 3)
For j = 1 To UBound(TabNom)
        Tablo(j, 1) = Cells(j + 1, 1)
        Z = 0
            Do
            x = Rnd
               For k = 1 To j
               If Tablo(k, 2) = x Then
               Z = 0
               Else
               Z = 1
               End If
               Next k
            Loop Until Z = 1
        Tablo(j, 2) = x
        Tablo(j, 3) = x
    Next j
' Placer les nombres dans l'ordre décroissant dans la colonne 3 du tableau
For k = 1 To UBound(Tablo)
        For l = 1 To UBound(Tablo)
            If Tablo(k, 3) < Tablo(l, 3) Then
                    temp = Tablo(k, 3)
                    Tablo(k, 3) = Tablo(l, 3)
                    Tablo(l, 3) = temp
            End If
        Next l
Next k
' Mise en place des noms en colonne B
For i = 1 To UBound(Tablo)
      For j = 1 To UBound(Tablo)
         If Tablo(i, 3) = Tablo(j, 2) Then
         Cells(i + 1, 2) = Tablo(j, 1)
         End If
      Next j
Next i
End Sub

Quelqu'un aurait'il la solution ?

Merci

Marc
 

Paf

XLDnaute Barbatruc
Re : Tris aléatoire d'une colonne qui devrait se limiter jusqu'à la première cellule

re,

mais il lance le débogueur et là je comprend pas où le code ne peut ce faire...

il aurait été bien de préciser la ligne surligné en jaune par le 'debogueur'.

a priori, ça se situerait bien là:

.Range("O:O" & c.Row).ClearContents on précise la fin de la plage en colonne O, mais pas le début .

peut-être : .Range("O3:O" & c.Row).ClearContents

Bonne suite
 

bellenm

XLDnaute Impliqué
Re : Tris aléatoire d'une colonne qui devrait se limiter jusqu'à la première cellule

Bonjour PAF,

j'ai essayer avec ".Range"O3:O" & c.Row).ClearContents" alors c'est la ligne juste au dessus qui buge j'ai donc mis "TabNom = .Range("N3:N" & c.Row)" mais alors c'est comme si je lançais ta formule et donc bien la colonne "B" qui ce met en tris et pas la colonne demandée "O".

Ou trouver la solution ou bien avec "alea()" pour cette rangée de donnée mais je cherche la formule sur le forum j'ai déjà et c'est simple su mettre de valeur aléatoire mais faut encore les trier après pour que les noms soit bien aléatoire tout en sachant que dès qu'il y a un "0" la liste est finie!

Merci d'avance
Marc.
 

Pièces jointes

  • tournoi2.xlsm
    289.5 KB · Affichages: 38

bellenm

XLDnaute Impliqué
Re : Tris aléatoire d'une colonne qui devrait se limiter jusqu'à la première cellule

Bonjour à Tous,

- PAF j'ai réfléchis pendant le WE et peut-être trouvé solution mais pour ce faire il me faudrait la même liste que la colonne "B" mais non Trier en colonne "AC"

voici le code de départ avec une seul modification dans le nom de "Find" j'ai rajouter"FIN DE LISTE ***"

Code:
Sub TirageNoms()
Dim TabNom As Variant, temp As Variant, lig As Integer, i As Byte, j As Integer, k As Integer, l As Integer
Dim n As Integer, x As Double, Z As Byte, Nbinscrits As Byte
Randomize
With Sheets("TIRAGELISTING")
Set c = .Range("A:A").Find("~*** FIN DE LISTE ***", LookIn:=xlValues)
If c Is Nothing Then Exit Sub
TabNom = .Range("A3:A" & c.Row)
.Range("B3:B" & c.Row).ClearContents
' Fin de liste
' Nombre de joueurs inscrits
Nbinscrits = c.Row - 1
End With
' Mise en tableau des noms et des nombres aléatoires
ReDim Tablo(1 To UBound(TabNom), 1 To 3)
For j = 1 To UBound(TabNom)
        Tablo(j, 1) = Cells(j + 1, 1)
        Z = 0
            Do
            x = Rnd
               For k = 1 To j
               If Tablo(k, 2) = x Then
               Z = 0
               Else
               Z = 1
               End If
               Next k
            Loop Until Z = 1
        Tablo(j, 2) = x
        Tablo(j, 3) = x
    Next j
' Placer les nombres dans l'ordre décroissant dans la colonne 3 du tableau
For k = 1 To UBound(Tablo)
        For l = 1 To UBound(Tablo)
            If Tablo(k, 3) < Tablo(l, 3) Then
                    temp = Tablo(k, 3)
                    Tablo(k, 3) = Tablo(l, 3)
                    Tablo(l, 3) = temp
            End If
        Next l
Next k
' Mise en place des noms en colonne B
For i = 1 To UBound(Tablo)
      For j = 1 To UBound(Tablo)
         If Tablo(i, 3) = Tablo(j, 2) Then
         Cells(i + 1, 2) = Tablo(j, 1)
         End If
      Next j
Next i
End Sub

Merci de me dire si c'est faisable ou pas.

Merci d'avance.

Marc
 

Discussions similaires

Statistiques des forums

Discussions
312 174
Messages
2 085 949
Membres
103 057
dernier inscrit
SOP