Microsoft 365 Tri de données automatique par formules ou en VBA

luke3300

XLDnaute Impliqué
Bonsoir le forum, j'ai une grille de données que je souhaite visualiser suivant des priorités.
Dans mon fichier d'exemple, la grille de données se trouve en feuil2.
J'aimerais que les données se reportent automatiquement en ordre décroissant dans l'une des 3 grilles de la feuil3 et ce, suivant l'importance de leur DPS (>40, >20 et <=40 et <=20).
Le but est que chaque ID soit dans une des grilles suivant l'importance de son DPS.

Dans le fichier, j'ai mis les 3 premiers de chaque catégorie en exemple ...

Merci d'avance pour toute l'aide que vous pourrez m'apporter et belle soirée.
 

Pièces jointes

  • Class.xlsx
    65.2 KB · Affichages: 18

luke3300

XLDnaute Impliqué
Bonsoir Sylvanu,

Merci de te pencher sur ma recherche :D
Je viens de regarder et le résultat est partiel dans la mesure ou les données sont bien listées dans chaque catégorie mais elles ne sont pas triées par ordre décroissant (importance du DPS).
Possible?
Belle soirée ;)
 

luke3300

XLDnaute Impliqué
Bonjour Sylvanu, le forum,

Merci pour ton aide Sylvanu :D

En effet, le résultat est là mais je reste étonné sur le temps mis par la macro pour arriver au résultat ... ici 4'06'' :oops: c'est très long. Est-ce pareil chez toi?
J'aimerais aussi savoir si c'est possible d'arriver au résultat via des formules. L'avantage de celles-ci il me semble c'est qu'il ne faut pas attendre ... qu'en pensez-vous?
Belle journée à tous.
 

sylvanu

XLDnaute Barbatruc
Supporter XLD
Bonjour,
Ca m'étonne. C'est avec le même fichier ?
Car moi j'obtiens :
2.jpg

et ça me semblait raisonnable.
Essayez cette PJ, j'ai inhibé tout élément perturbateur ( screen, events, calculs ... ) pendant la macro.
Par formule cela va être complexe, surtout avec le tri et les séparation par valeurs.
 

Pièces jointes

  • Luke(V3).xlsm
    84.6 KB · Affichages: 1
Dernière édition:

chris

XLDnaute Barbatruc
Bonjour à tous

Puisque tu as 365 et donc PowerQuery intégré, une solution PowerQuery

Mise à jour par Données, Actualiser Tout (ou une ligne de code à l'activation de la feuille...)
 

Pièces jointes

  • Class_PQ.xlsx
    77.2 KB · Affichages: 4

luke3300

XLDnaute Impliqué
Bonjour Sylvanu, Chris, le forum,

Je viens de contrôler et la longueur de temps est de ma faute, j'avais un autre fichier Excel de 70 Mo ouvert en même temps. Ici, ça marche nickel.

J'ai cependant encore un bémol ... j'ai adapté ton code pour le placer dans mon fichier de travail mais le débogueur m'indique une erreur à cet endroit:

2020-04-16_13-01-08.png


Et voici le code complet adapté:

VB:
Sub Tri()
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
Application.EnableEvents = False
ActiveSheet.DisplayPageBreaks = False
T0 = Timer
DerLig = Application.WorksheetFunction.CountA(Sheets("Management Report").Range("B200:B600"))
tablo = Sheets("Management Report").Range("B200:C" & DerLig)
Sheets("Drivers").Range("A5:H1000").ClearContents
I40 = 5: I30 = 5: I20 = 5
For i = 2 To DerLig
    DPS = tablo(i, 2)
    If DPS > 40 Then
        Sheets("Drivers").Range("B" & I40) = DPS
        Sheets("Drivers").Range("A" & I40) = tablo(i, 1)
        I40 = I40 + 1
    ElseIf DPS <= 40 And DPS > 20 Then
        Sheets("Drivers").Range("E" & I30) = DPS
        Sheets("Drivers").Range("D" & I30) = tablo(i, 1)
        I30 = I30 + 1
    ElseIf DPS <= 20 Then
        Sheets("Drivers").Range("H" & I20) = DPS
        Sheets("Drivers").Range("G" & I20) = tablo(i, 1)
        I20 = I20 + 1
    End If
Next i
PlusGrand
[A1].Select
MsgBox ("Temps : " & Timer - T0 & "s.")
Application.Calculation = xlCalculationAutomatic
Application.EnableEvents = True
ActiveSheet.DisplayPageBreaks = True
End Sub
Sub PlusGrand()
    Range("A4:B600").Select
    ActiveWorkbook.Worksheets("Drivers").Sort.SortFields.Clear
    ActiveWorkbook.Worksheets("Drivers").Sort.SortFields.Add Key:=Range("B5:B27") _
        , SortOn:=xlSortOnValues, Order:=xlDescending, DataOption:=xlSortNormal
    With ActiveWorkbook.Worksheets("Drivers").Sort
        .SetRange Range("A4:B600")
        .Header = xlYes
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
    End With
    Range("D4:E600").Select
    ActiveWorkbook.Worksheets("Drivers").Sort.SortFields.Clear
    ActiveWorkbook.Worksheets("Drivers").Sort.SortFields.Add Key:=Range("E5:E23") _
        , SortOn:=xlSortOnValues, Order:=xlDescending, DataOption:=xlSortNormal
    With ActiveWorkbook.Worksheets("Drivers").Sort
        .SetRange Range("D4:E600")
        .Header = xlYes
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
    End With
    Range("G4:H600").Select
    ActiveWorkbook.Worksheets("Drivers").Sort.SortFields.Clear
    ActiveWorkbook.Worksheets("Drivers").Sort.SortFields.Add Key:=Range("H5:H28") _
        , SortOn:=xlSortOnValues, Order:=xlDescending, DataOption:=xlSortNormal
    With ActiveWorkbook.Worksheets("Drivers").Sort
        .SetRange Range("G4:H600")
        .Header = xlYes
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
    End With
End Sub

Pour ce qui est des différences entre le fichier test et mon bon fichier, au niveau de l'emplacement des données à traiter (Feuil1 du fichier test) sont en réalité dans la feuille MR de mon bon fichier. De la cellule B200 à C600 ... voici comment se présente la feuille prenant la place de la Feuil3 du fichier test:
2020-04-16_13-18-55.png


Qu'est-ce que j'ai mal fait?

Merci encore pour votre aide
 

sylvanu

XLDnaute Barbatruc
Supporter XLD
Luke,
Dans le premier fichier les datas commençaient en 1.
Donc l'indice de fin du tablo correspondait à DerLig. Donc ça marchait.

Là votre liste commence en 200, donc par exemple DerLig vaut 400 qui est le dernier indice de la liste.
Mais tablo commence toujours en 0 et va à 200 et non 400 d'où l'erreur.

Faites le remplacement ci dessous
VB:
T0 = Timer
DerLig = Application.WorksheetFunction.CountA(Sheets("Management Report").Range("B200:B600"))
tablo = Sheets("Management Report").Range("B200:C" & DerLig)
DerLigTablo = UBound(tablo)
Sheets("Drivers").Range("A5:H1000").ClearContents
I40 = 5: I30 = 5: I20 = 5
For i = 2 To DerLigTablo
......
Le for next va de 2 à la fin de tablo et non à l'indice de fin de la liste.

Bonjour Chris.
 

Discussions similaires

Statistiques des forums

Discussions
312 159
Messages
2 085 836
Membres
102 998
dernier inscrit
billABDELL