Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Comparaison sur 3 colonnes

1 réponse
Avatar
danielos
Bonjour,

Dans mon code, je souhaiterai comparer les lignes sur 3 colonnes.
Si les 3 cellules d'un ligne sont =E9gales aux 3 cellules de la ligne en =

dessous =3D> effacer le ligne du dessous
Si les cellules de la colonne A sont identiques mais pas celles de B=20
et/ou C =3D> additionner les cellules de colonne B et de la colonne C pou=
r=20
les lignes o=F9 les cellules de la colonne A sont identiques.

exemple
totoA 1 10 '1 nouvelle ligne unique =3D> on fait rien
totoB 2 12 '1 nouvelle ligne unique =3D> on fait rien
totoC 2 20 '1 nouvelle ligne
totoC 1 12 '2=E8me ligne o=F9 la colonne A est identique mais_
pas B et C =3D> on garde A et on somme B et C_
et on supprime la 2=E8me ligne.
totoD 1 10 '1 nouvelle ligne
totoD 1 12 '2=E8me ligne o=F9 les colonnes A et B sont_
identiques mais pas C =3D> on somme B et C_
et on supprime la 2=E8me ligne
totoE 2 20 '1 nouvelle ligne
totoE 2 20 '2=E8me ligne identique =3D> on la supprime

ce qui donnerait
totoA 1 10
totoB 2 12
totoC 3 32
totoD 2 22
totoE 2 20



j =3D 2 'pour commencer =E0 la deuxi=E8me ligne

While Not IsEmpty(Cells(j, 62))

if Cells(j, 63).Value =3D Cells(j+1, 63).Value and Cells(j,=20
64).Value =3D Cells(j+1, 64).Value and Cells(j, 65).Value =3D Cells(j+1, =

65).Value
then Cells (j+1,62:65).Delete Shift:=3DxlUp
elsif Cells(j, 64).Value =3D Cells (j, 64).Value + Cells (j+1, 64).Value=
=20
and Cells (j, 65).Value =3D Cells (j, 65).Value + Cells (j+1, 65).Value
Cells (j+1,62:65).Delete Shift:=3DxlUp

endif

j =3D j + 1

Wend

Un grand merci d'avance =E0 celle ou celui qui pourra m'apporter ses=20
connaissances.

Daniel

1 réponse

Avatar
GL
Le 06/06/2013 17:35, danielos a écrit :
Bonjour,

Dans mon code, je souhaiterai comparer les lignes sur 3 colonnes.
Si les 3 cellules d'un ligne sont égales aux 3 cellules de la ligne en
dessous => effacer le ligne du dessous
Si les cellules de la colonne A sont identiques mais pas celles de B
et/ou C => additionner les cellules de colonne B et de la colonne C pour
les lignes où les cellules de la colonne A sont identiques.

exemple
totoA 1 10 '1 nouvelle ligne unique => on fait rien
totoB 2 12 '1 nouvelle ligne unique => on fait rien
totoC 2 20 '1 nouvelle ligne
totoC 1 12 '2ème ligne où la colonne A est identique mais_
pas B et C => on garde A et on somme B et C_
et on supprime la 2ème ligne.
totoD 1 10 '1 nouvelle ligne
totoD 1 12 '2ème ligne où les colonnes A et B sont_
identiques mais pas C => on somme B et C_
et on supprime la 2ème ligne
totoE 2 20 '1 nouvelle ligne
totoE 2 20 '2ème ligne identique => on la supprime

ce qui donnerait
totoA 1 10
totoB 2 12
totoC 3 32
totoD 2 22
totoE 2 20



Soit :

SELECT A,SUM(B),SUM(C)
FROM (
SELECT A,B,C FROM _table_ GROUP BY A,B,C
) _SubQuery_
GROUP BY A



Je vous propose un truc dynamique (sans macro).
Vos données doivent être triées (lexicographiquement) :

A B C D
totoA 1 10 =LIGNE()
totoB 2 12 =SI(ET(A2¡;B2±;C2Á);FAUX;LIGNE())
totoC 2 20 = ""
totoC 1 12 = ""
totoD 1 10 = ""
totoD 1 12 = ""
totoE 2 20 = ""
totoE 2 20 = ""
totoF 3 30 = ""
totoF 2 30 =SI(ET(A10©;B10¹;C10É);FAUX;LIGNE())

=> La colonne D contient FAUX pour les doublons sur (A,B,C)

idem colonne E :
=LIGNE()
=SI(A2<>A1;LIGNE())
= ""
= ""
.........
=SI(A10<>A9;LIGNE())

=> La colonne E contient FAUX pour les doublons sur A

Colonne F : on somme B sur les doublons avec SOMME.SI.ENS :
=SOMME.SI.ENS(B$1:B$10;$D$1:$D$10;"<>FAUX";$A$1:$A$10;"=" & $A1)
....
=SOMME.SI.ENS(B$1:B$10;$D$1:$D$10;"<>FAUX";$A$1:$A$10;"=" & $A10)

Colonne G : on somme C sur les doublons avec SOMME.SI.ENS :
=SOMME.SI.ENS(C$1:C$10;$D$1:$D$10;"<>FAUX";$A$1:$A$10;"=" & $A1)
....
=SOMME.SI.ENS(C$1:C$10;$D$1:$D$10;"<>FAUX";$A$1:$A$10;"=" & $A10)

Colonne H : on extrait les lignes à afficher :
{=PETITE.VALEUR(E1:E10;{1;2;3;4;5;6;7;8;9;10})}
...
{=PETITE.VALEUR(E1:E10;{1;2;3;4;5;6;7;8;9;10})}

(validation matricielle. Je vous donne un truc sioux ci-dessous ;-) )

Colonnes I, J et K on donne le résultat :
I J K
=INDEX(A$1:A$10;$H1) =INDEX(F$1:F$10;$H1) =INDEX(G$1:G$10;$H1)
... ... ...
=INDEX(A$1:A$10;$H10) =INDEX(F$1:F$10;$H10) =INDEX(G$1:G$10;$H1)


Le truc sioux c'est pour la liste {1;2;3;4;5;6;7;8;9;10} : ce sont les
entiers de 1 à 10, c'est à dire de 1 au nombre de cellule de la plage
de validation de la formule matricielle
{=PETITE.VALEUR(E1:E10;{1;2;3;4;5;6;7;8;9;10})}

cette liste d'entiers peut donc être créée dynamiquement par fonction
VBA : (fonction hyper-pratique quand on travaille sur les matrices)

Avec cette fonction FORLIST, la formule matricielle devient :

{=PETITE.VALEUR(E1:E10;FORLIST())}

Et quelle que soit la taille de vos données, le résultat sera adapté !

La voici :
' ------------------------------------------------
Public Function FORLIST(Optional start_value# = 1, _
Optional step_value# = 1)
Dim i&, j&, res() As Double
If Application.Caller.Rows.Count = 1 Then
i = Application.Caller.Columns.Count: ReDim res(1 To 1, 1 To i)
For i = 1 To i
res(1, i) = start_value
start_value = start_value + step_value
Next i
Else: i = Application.Caller.Rows.Count
ReDim res(1 To i, 1 To Application.Caller.Columns.Count)
For i = 1 To i
For j = 1 To UBound(res, 2)
res(i, j) = start_value
Next j
start_value = start_value + step_value
Next i
End If

FORLIST = res

End Function
' ------------------------------------------------

{=FORLIST()} (validation matricielle) équivaut donc à
={FORLIST(1;1)} => commence à 1 avec un pas de 1

Cordialement.