tri tableau sur 2 critères

harzer

XLDnaute Nouveau
Bonjour à tous,
Vous pouvez remarquer que mon tableau à trier contient 9 colonnes avec la 1ere ligne (l’entête) qui est figée.
Je souhaite trier ce tableau (sans la ligne d’entête) sur la première colonne, pour mieux vous guider à me trouver une solution, je vous donne plus d’explications sur le contenue de mes cellules de la colonne A ainsi que le tri souhaité.
Explications sur le contenu : Toutes mes cellules de la première colonne contiennent un Tiret (-) suivi de 3 chiffres (ceci correspond au numéro de bague, qui ne dépasse jamais 999) et puis se terminent avec un nombre de 4 chiffres suivi soit de la lettre "F" ou "M" (Ce chiffre en question correspond à une année donnée.
Le tri souhaité : trier mon tableau dans un ordre croissant sur deux critères :
1er critère : tri croissant sur le nombre de 3 chiffres après le tiret (-).
2e critère : tri croissant sur le nombre de 4 chiffres (année) se trouvant avant l’espace et la lettre "M" ou "F"
Le tableau est toujours en évolution, c.-à-d. qu’on ne sait jamais la dernière ligne.
Vous trouverez en pièce jointe le fichier avec les données.
J’espère que j’étais clair, je reste à votre disposition pour d’autres renseignements.
Merci d’avance de votre aide.
 

Pièces jointes

  • Classeur1.xls
    159.5 KB · Affichages: 44
  • Classeur1.xls
    159.5 KB · Affichages: 55
  • Classeur1.xls
    159.5 KB · Affichages: 54

Dranreb

XLDnaute Barbatruc
Re : tri tableau sur 2 critères

Bonsoir.
Écrite comme ça la procédure semble faire l'affaire :
VB:
Sub Bouton4_Cliquer()
Dim Plg As Range
Application.ScreenUpdating = False
Set Plg = ActiveSheet.[A2]
Set Plg = Plg.Resize(Plg(60000, 1).End(xlUp).Row - 1, 11)
Plg.Columns("J").FormulaR1C1 = "=MID(RC1,SEARCH(""-"",RC1)+1,3)&RIGHT(RC[-9],6)"
Plg.Sort Key1:=Plg.Columns("J"), Order1:=xlAscending, Header:=xlNo, _
        OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
        DataOption1:=xlSortNormal
Plg.Columns("J").Value = Empty
End Sub
 

ROGER2327

XLDnaute Barbatruc
Re : tri tableau sur 2 critères

Bonjour harzer.


(...) Toutes mes cellules de la première colonne contiennent un Tiret (-) suivi de 3 chiffres (ceci correspond au numéro de bague, qui ne dépasse jamais 999) et puis se terminent avec un nombre de 4 chiffres suivi soit de la lettre "F" ou "M" (...)
Comme DES76-SB/2011 M, par exemple ?


Bonne journée.


ℝOGER2327
#7960


Lundi 2 Tatane 142 (Commémoration du Père Ebé - fête Suprême Quarte)
27 Messidor An CCXXIII, 0,7271h - ail
2015-W29-3T01:44:42Z
 

ROGER2327

XLDnaute Barbatruc
Re : tri tableau sur 2 critères

Re...


Bonjour

C'est vrai ROGER2327, et c'est peut être un peu à cause de celui là que je me suis désintéressé de ceux qui auraient quand même été -BONs, mais nettement plus compliqués…
Eh oui ! Et il semble qu'il soit encore plus difficile de poser correctement le problème...

Au pif, donc :​
Code:
Sub Classe()
Dim i&, s$, Plg As Range, v()

    Application.ScreenUpdating = False
    Columns(1).Insert Shift:=xlToRight
    [A1].Value = "x"
    Set Plg = [A1].CurrentRegion
    Set Plg = Plg.Offset(1).Resize(Plg.Rows.Count - 1, Plg.Columns.Count)

    v = Plg.Columns(2).Value
    For i = 1 To UBound(v)
        If v(i, 1) Like "*-*-###*/*" Then
            s = "1" & Left$(Split(v(i, 1), "-")(2), 3)
        ElseIf v(i, 1) Like "*-###*/*" Then
            s = "1" & Left$(Split(v(i, 1), "-")(1), 3)
        Else
            s = "0000"
        End If
        v(i, 1) = s & Left$(Right$(v(i, 1), 6), 4)
    Next
    Plg.Columns(1).Value = v

    With Me.Sort
        .SortFields.Clear
        .SortFields.Add Key:=Plg.Columns(1), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortTextAsNumbers
        .SetRange Plg
        .Header = xlNo
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
    End With

    Columns(1).Delete Shift:=xlToLeft

End Sub


Bonne journée.


ℝOGER2327
#7961


Lundi 2 Tatane 142 (Commémoration du Père Ebé - fête Suprême Quarte)
27 Messidor An CCXXIII, 4,4706h - ail
2015-W29-3T10:43:46Z
 

harzer

XLDnaute Nouveau
Re : tri tableau sur 2 critères

Bonjour à vous deux.
Merci pour vos réponses.
Vous avez bien raison ROGER2377, je n'ai plus fait attention à ce détail (bien vu).
Pour permettre le tri, on peut remplacer le "SB" par 3 zéro "000", ainsi, on aura 3 chiffres.
J'ai testé le code que vous fait, il bloque malheureusement au niveau de :
With Me.Sort (sur le Me)
Je me suis amusé à faire le tri manuellement sur 4 années, voici le résultat :
Pour rappel, le tri se fait uniquement sur la colonne A.
Je me suis permis de faire le tri manuellement pour 4 années : 2004, 2005. 2006 et 2007. (2004 est l’année la plus ancienne, donc elle sera en tête de liste).
Pour l’année 2004, il y’a un seul sujet portant le numéro 054, il sera dans la première ligne.
Pour l’année 2005, pas de sujet, donc rien à afficher.
Pour l’année 2006, il y’a 5 sujets qui sont classés dans un ordre croissant qui est : 025 suivi 028 suivi de 041 suivi de 068 et enfin 076.
Pour l’année 2007, il y’a 9 sujets qui sont classés dans un ordre croissant qui est : 011 suivi 014 suivi de 022 suivi de 033 suivi de 040 suivi de 049 suivi de 067 suivi de 068 et enfin 075.
Voici le résultat des 4 années en question :
876-054/2004 F 899-061/2002 M 899-047/2002 F 15-04-04 4T
876-025/2006 F AC10-008/2010 M 876-027/2005 F 15-04-06 4T
PM14-028/2006 F 235-096/2005 M PM14-005/2004 F 15-04-06 4T
PM14-041/2006 M PM14-045/2004 M PM14-009/2004 F 15-04-06 4T
PM14-068/2006 M OP10-075/2005 M PM14-020/2005 F 15-04-06 4T
0811-076/2006 M 0811-055/2005 M 0811-044/2005 F 15-04-06 4T
PM14-011/2007 F OP10-075/2005 M PM14-032/2005 F 15-04-07 4T
MD55-014/2007 M PM14-029/2006 M PM14-020/2006 F 15-04-07 4T
876-022/2007 M 899-048/2006 M 899-166/2006 F 15-04-07 4T
876-033/2007 F 899-053/2006 M 876-054/2004 F 15-04-07 4T
PM14-040/2007 M 235-096/2005 M PM14-020/2005 F 15-04-07 4T
876-049/2007 F 899-048/2006 M 876-025/2006 F 15-04-07 4T
PM14-067/2007 F PM14-068/2006 M PM14-019/2006 F 15-04-07 4T
PM14-068/2007 F PM14-068/2006 M PM14-019/2006 F 15-04-07 4T
MD55-075/2007 F OP10-049/2006 M PM14-004/2006 F 5T
Merci, bonne programmation et à vous lire.
 

Dranreb

XLDnaute Barbatruc
Re : tri tableau sur 2 critères

Vous montrez un classement sur l'année, là, alors que vous aviez dit que c'était en premier sur le numéro ?

Voyez si c'est suffisant comme ça :
VB:
Sub Bouton4_Cliquer()
Dim Plg As Range
Application.ScreenUpdating = False
Set Plg = ActiveSheet.[A2]
Set Plg = Plg.Resize(Plg(60000, 1).End(xlUp).Row - 1, 11)
Plg.Columns("J").FormulaR1C1 = "=MID(RC1,LEN(RC1)-5,4)&MID(SUBSTITUTE(RC1,""-BON"",""""),SEARCH(""-"",RC1)+1,3)"
Plg.Sort Key1:=Plg.Columns("J"), Order1:=xlAscending, Header:=xlNo, OrderCustom:=1, _
   MatchCase:=False, Orientation:=xlTopToBottom, DataOption1:=xlSortNormal
Plg.Columns("J").Value = Empty
End Sub
 
Dernière édition:

ROGER2327

XLDnaute Barbatruc
Re : tri tableau sur 2 critères

Re...


(...)
J'ai testé le code que vous fait, il bloque malheureusement au niveau de :
With Me.Sort (sur le Me) (...)
Pas de problème chez moi. Voyez la pièce jointe.

Pour le reste, il faudrait choisir si le premier critère de tri est le numéro à trois chiffres ou l'année.​


Bonne soirée.


ℝOGER2327
#7962


Lundi 2 Tatane 142 (Commémoration du Père Ebé - fête Suprême Quarte)
27 Messidor An CCXXIII, 6,6228h - ail
2015-W29-3T15:53:41Z
 

Pièces jointes

  • Copie de Classeur1.xls
    167.5 KB · Affichages: 35
  • Copie de Classeur1.xls
    167.5 KB · Affichages: 52
  • Copie de Classeur1.xls
    167.5 KB · Affichages: 49

harzer

XLDnaute Nouveau
Re : tri tableau sur 2 critères

Bonjour à vous deux.
Merci encore à tous les deux.

Pour répondre à la question de ROGER2327:
Le premier critère est l'année puis le 2e critère est le numéro à trois chiffres.

Un petit mot à Dranreb: je ferais le test de votre code ce soir car je dois s'absenter.
Merci pour votre proposition.

Cordiale poignée de main à tous les deux.
 

ROGER2327

XLDnaute Barbatruc
Re : tri tableau sur 2 critères

Re...


(...)

Pour répondre à la question de ROGER2327:
Le premier critère est l'année puis le 2e critère est le numéro à trois chiffres.

(...)
Dans ce cas, il faut remplacer la ligne​
VB:
        v(i, 1) = s & Left$(Right$(v(i, 1), 6), 4)
par celle-là​
VB:
        v(i, 1) = Left$(Right$(v(i, 1), 6), 4) & s


ℝOGER2327
#7963


Lundi 2 Tatane 142 (Commémoration du Père Ebé - fête Suprême Quarte)
27 Messidor An CCXXIII, 8,2378h - ail
2015-W29-3T19:46:14Z
 

harzer

XLDnaute Nouveau
Re : tri tableau sur 2 critères

Bonjour Mrs les sauveurs,
J’ai testé vos codes respectifs, quelle merveille, les deux codes fonctionnent et donnent le même résultat (identique). C’est vraiment magnifique de savoir programmer de cette manière.
Dans le même ordre, puis-je vous solliciter afin de m’aider à trier le même tableau comme on l’a fait précédemment on lui ajoutant un tri supplémentaire, à savoir : regrouper en premier lieu les lignes avec les cellules qui finissent par la lettre "M" (cellules de la même année) suivi par les cellules qui finissent par la lettre "F" (de la même année aussi).
Voici le résultat obtenu avec les années 2004 – 2005 – 2006 - 2007
876-054/2004 F 856-061/2002 M 856-047/2002 F 15-04-04 4T
SC14-041/2006 M SC14-045/2004 M SC14-009/2004 F 15-04-06 4T
SC14-068/2006 M CT10-075/2005 M SC14-020/2005 F 15-04-06 4T
0811-076/2006 M 0811-055/2005 M 0811-044/2005 F 15-04-06 4T
876-025/2006 F AC10-008/2010 M 876-027/2005 F 15-04-06 4T
SC14-028/2006 F 235-096/2005 M SC14-005/2004 F 15-04-06 4T
SC55-014/2007 M SC14-029/2006 M SC14-020/2006 F 15-04-07 4T
876-022/2007 M 856-048/2006 M 856-166/2006 F 15-04-07 4T
SC14-040/2007 M 235-096/2005 M SC14-020/2005 F 15-04-07 4T
SC14-011/2007 F CT10-075/2005 M SC14-032/2005 F 15-04-07 4T
876-033/2007 F 856-053/2006 M 876-054/2004 F 15-04-07 4T
876-049/2007 F 856-048/2006 M 876-025/2006 F 15-04-07 4T
SC14-067/2007 F SC14-068/2006 M SC14-019/2006 F 15-04-07 4T
SC14-068/2007 F SC14-068/2006 M SC14-019/2006 F 15-04-07 4T
SC55-075/2007 F CT10-049/2006 M SC14-004/2006 F 5T

Coordialement.
 

ROGER2327

XLDnaute Barbatruc
Re : tri tableau sur 2 critères

Re...


Toujours la même ligne à modifier comme suit :​
Code:
        v(i, 1) = Left$(Right$(v(i, 1), 6), 4) & -(Right$(v(i, 1), 1) = "F") & s


ℝOGER2327
#7964


Lundi 2 Tatane 142 (Commémoration du Père Ebé - fête Suprême Quarte)
27 Messidor An CCXXIII, 9,1249h - ail
2015-W29-3T21:53:59Z
 

Discussions similaires

Réponses
9
Affichages
272
Réponses
55
Affichages
3 K
Réponses
4
Affichages
305

Statistiques des forums

Discussions
312 329
Messages
2 087 334
Membres
103 519
dernier inscrit
Thomas_grc11