OVH Cloud OVH Cloud

Filtrer sans doublons avec la plus grande valeur

28 réponses
Avatar
Apitos
Bonsoir =E0 tous,

Comment pourrais-je avoir un filtre sans doublons avec la valeur la plus gr=
ande de chaque ligne r=E9sultante ?

Merci.

http://cjoint.com/?BEya4AID2D1

10 réponses

1 2 3
Avatar
MichD
Tu veux bien prendre le temps d'expliquer ce que tu veux?
Avatar
Apitos
Salut Denis,

Voila plus d'explication.

http://cjoint.com/?BEEaIZaHA4c
Avatar
MichD
Voici la macro :

'---------------------------------------------------------
Sub test()
Dim Sh As Worksheet, DerLig As Long, LastRow As Long

Set Sh = Worksheets("Feuil1") 'Nom Feuille à adapter

Application.ScreenUpdating = False
With Sh
With .Range("A1:A" & .Range("A65536").End(xlUp).Row)
.AdvancedFilter Action:=xlFilterCopy, _
Copytorange:=Sh.Range("J1"), _
Unique:=True
LastRow = .Range("A65536").End(xlUp).Row
DerLig = .Range("J65536").End(xlUp).Row
End With
'Tri le résultat du filtre par ordre croissant.
With .Range("J1:J" & DerLig)
.Sort Key1:=.Item(1, 1), Order1:=xlAscending, Header:=xlYes
End With

'Homogéniser la couleur de ligne d'en-tête de la plage résultat du filtre
.Range("K1:M1").Interior.Color = .Range("J1").Interior.Color

'Enlève les bordures de la plage résultat du filtre
For a = 5 To 12
.Range("J2:J" & LastRow).Borders(a).LineStyle = xlNone
Next
'Remplir les étiquettes de colonnes -> résultat du filtre
.Range("K1") = .Range("B1")
.Range("L1") = .Range("F1")
.Range("M1") = .Range("G1")

'Center horizontalement les valeurs de la ligne d'en-tête
.Range("J1:M1").HorizontalAlignment = xlCenter

'Extraction des valeurs pour les 3 autres colonnes
.Range("K2").FormulaArray = "=MAX(IF($A$2:$A$" & LastRow & _
"=J2,$B$2:$B$" & LastRow & "))"
.Range("K2:K" & DerLig).FillDown
.Range("K2:K" & DerLig).Value = .Range("K2:K" & DerLig).Value

.Range("L2").FormulaArray = "=MAX(IF($A$2:$A$" & LastRow & _
"=J2,$F$2:$F$" & LastRow & "))"
.Range("L2:L" & DerLig).FillDown
.Range("L2:L" & DerLig).Value = .Range("L2:L" & DerLig).Value


.Range("M2").FormulaArray = "=MAX(IF($A$2:$A$" & LastRow & _
"=J2,$G$2:$G$" & LastRow & "))"
.Range("M2:M" & DerLig).FillDown
.Range("M2:M" & DerLig).Value = .Range("M2:M" & DerLig).Value

'Application du format %
.Range("L2:M" & DerLig).NumberFormat = "0%"
End With
Application.ScreenUpdating = True
End Sub
'---------------------------------------------------------
Avatar
Apitos
Bonsoir Denis,

Ca ne marche pas à tous les coups.

Normalement pour les valeurs de :

- QS‰% et QT0%, NCS sera égal à 19 et non pas 217

- QSX% et Qt”%, NCS sera égal à 311 et non pas 450
Avatar
MichD
Je ne comprends pas la donne du problème

D'abord, j'extrais une seule occurrence des objets dans un nouveau tableau.

Et pour le NCS, QS et Qt, j'extrais la plus grande valeur pour chacun des objets.
L'extraction des 3 champs se fait indépendante sans corrélation entre eux.

Si ce n'est pas ça que tu veux, il est évident que le résultat n'est pas bon.

À toi d'expliquer ton besoin.




- QSX% et Qt”%, NCS sera égal à 311 et non pas 450
Avatar
Apitos
Bonsoir Denis,

D'abord, j'extrais une seule occurrence des objets dans un nouveau tableau .


OK

Et pour le NCS, QS et Qt, j'extrais la plus grande valeur pour chacun des objets.



Non, il faut extraire la plus grande valeur de QS et QT seulement.

L'extraction des 3 champs se fait indépendante sans corrélation entre eux.



Non, les valeurs de NCS pour lesquels on devra extraire la plus grande vale ur, sont dépendantes des grandes valeurs de QS et QT pour chaque objet.

Chaque grande valeur marquée par la couleur rose pour les QS, et la coule ur bleu pour les QT corresponde à une valeur de NCS dans la même ligne.

Le choix se fera pour la plus grande valeur de NCS marquée par la couleur marron, parmi une, deux, trois ou plus de lignes.

Dans le fichier joint, pour explication, jÂ’ai ajouté dans la colonne N (NCS corrigée) les valeurs exactes de NCS (Cellules en marron dans la col onne B) qui devront se retrouver dans la colonne K.

http://cjoint.com/?BEFiBayJnYR
Avatar
MichD
Ton fichier retour : http://cjoint.com/?BEFqeGvcjvh

La procédure dans le module de la feuil1


Sub test()
Dim Sh As Worksheet, DerLig As Long, LastRow As Long

Set Sh = Worksheets("Feuil1") 'Nom Feuille à adapter

