Excel - Filtrer sans doublons avec la plus grande valeur

Asked By Apitos on 23-May-12 07:43 PM
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


MichD replied to Apitos on 24-May-12 07:35 AM
Bonjour,

La mani?re la plus simple,

En supposant que A2:G2 repr?sente l'?tendue des colonnes,

Tu ajoutes une colonne dans laquelle tu mets la formule :  =Max(A2:G2) que tu recopies sur
l'ensemble des lignes
et tu ex?cutes un filtre avanc? (?labor?) sur la colonne affichant les formules et
n'oubliant pas de cocher la case
? cocher "sans doublon".
Apitos replied to MichD on 24-May-12 11:30 AM
Bonjour Denis,

Le max des valeurs doit =EAtre trouv=E9 dans la colonne F et dans G pour un=
m=EAme objet.
MichD replied to Apitos on 24-May-12 11:36 AM
Si tu prenais le temps d'expliquer?  Est-ce que le max() doit se faire sur chaque ligne ou
sur chaque colonne ?

Comment d?finis-tu la notion de doublon dans ton application?

Si tu n'es pas explicite dans les commentaires que tu commets sur ta probl?matique,
il est difficile pour les r?pondeurs de lire dans tes pens?es.
Apitos replied to MichD on 24-May-12 11:49 AM
Une petite illustration :

http://cjoint.com/?BEyrWA1tNi1
Apitos replied to MichD on 24-May-12 11:49 AM
Une petite illustration :

http://cjoint.com/?BEyrWA1tNi1
MichD replied to Apitos on 24-May-12 01:26 PM
2 ?tapes :

A ) Tu fais un filtre avanc? sur la colonne A:A en cochant la case ? cocher sans doublon.
Le r?sultat du filtre va donner pour chaque nomenclature de la colonne A:A une
occurrence de chaque item.

B ) Pour obtenir le max() dans chacune des colonnes B et C dans le nouveau tableau,
fais appel ? des formules pour compl?ter le tableau.

R?sultat du filtre ?labor? : Supposons que la copie du r?sultat se fait dans la
colonne G1:G6 avec en-t?te de colonne en G1

G                          H
i
Object                    C
T
BOA        =MAX(SI($A$2:$A$8=G2;$B$2:$B$8))      =MAX(SI($A$2:$A$8=G2;$C$2:$C$8))
BOD
DHA
DHD
FA

Tu recopies les formules sur leur colonne respective.

Les 2 formules sont matricielles, elles requi?rent comme validation : Ctrl + Maj + Enter
Apitos replied to MichD on 26-May-12 07:13 PM
Bonsoir Denis,

Pourrais-je avoir cette solution avec du code VBA ?

Merci.
MichD replied to Apitos on 28-May-12 07:18 AM
Exemple dans ton fichier :  http://cjoint.com/?BECnrcT83Ph

Le code contenu dans le fichier :

'------------------------------------------------
Sub test()
Dim Sh As Worksheet, DerLig As Long
Set Sh = Worksheets("Feuil2")

Application.ScreenUpdating = False
With Sh
With .Range("A1:A" & .Range("A65536").End(xlUp).Row)
.AdvancedFilter Action:=xlFilterCopy, _
Copytorange:=Sh.Range("G1"), _
Unique:=True
DerLig = .Range("G65536").End(xlUp).Row
End With
With .Range("G1:G" & .Range("G65536").End(xlUp).Row)
.Sort Key1:=.Item(1, 1), Order1:=xlAscending, Header:=xlYes
End With
.Range("H1") = .Range("B1")
.Range("i1") = .Range("C1")
.Range("H1:i1").HorizontalAlignment = xlCenter
.Range("H2").FormulaArray = "=MAX(IF($A$2:$A$8=G2,$B$2:$B$8))"
.Range("H2:H" & DerLig).FillDown
'Pour faire dispara?tre les formules pour
'obtenir seulement les valeurs si n?cessaire
'.Range("H2:H" & DerLig).Value = .Range("H2:H" & DerLig).Value

.Range("i2").FormulaArray = "=MAX(IF($A$2:$A$8=G2,$C$2:$C$8))"
.Range("i2:i" & DerLig).FillDown
'Pour faire dispara?tre les formules pour
'obtenir seulement les valeurs si n?cessaire
'.Range("i2:i" & DerLig).Value = .Range("i2:i" & DerLig).Value

'Application du format %
.Range("H2:I" & DerLig).NumberFormat = "0%"
End With
Application.ScreenUpdating = True
End Sub
'------------------------------------------------
Apitos replied to MichD on 28-May-12 01:08 PM
Bonsoir Denis,

Merci pour le fichier.

Je vais en faire d'autres essaies et voir les r=E9sultats.
Apitos replied to Apitos on 29-May-12 12:48 PM
Bonsoir Denis,

Voila un autre essai en utilisant les tableaux, en plus d'une colonne B qu'=
on devra trouver sa valeur la plus grande en d=E9pendant des valeurs de la =
colonne D et E.

http://cjoint.com/?BEDsT2NrjzN
MichD replied to Apitos on 29-May-12 01:27 PM
Tu veux bien prendre le temps d'expliquer ce que tu veux?
Apitos replied to MichD on 29-May-12 06:35 PM
Salut Denis,

Voila plus d'explication.

