XL 2016 INDEX et/ou EQUIV

bof

XLDnaute Occasionnel
Bonjour,

J’ai toujours été sous doué en formules… et l'aide de crosoft m'a toujours semblé incompréhensible...
Je désire trier un tableau (pour l’exemple de 3 colonnes) selon la colonne C (à compléter par une formule.)
Cette colonne C doit être remplie par l’Index de la colonne H correspondant à B
Euh je ne sais pas si c’est clair, mais j’ai commencé à remplir cette colonne C en manuel YAPUKA trouver la formule qui donne ce résultat et l’étendre jusqu’en bas…
Le but étant que à la fin du tri sur la colonne C, tous les E de Ref se retrouvent en premier et tous les G en dernier…
Merci
 

Pièces jointes

  • INDEX.xlsm
    9.2 KB · Affichages: 7

bof

XLDnaute Occasionnel
Oui in fine quand on aura fini de remplir la colonne C avec une formule et qu'on aura trié sur la colonne C effectivement dans la colonne A on aura bien 1, 6, 25, 30, 54, 58, 33, 37...
Mais je ne sais pas trier comme ça sans indexer la colonne B en fonction du référentiel de tri (colonne H)
 

RyuAutodidacte

XLDnaute Impliqué
Bonjour,

une solution toute simple sans formule :
  1. Aller dans les options => liste personnalisée puis importer la liste depuis des cellule
    1696449056983.png


  2. Une fois les celllules sélectionnées, faire importer pour avoir la liste,
    valider/fermer la fenêtre et revenir au fichier
    1696449093449.png


  3. Sélectionner la plage à trier et faire "Trier", cocher qu'il y a des entêtes
    Choisir la colonne voulue : ici Ref
    et pour l'ordre sélectionner "Liste personnalisée…"
    1696449167380.png


  4. Sélectionner la liste que l'on a créé
    1696449184734.png


  5. Mettre l'ordre voulue (ordre croissant avec notre liste personnalisée)
    puis valider
    1696449330774.png


  6. Le résultat :
    1696449346041.png
Comme ça pas de problème pour un sous-doué en formule ;)
 
Dernière édition:

bof

XLDnaute Occasionnel
Bonsoir,
Cette solution ne me convient pas car il y a encore plus sous-doué que moi ! Donc je ferai une macro transparente qui fera le tri sans pb...
Ceci dit en réalité j'ai plusieurs milliers de lignes et plusieurs dizaines de colonnes... Si quelqu'un voit une solution qui ne m'oblige pas à créer une 3ème colonne qui ne me servira pas à grand chose... Mais je ne vois guère d'autre solution même en VBA car mon référentiel d'indexation pourrait bien évoluer en une douzaine d'items voire plus...
A+
 

RyuAutodidacte

XLDnaute Impliqué
Re,

Autre solution en utilisant la formule EQUIV :
En colonne D on créé la colonne TRI, en D2 on met la formule :
VB:
=EQUIV(B2;$H$2:$H$6;0)
on étire la formule, jusqu'à la fin de ligne des donnée
De la colonne A à D on met le filtre automatique
  1. si on veut les ID dans l'ordre, on trie dans l'ordre croissant la colonne C
  2. on trie dans l'ordre croissant la colonne TRI
 

Pièces jointes

  • INDEX.xlsm
    10 KB · Affichages: 2

CISCO

XLDnaute Barbatruc
Bonsoir

Encore une autre possibilité :
Dans le ruban, Données
Trier
Colonne B
A droite, Liste personnalisée
1696451995152.png

1696452100834.png

Complètement à droite, Ajouter
OK
1696452176529.png

Si tu tiens à garder l'ancienne liste, il suffit de travailler sur de nouvelles colonnes contenant les valeurs.

@ plus
 
Dernière édition:

bof

XLDnaute Occasionnel
Bonjour,
Ça ne va pas coller dans mon contexte (parce que je tiens absolument à finaliser mon tri par macro) mais ça me fera une petite piqure de rappel : Je ne pense jamais assez aux listes personnalisées.
Merci.
A+
 

RyuAutodidacte

