[VBA] Classer dans un ordre prédéfinit puis de A à Z

Bonsoir,

J'ai une colonne "J" dans laquelle sont indiqués des niveaux d'importance (Très fort, Fort, Modéré, Faible, Très faible) et une colonne D dans laquelle sont indiqué des surfaces.

Actuellement, je sais comment classer les surfaces de la plus grande à la plus petite et pour les niveaux d'importance, je leur donne une correspondance de 1 à 5 ; ainsi, je peux demander à ce que les données soient classées selon l'une ou l'autre colonne.

Ce que j'aimerais pouvoir faire c'est :

- peaufiner le tri des niveaux d'importance sans leur attribuer de numéro.

Il faudrait pour cela que les cellules de la colonnes J se classe automatiquement comme suit :

Très fort

Fort

Modéré

Faible

Très faible

- puis qu'un second tri classe les surfaces de la plus grande à la plus petite.

Ce qui donnerait quelque chose du genre.

Très fort

77,85

12

0,001

Fort

11,1

0,4

Modéré

24,87

21

Faible

19,2

17,8

Très faible

12,5

7,8

5,6

Ce qui me pose le plus de problème c'est le double tri finalement...

Je ne pensais pas mettre de document, mais finalement j'en ajoute un en pièce jointe au cas où.

Bonne soirée !

A plus tard.

11double-tri.xlsx (8.65 Ko)

Bonjour,

Crées une liste personnalisée (options avancées Excel).

snip 20181223182921

Ensuite quand tu fais ton tri, fais appel à cette liste pour l'ordre.

Cdlt.

14double-tri.xlsx (28.84 Ko)

Bonjour,

Merci pour la réponse. Je peux effectivement les classer dans l'ordre souhaité, mais je n'arrive pas à faire fonctionner ça en VBA.

Pour le moment j'ai ceci :