http://cjoint.com/?BEEaIZaHA4c
MichD replied to Apitos on 29-May-12 07:46 PM
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 & _
.Range("K2:K" & DerLig).FillDown
.Range("K2:K" & DerLig).Value = .Range("K2:K" & DerLig).Value

.Range("L2").FormulaArray = "=MAX(IF($A$2:$A$" & 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 & _
.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
'---------------------------------------------------------
Apitos replied to MichD on 30-May-12 11:41 AM
Bonsoir Denis,

Ca ne marche pas =E0 tous les coups.

Normalement pour les valeurs de :

- QS=3D89% et QT=3D100%, NCS sera =E9gal =E0 19 et non pas 217

- QS=3D58% et Qt=3D94%, NCS sera =E9gal =E0 311 et non pas 450
MichD replied to Apitos on 30-May-12 01:23 PM
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.




- QS=58% et Qt=94%, NCS sera ?gal ? 311 et non pas 450
Apitos replied to MichD on 31-May-12 02:28 AM
Bonsoir Denis,

.=20
OK

objets.=20

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

eux.

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

Chaque grande valeur marqu=E9e par la couleur rose pour les QS, et la coule=
ur bleu pour les QT corresponde =E0 une valeur de NCS dans la m=EAme ligne.

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

Dans le fichier joint, pour explication, j=92ai ajout=E9 dans la colonne N =
(NCS corrig=E9e) 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
MichD replied to Apitos on 31-May-12 10:05 AM
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 & _
.Range("L2:L" & DerLig).FillDown
.Range("L2:L" & DerLig).Value = .Range("L2:L" & DerLig).Value


.Range("M2").FormulaArray = "=MAX(IF($A$2:$A$" & 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 & _
LastRow & ",SUM(($G$2:$G$" & LastRow & "=(MAX(IF($A$2:$A$" & _
LastRow & "=J2,$G$2:$G$" & LastRow & "))))*ROW($A$2:$A$" & LastRow &
.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
Apitos replied to MichD on 31-May-12 12:42 PM
Bonsoir Denis,

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


http://cjoint.com/?BEFsNrh3RXp
MichD replied to Apitos on 31-May-12 01:58 PM
| 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
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?.



b5b4ce6e-39e2-4fd4-a92e-7d46673b41d9@googlegroups.com...

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
Apitos replied to MichD on 01-Jun-12 05:07 AM
Bonjour Denis,

eur maximale.
s qui sont =EF=BF=BDgales=20
ne valeur maximale par objet. Dans le cas=20
ur maximale de la colonne=20
is =EF=BF=BDt=EF=BF=BD d=EF=BF=BDfinie. Remarque,=20
olonne F et G=20
B qui doit =EF=BF=BDtre conserv=EF=BF=BD.

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

Dans le cas que tu =E9voques, on a trois valeurs max dans la colonne G, qui=
correspondent =E0 3 valeurs de NCS dans la colonne B =3D (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 =E0 une valeur de NCS da=
ns la colonne B =3D (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 =E9gal =E0 96.

Voila !

Alors peut-on trouver une solution de cette analyse ?
MichD replied to Apitos on 01-Jun-12 08:23 AM
Je regarde cela durant le Week-End!
Apitos replied to MichD on 03-Jun-12 05:12 PM
Bonsoir Denis,

Voila un code avec des formules qui marche.

Mais reste =E0 les traduire en code VBA.

http://cjoint.com/?BFdxlkXk4sH
MichD replied to Apitos on 03-Jun-12 09:08 PM
D?sol? du d?lai!

Retour de ton fichier avec le code dans le module de la feuille :

http://cjoint.com/?BFedhMtWMFh
Apitos replied to MichD on 04-Jun-12 06:58 AM
Bonjour Denis,

En ajoutant des donn=E9es =E0 la fin du tableau de base, et on d=E9finissan=
t =E0 nouveau les plages par DECALER et NBVAL, j'ai des erreur dans le r=E9=
sultat obtenu.

http://cjoint.com/?BFem3jpF6rz
MichD replied to Apitos on 04-Jun-12 08:54 AM
Essaie comme ceci :  http://cjoint.com/?BFeoZOXCbeH

Les plages nomm?es sont mises ? jour d?s que tu modifies
une donn?e dans les colonnes A:F de la feuil2.
Apitos replied to MichD on 04-Jun-12 09:43 AM
Re,

Pourquoi il y a un probl=E8me ici :

JCW0D	0				=09
JCW0D	0				=09
JCW0D	1	1	1	1	100,00%	100,00%
JCW0D	2	2	2	2	100,00%	100,00%

=C7a devra donn=E9 :

Objet	NCS	QS	QT
JCW0D	2	100,00%	100,00%

et non pas :

Objet	NCS	QS	QT
JCW0D	1	100,00%	100,00%
MichD replied to Apitos on 04-Jun-12 11:41 AM
Voir le fichier suivant :  : http://cjoint.com/?BFerOsN2Ddg

J'ai corrig? la formule de la colonne K:K
Apitos replied to MichD on 04-Jun-12 08:07 PM
Bonjour Denis,


C'est excellent, =E7a marche tr=E8s bien.

Je vais continuer le teste sur le reste de mes donn=E9es et je crois que =
=E7a va aller.

Merci encore.