XLDnaute Impliqué
Bonjour,
Ça ne va pas coller dans mon contexte (parce que je tiens absolument à finaliser mon tri par macro) mais ça me fera une petite piqure de rappel : Je ne pense jamais assez aux listes personnalisées.
Merci.
A+
Bonjour @bof ,

Par macro, on peut le faire comme cela :
VB:
Sub Tri()
Dim DL As Long, Plage As Range
    ' PS le critere trie est a mettre dans le code a CustomOrder => CustomOrder:="E,P,M,X,G"
    ' Il faut bien cibler la feuille et la plage dans le code
    With Sheets(1)
        DL = .Columns("A:C").Find("*", SearchOrder:=xlByRows, searchdirection:=xlPrevious).Row  'Derniere ligne de la colonne A:C
        Set Plage = .Range("A2:C" & DL)
        Application.ScreenUpdating = False
        With .Sort
            .SortFields.Clear
            .SortFields.Add Key:=Plage.Columns.Item(2), SortOn:=xlSortOnValues, Order:=xlAscending, CustomOrder:="E,P,M,X,G", DataOption:=xlSortNormal ' Tri sur la 2eme colonne de la plage
            .SortFields.Add Key:=Plage.Columns.Item(3), Order:=xlAscending, DataOption:=xlSortNormal  ' Tri sur la 3eme colonne de la plage
            .SetRange Plage: .Header = xlYes: .MatchCase = False: .Orientation = xlTopToBottom: .SortMethod = xlPinYin: .Apply
        End With
    End With
        Application.ScreenUpdating = True
        Set Plage = Nothing
End Sub


' code pour le test afin de remettre la donnée rapidement
Sub RecoverData()
    VA = Feuil2.Cells(1).CurrentRegion.Value
    Feuil1.Cells(1).Resize(UBound(VA), UBound(VA, 2)).Value = VA
End Sub
 

Pièces jointes

  • INDEX-2.xlsm
    23.4 KB · Affichages: 3

RyuAutodidacte

XLDnaute Impliqué
Re une petite variante permettant de modifier ses paramètres de tri en évitant d'aller dans le cœur du code (cela évite de faire une erreur) :
VB:
Sub Tri()
Dim DL As Long, Plage As Range

    ' La variable "ParamTri" "E,P,M,X,G" pour mettre les criteres de Tri si ils viennent à changer
    ParamTri = "E,P,M,X,G"
  
    ' Il faut bien cibler la feuille et la plage dans le code
    With Sheets(1)
        DL = .Columns("A:C").Find("*", SearchOrder:=xlByRows, searchdirection:=xlPrevious).Row  'Derniere ligne de la colonne A:C
        Set Plage = .Range("A2:C" & DL)
        Application.ScreenUpdating = False
        With .Sort
            .SortFields.Clear
            .SortFields.Add Key:=Plage.Columns.Item(2), SortOn:=xlSortOnValues, Order:=xlAscending, CustomOrder:=CVar(ParamTri), DataOption:=xlSortNormal ' Tri sur la 2eme colonne de la plage
            .SortFields.Add Key:=Plage.Columns.Item(3), Order:=xlAscending, DataOption:=xlSortNormal  ' Tri sur la 3eme colonne de la plage
            .SetRange Plage: .Header = xlYes: .MatchCase = False: .Orientation = xlTopToBottom: .SortMethod = xlPinYin: .Apply
        End With
    End With
        Application.ScreenUpdating = True
        Set Plage = Nothing
End Sub

Il est possible d'inverser ces 2 lignes selon le résultat voulu :
VB:
            .SortFields.Add Key:=Plage.Columns.Item(3), Order:=xlAscending, DataOption:=xlSortNormal  ' Tri sur la 3eme colonne de la plage
            .SortFields.Add Key:=Plage.Columns.Item(2), SortOn:=xlSortOnValues, Order:=xlAscending, CustomOrder:=CVar(ParamTri), DataOption:=xlSortNormal ' Tri sur la 2eme colonne de la plage
 
Dernière édition:

Discussions similaires

Statistiques des forums

Discussions
314 653
Messages
2 111 586
Membres
111 208
dernier inscrit
estalavista