'Application.DeleteCustomList ListNum:=5
    Application.AddCustomList ListArray:=Array("Très fort", "Fort", "Modéré", _
        "Faible", "Très faible", "Nul")
    Worksheets("VNEI (EI)").Sort.SortFields.Clear

    Range("A2:J110").Sort.SortFields.Add Key:=Range( _
        "J3:J110"), SortOn:=xlSortOnValues, Order:=xlAscending, CustomOrder:= _
        "Très fort,Fort,Modéré,Faible,Très faible,Nul", DataOption:=xlSortNormal
    Range("A2:J110").Sort.SortFields.Add Key:=Range( _
        "D3:D110"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:= _
        xlSortNormal

       ' With Range("A2:J110").Sort
         '   .SetRange Range("A2:J44")
        '    .Header = xlYes
         '   .MatchCase = False
        '    .Orientation = xlTopToBottom
         '   .SortMethod = xlPinYin
       ' End With

Issu de ce que j'ai trouvé sur internet et des enregistrement de macro.

Ça ne donne pas ce que je veux pour le moment.

Bonne journée !

Bonjour,

Pour l'ordre de tri, tu dois utiliser :

CustomOrder:=Application.CustomListCount

A adapter !... (il faut peut-être ajouté +1)

Cdlt.

J'ai fait quelques tests, peu concluants pour le moment. Je vais essayer de comprendre.

Bonjour,

Ce n'est qu'en essayant continuellement que l'on finit par réussir....

En d'autres termes... Plus ça rate et plus on a de chances que ça marche...

simple

Bonnes fêtes de fin d'année.

Cdlt.

Bonsoir,

J'ai beau essayer de multiples façons de faire ce double tri, ça ne veut pas fonctionner.

Le tri n°1 et le tri n°2 fonctionnent séparément ; mais ils ne fonctionnent pas ensemble...

Par ailleurs, le tri n°2 se fait sur des surfaces.

Ces mêmes surfaces sont obtenues à travers l'application d'une formule (car je ne sais pas le faire en VBA)

Range("D3:D110").FormulaR1C1 = _ "=IF(SUMIF(CSV!R[-1]C[30]:R[107]C[30],'VNEI (EI)'!RC[-2],CSV!R[-1]C[41]:R[107]C[41])=0,"""",SUMIF(CSV!R[-1]C[30]:R[107]C[30],'VNEI (EI)'!RC[-2],CSV!R[-1]C[41]:R[107]C[41]))"

Il s'agit simplement de la formule "SOMME.SI, "codée" en VBA. (Pour quelqu'un qui sait utiliser VBA, c'est certainement effroyable).

Je recherche donc le contenu de la cellule "B3" dans la plage de données AH2:AH110 d'une autre feuille (1), à chaque fois que le contenu est répété dans cette plage, j'additionne les surfaces correspondantes dans la plage AS2:AS110.

(Le mieux serait "la dernière ligne utilisée, mais je pense que les BDD utilisées n’excéderont jamais 110 lignes).

J'ai donc des sommes de surfaces que je souhaite classer.

Le classement ne se fait pas bien lorsque je demande "du plus petit au plus grand", les données se retrouvent dans le désordre...

Voici le code que j'utilise pour faire le double tri:

Application.AddCustomList ListArray:=Array("Très fort", "Fort", "Modéré", "Faible", "Très faible", "Nul", "")
    CustomOrder1 = Application.CustomListCount
        With Table
            Range(Cells(3, 1), Cells(110, 10)).Sort Key1:=Cells(3, 10), Key2:=Cells(3, 4), Order1:=CustomOrder1, Order2:=xlDescending, DataOption1:=xlSortNormal, DataOption2:=xlSortNormal, _
            Header:=xlYes, Orientation:=xlTopToBottom, MatchCase:=False
        End With

Bonne soirée !

Bonjour,

Une proposition.

ALT F8, exécuter la procédure Sort_Table.

Cdlt.

13double-tri.xlsm (22.33 Ko)
Option Explicit

Public Sub Sort_Table()
Dim lo As ListObject, n As Long

    Set lo = ActiveSheet.ListObjects(1)

    With Application
        .AddCustomList ListArray:=Array("Très fort", "Fort", "Modéré", "Faible", "Très faible", "Nul")
        .ScreenUpdating = False
    End With

    With lo
        .Sort.SortFields.Add _
                Key:=.ListColumns(10).DataBodyRange, _
                SortOn:=xlSortOnValues, _
                Order:=xlAscending, _
                CustomOrder:=Application.CustomListCount
        .Sort.SortFields.Add _
                Key:=.ListColumns(4).DataBodyRange, _
                SortOn:=xlSortOnValues, _
                Order:=xlAscending
        .Sort.Apply
        .Sort.SortFields.Clear
    End With

    With Application
        n = .GetCustomListNum(Array("Très fort", "Fort", "Modéré", "Faible", "Très faible", "Nul"))
        .DeleteCustomList n
    End With

End Sub

Bonsoir,

Ça fonctionne sur votre exemple, mais je n'arrive, pour le moment, pas à le faire fonctionner dans mon document test.

Il m'apparaît : "L'indice n'appartient pas à la sélection".

Set lo = ActiveSheet.ListObjects(1)

J'ai remplacé ActiveSheet par ma feuille de travail pour tester.

Set lo = Sheets("Test").ListObjects(1)

Sans succès.

Re,

J'ai bien mis une alerte dans le fichier pour préciser que les données étaient sous de tableau (structuré).

La procédure considère de plus, qu'il n'y a qu'un tableau dans la feuille.

Cdlt.

Bonsoir,

Finalement, le classement fonctionnait, mais le problème venait du fait que les cellules classées contenaient des formules. Je ne sais pas vraiment pourquoi ça pose problème... quoi qu'il en soit, il m'a suffit de les transformer en valeur pour que ça fonctionne.

J'ai procédé ainsi :

Range("D3:J110").Value = Range("D3:J110").Value

Et ensuite j'ai classé comme ça :

Application.AddCustomList ListArray:=Array("Très fort", "Fort", "Modéré", "Faible", "Très faible", "Nul", " ")
    CustomOrder1 = Application.CustomListCount
    Range("A2:K110").Sort _
    Key1:=Range("J3:J110"), OrderCustom:=CustomOrder1, _
    Key2:=Range("D3:D110"), Order2:=xlDescending, _
    Header:=xlYes, Orientation:=xlTopToBottom

Merci pour votre aide !

Bonne soirée !

Rechercher des sujets similaires à "vba classer ordre predefinit puis"