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, =
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
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) :
=> 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.
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) :
=> 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
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) :
=> 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