Déterminer les groupes & les trier sur la colonne "AJ" en ordre décroissant

Bonjour à tous,

Dans l’impossibilité de trouver une solution, je m’adresse à vous en espérant trouver une solution.

Mes données se trouvent dans 3 colonnes ("AH", "AI" et "AJ"), les données commencent à partir de la cellule "AH3" et finissent à la cellule "AJ" & dernière ligne.

Le but de la demande est de trier l’ensemble de mes données en prenant soin de déterminer au préalable les groupes qui constituent l’ensemble de ces données et puis ensuite on fera le tri.

Comment déterminer ces groupes.

Les groupes sont déterminés par la valeur des cellules de la colonne "AH", c-à-d que toutes les cellules qui ont la même valeur aux cellules de la colonne "AH" constituent un groupe, j’ai coloré l’ensemble des groupes par des couleurs différentes afin que vous puissiez les localiser.

Lorsque les groupes sont déterminés, on fera le tri de chaque groupe sur les cellules de la colonne "AJ" pour les trier dans un ordre décroissant.

Le résultat souhaité doit figurer dans les mêmes colonnes ("AH", "AI" et "AJ").

Sauf erreur de ma part, le résultat final souhaité se trouve dans les colonnes ("AK", "AL" et "AM"), ainsi, vous pouvez comparer avec vos résultats en colonnes ("AH", "AI" et "AJ").

Je reste à votre disposition si besoin.

Merci pour vos contributions.

15tri-decroissant.xlsm (301.37 Ko)

Salut Harzer,

pas vraiment décroissant ton exemple à suivre !
Tu connais la chanson : un double-clic pour démarrer la macro!

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
'
Dim tTab, iTRow%, iTCol%, iIdx%, sCol$
'
Cancel = True
Application.EnableEvents = False
Application.ScreenUpdating = False
'
If Range("AH3").Value <> "" Then
    tTab = Range("AH1:AJ" & Range("AH" & Rows.Count).End(xlUp).Row + 1).Value
    For x = 4 To UBound(tTab, 1)
        If tTab(x, 1) <> tTab(x - 1, 1) Then
            Range("AH" & IIf(iTRow = 0, 3, iTRow)).Resize(x - IIf(iTRow = 0, 3, iTRow), 3).Sort _
                key1:=Range("AI" & IIf(iTRow = 0, 3, iTRow)), order1:=xlDescending, Orientation:=xlTopToBottom, Header:=xlNo
            iTRow = x
        End If
    Next
End If
'
Application.ScreenUpdating = True
Application.EnableEvents = True
'
End Sub

A+

Ah, j'ai lu trop vite et axé le tri sur la colonne [AI] et non sur la colonne [AJ] ! Ooooops!
Mais, ton tri "décroissant" est surtout "croissant", quand même !

Un double-clic,...

Bonjour Curulis,

Très heureux de te retrouver en espérant que tu vas bien.

Je ne sais pas sur quelle colonne que tu a fais le tri.

Pour rappel, le but du code est de trier chaque groupe séparement par rapport aux autres groupes sur la colonne "AJ" dans un ordre décroissant.

Au départ, le premier Groupe coloré en jaune non trié se compose comme suit :

ABE27-022/2022 M ABE27-037/2022 F 0,08

ABE27-022/2022 M ABE27-038/2022 F 0,08

ABE27-022/2022 M ABE27-017/2023 F 0,045

ABE27-022/2022 M ABE27-026/2022 F 0,07

ABE27-022/2022 M NIM96-010/2021 F 0,009

ABE27-022/2022 M ABE27-012/2024 F 0,068

ABE27-022/2022 M ABE27-014/2024 F 0,077

ABE27-022/2022 M ABE27-035/2024 F 0,075

ABE27-022/2022 M ABE27-036/2024 F 0,075

ABE27-022/2022 M ABE27-044/2024 F 0,055

ABE27-022/2022 M ABE27-060/2024 F 0,147

ABE27-022/2022 M ABE27-079/23-2024 F 0,055

ABE27-022/2022 M NIM96-006/2024 F 0,015

ABE27-022/2022 M NIM96-066/2024 F 0,015