Application.ScreenUpdating = False
With Sh
With .Range("A1:A" & .Range("A65536").End(xlUp).Row)
.AdvancedFilter Action:=xlFilterCopy, _
Copytorange:=Sh.Range("J1"), _
Unique:=True
LastRow = .Range("A65536").End(xlUp).Row
DerLig = .Range("J65536").End(xlUp).Row
End With
'Tri le résultat du filtre par ordre croissant.
With .Range("J1:J" & DerLig)
.Sort Key1:=.Item(1, 1), Order1:=xlAscending, Header:=xlYes
End With

'Homogéniser la couleur de ligne d'en-tête de la plage résultat du filtre
.Range("K1:M1").Interior.Color = .Range("J1").Interior.Color

'Enlève les bordures de la plage résultat du filtre
For a = 5 To 12
.Range("J2:J" & LastRow).Borders(a).LineStyle = xlNone
Next
'Remplir les étiquettes de colonnes -> résultat du filtre
.Range("K1") = .Range("B1")
.Range("L1") = .Range("F1")
.Range("M1") = .Range("G1")

'Center horizontalement les valeurs de la ligne d'en-tête
.Range("J1:M1").HorizontalAlignment = xlCenter

.Range("L2").FormulaArray = "=MAX(IF($A$2:$A$" & LastRow & _
"=J2,$F$2:$F$" & LastRow & "))"
.Range("L2:L" & DerLig).FillDown
.Range("L2:L" & DerLig).Value = .Range("L2:L" & DerLig).Value


.Range("M2").FormulaArray = "=MAX(IF($A$2:$A$" & LastRow & _
"=J2,$G$2:$G$" & LastRow & "))"
.Range("M2:M" & DerLig).FillDown
.Range("M2:M" & DerLig).Value = .Range("M2:M" & DerLig).Value

'Extraction des valeurs pour les 3 autres colonnes
.Range("K2").FormulaArray = "=MAX(INDEX($B$2:$B$" & LastRow & ",SUM(($F$2:$F$" &
LastRow & _
"=(MAX(IF($A$2:$A$" & LastRow & "=J2,$F$2:$F$" & LastRow & _
"))))*ROW($A$2:$A$" & LastRow & "))-1),INDEX($B$2:$B$" & _
LastRow & ",SUM(($G$2:$G$" & LastRow & "=(MAX(IF($A$2:$A$" & _
LastRow & "=J2,$G$2:$G$" & LastRow & "))))*ROW($A$2:$A$" & LastRow &
"))-1))"
.Range("K2:K" & DerLig).FillDown
.Range("K2:K" & DerLig).Value = .Range("K2:K" & DerLig).Value

'Application du format %
.Range("L2:M" & DerLig).NumberFormat = "0%"
End With
Application.ScreenUpdating = True
End Sub
Avatar
Apitos
Bonsoir Denis,

Pourquoi en essayant la macro sur cet exemple ça me donne des #REF! Dans quelques valeurs NCS dans la colonne K ?


http://cjoint.com/?BEFsNrh3RXp
Avatar
MichD
| Pourquoi en essayant la macro sur cet exemple ça me donne des #REF!

Dans la colonne F ou G, pour un même objet, il y a plus d'une valeur maximale.

Exemple pour l'objet : KVRWA, dans la colonne G, tu as 3 valeurs maximales qui sont égales
: 100 . La formule a été conçue pour seulement une valeur maximale par objet. Dans le cas
qui nous occupe, laquelle de ces 3 valeurs combinées avec la valeur maximale de la colonne
F, doit-elle retenue? À ce que je sache, cette condition n'a jamais été définie. Remarque,
il pourrait aussi y avoir des situations ou tu as un doublon et dans la colonne F et G
pour un même objet. Pas facile de déterminer la valeur en B qui doit être conservé.



"Apitos" a écrit dans le message de groupe de discussion :


Bonsoir Denis,

Pourquoi en essayant la macro sur cet exemple ça me donne des #REF! Dans quelques valeurs
NCS dans la colonne K ?


http://cjoint.com/?BEFsNrh3RXp
Avatar
Apitos
Bonjour Denis,

Dans la colonne F ou G, pour un m�me objet, il y a plus d'une val eur maximale.

Exemple pour l'objet : KVRWA, dans la colonne G, tu as 3 valeurs maximale s qui sont �gales
: 100 . La formule a �t� con�ue pour seulement u ne valeur maximale par objet. Dans le cas
qui nous occupe, laquelle de ces 3 valeurs combin�es avec la vale ur maximale de la colonne
F, doit-elle retenue? � ce que je sache, cette condition n'a jama is �t� d�finie. Remarque,
il pourrait aussi y avoir des situations ou tu as un doublon et dans la c olonne F et G
pour un m�me objet. Pas facile de d�terminer la valeur en B qui doit �tre conserv�.




Pour tout cela, on devra collecter toutes les valeurs correspondantes dans la colonne B, ensuite on a quÂ’appliquer le MAX des ces valeurs de NCS de la colonne B

Dans le cas que tu évoques, on a trois valeurs max dans la colonne G, qui correspondent à 3 valeurs de NCS dans la colonne B = (96,93 et 73)

96 90 89 53 55,21% 100,00%
88 78 78 29 32,95% 99,57%
93 85 83 41 44,09% 100,00%
73 60 60 35 47,95% 100,00%

et une valeur max dans la colonne F qui correspond à une valeur de NCS da ns la colonne B = (96).

Alors le max dans la colonne B se calculera entre les valeurs de NCS (96,93 et 91), et on aura NCS qui sera égal à 96.

Voila !

Alors peut-on trouver une solution de cette analyse ?
1 2 3