Si je prends ce 1er groupe coloré en jaune, je le tri sur les cellules de sa colonne "AJ", théoriquement je dois avoir le résultat suivant :

ABE27-022/2022 M NIM96-010/2021 F 0,009

ABE27-022/2022 M NIM96-006/2024 F 0,015

ABE27-022/2022 M NIM96-066/2024 F 0,015

ABE27-022/2022 M ABE27-017/2023 F 0,045

ABE27-022/2022 M ABE27-044/2024 F 0,055

ABE27-022/2022 M ABE27-079/23-2024 F 0,055

ABE27-022/2022 M ABE27-012/2024 F 0,068

ABE27-022/2022 M ABE27-026/2022 F 0,07

ABE27-022/2022 M ABE27-035/2024 F 0,075

ABE27-022/2022 M ABE27-036/2024 F 0,075

ABE27-022/2022 M ABE27-014/2024 F 0,077

ABE27-022/2022 M ABE27-037/2022 F 0,08

ABE27-022/2022 M ABE27-038/2022 F 0,08

ABE27-022/2022 M ABE27-060/2024 F 0,147

Lorsque je lance le tri fait ma la macro j'ai le résultat suivant :

ABE27-022/2022 M NIM96-066/2024 F 0,015

ABE27-022/2022 M NIM96-010/2021 F 0,009

ABE27-022/2022 M NIM96-006/2024 F 0,015

ABE27-022/2022 M ABE27-079/23-2024 F 0,055

ABE27-022/2022 M ABE27-060/2024 F 0,147

ABE27-022/2022 M ABE27-044/2024 F 0,055

ABE27-022/2022 M ABE27-038/2022 F 0,08

ABE27-022/2022 M ABE27-037/2022 F 0,08

ABE27-022/2022 M ABE27-036/2024 F 0,075

ABE27-022/2022 M ABE27-035/2024 F 0,075

ABE27-022/2022 M ABE27-026/2022 F 0,07

ABE27-022/2022 M ABE27-017/2023 F 0,045

ABE27-022/2022 M ABE27-014/2024 F 0,077

ABE27-022/2022 M ABE27-012/2024 F 0,068

La plus petite valeur des cellules en colonne "AJ" est 0.009, la plus grandes valeurs des cellules de ce groupe est 0,147, ce qui implique que nous devons avoir la cellule 0.009 tout au début et en dernier lieu, nous devons avoir la cellule 0.147 à la dernière ligne de ce groupe.

Un autre petit détail, pour l'instant, j'ai fais les tests sur le petit fichier que j'ai élaboré pour ma demande, j'espère que lorsque je transfert le code élaboré par tes soins dans mon fichier réel, que je n'aurais pas de problème puisque j'ai déjà un code avec BeforeDoubleClick, a moins que tu me propose un code qui sera lié un bouton.

J'attends ton retour.

Au plaisir de te lire

Re,

Décidément, il n’y a rien qui vas chez moi ce soir (Je suis fatigué, après ce message, je vais faire dodo).

J'étais trop vite à mon tour aussi, désolé. Le tri doit se faire dans un ordre croissant, (du plus petit au plus grand).

Demain, je serais en déplacement, ne t’étonne pas si je te réponds pas.

À te lire

Sub Trier()
     Set dict = CreateObject("scripting.dictionary") 'dictionaire pour les mâles
     dict.comparemode = vbTextCompare
     Set sh = Sheets("Couples")
     i = Evaluate("max(if(couples!AH:AH<>"""",row(couples!AH:AH),0))") 'dern. ligne

     With sh.Range("AH3").Resize(i - 2, 3) 'plage à trier
          arr = .Columns(1).Value 'les mâles
          For i = 1 To UBound(arr)
               dict(arr(i, 1)) = 0 'mâles uniques
          Next
          dict([Rnd]) = 0

          Application.AddCustomList ListArray:=dict.keys     'ajouter notre list aux "Customlists"
          sh.Sort.SortFields.Clear           'RAZ les propriétés du triage
          .Sort .Range("A1"), xlAscending, OrderCustom:=Application.CustomListCount + 1, key2:=.Range("C1"), order2:=xlAscending, Header:=xlNo
          sh.Sort.SortFields.Clear           'RAZ les propriétés du triage
          Application.DeleteCustomList Application.CustomListCount     'supprimer notre liste
     End With
End Sub

Salut Harzer,
Salut BsAlv,

j'imagine que ce tri prend place dans ta feuille 'Nouveaux couples' ?
Dans ce cas, la manip' est encore plus simple que prévue : il suffit de remplacer une lettre dans le code de la macro que tu avais demandée pour créer des cadres par blocs de 3 verticaux.

image

Dans le module 'ThisWorkbook' se trouve la macro :

Private Sub Workbook_SheetBeforeDoubleClick(ByVal Sh As Object, ByVal Target As Range, Cancel As Boolean)
'
Dim tTab, iTRow%, iTCol%, iIdx%, sCol$
'
Cancel = True
Application.EnableEvents = False
Application.ScreenUpdating = False
'
Select Case Sh.Name
    Case "Nouveaux couples"
        If Range("AH3").Value <> "" Then
            Range("AL3").Resize(2000, 2000).Clear
            Range("AH3:AJ" & Range("AH" & Rows.Count).End(xlUp).Row).Sort _
                key1:=Range("AH3"), order1:=xlAscending, _
                key2:=Range("AJ3"), order2:=xlAscending, _
                Orientation:=xlTopToBottom, Header:=xlNo
            tTab = Range("AH1:AJ" & Range("AH" & Rows.Count).End(xlUp).Row + 1).Value

key2:=Range("AJ3"), order2:=xlAscending, _

Remplace "AI3" par "AJ3", simplement.

Ai-je bien compris ce que tu voulais ainsi ?

Bon courage pour ta journée de déplacement!

A+

Bonjour BsAlv & Curulis,

J’espère que vous allez bien.

Merci pour vos retours respectifs.

Je commence dans un premier temps à répondre à BsAlv.

Dans mon fichier que j’ai mis en pièce jointe pour les besoins de ma demande, je me suis trempé dans le nom de la feuille, le nom de la feuille est : "Nouveaux couples" et non "couples".

J’ai bien entendu changé le nom de la feuille comme il devait l'être : "Nouveaux couples" et depuis j’ai une erreur d'exécution 13 incompatibilité de type à la ligne de code suivante :

With sh.Range("AH3").Resize(i - 2, 3) 'plage à trier

Comment peut-on modifier le code de manière à lui apporter une solution?

Merci d’avance pour ta démarche pour corriger l’erreur.


Maintenant je réponds à Curulis,

La journée de déplacement a été fatigante, en vieillissant, on n’ose plus faire des grands déplacements, et lorsqu’on le fait, vu la densité de la circulation, cela occasionne du stress et demande beaucoup de concentration.

D’autant plus, si on habite une petite ville ou la circulation est très fluide.

Dans ton dernier message, tu as écrit ceci :

Remplace "AI3" par "AJ3", simplement.

Ai-je bien compris ce que tu voulais ainsi ?

Oui, tu as bien compris ma demande et c’est ce que je veux, merci pour ton code qui est opérationnel et répond à mes attentes.

Cordiale poignée de mains à tous les deux.

A vous lire.

re,

ces 2 lignes, remplacer "Couples" par "Nouveaux Couples"

 Set sh = Sheets("Nouveaux Couples")
 i = Evaluate("max(if(Nouveaux couples!AH:AH<>"""",row(Nouveaux couples!AH:AH),0))") 'dern. ligne

Bonjour BsAlv,

C'est bizarre !

C’est exactement ce que j’ai fait mais j’ai toujours la même erreur.

Je mets en pièce fointe le fichier afin que tu puisses te rendre compte par toi-même de cette erreur.

Merci et te relire.

Bonsoir à tous 🙂

Il ne faut pas entourer le nom de la feuille par des single quotes.

i = Evaluate("max(if('Nouveaux couples'!AH:AH<>"""",row('Nouveaux couples'!AH:AH),0))")

klin89

@Klin89, supér !!!

Bonjour Klin89 et BsAlv,

Merci pour vos retours et la solution apportée pour corriger l'erreur.

je mets un double pouce à Klin89 comme celui de BsAlv, Merci à tous.

Salutations cordiales.

Rechercher des sujets similaires à "determiner groupes trier colonne ordre decroissant"