OVH Cloud OVH Cloud

Macro pour suppression doublon

12 réponses
Avatar
Marti
Bonjour,

Avec Excel 2000

Dans un tableau de 12 colonnes je souhaite supprimer les lignes en double
lorsque la valeur de la colonne 7 et la valeur de la colonne 9 sont
identiques.

En clair supprimer les lignes quand les 2 responsables d'un enfant habitent
à la même adresse. S'ils n'habitent pas à la même adresse, conserver la ligne
des 2 responsables de l'enfant.


Exemple:
=>Ligne1
C1-Division: 2-1
C2- Nom: Renard
C3- Prenom1: Blanc
C4- Date naissance: 20/07/90
C5- Sexe M
C6- Civilité: Mme
=> C7- Nom Responsable: Abo
C8- Prénom Responsable: Toto
=> C9- Ligne 1 Adresse: 21 av du col
C10- Ligne 2 adresse:
C11- CP: 85200
C12- Commune responsable: Jupiter

=>Ligne2
C1-Division: 2-1
C2- Nom: Renard
C3- Prenom1: Blanc
C4- Date naissance: 20/07/90
C5- Sexe M
C6- Civilité: M.
=> C7- Nom Responsable: Abo
C8- Prénom Responsable: Jules
=> C9- Ligne 1 Adresse: 21 av du col
C10- Ligne 2 adresse:
C11- CP: 85200
C12- Commune responsable: Jupiter

Donc dans ce cas supprimer la ligne 2 puisque les 2 responsables habitent a
la même adresse


Je veux également supprimer les lignes lorsque la colonne 9 est vide

J'arrive avec la mise en forme conditionnelle a coloriser les lignes a
supprimer.

=SOMMEPROD((L1C7:LC7=L(1)C7)*(L1C9:LC9=L(1)C9)*(L(1)C7<>""))

A supprimer les lignes ou la colonne 9 est vide
=LC9=""

Pourriez vous m'aider a intégrer cela dans une macro pour supprimer les
doublons.
Peut être est il plus facile de s’y prendre différemment mais je n'ai pas
trouvé.

En vous remerciant par avance

2 réponses

1 2
Avatar
Jacky
Re...

Par contre est il possible que le test de comparaison ne tienne pas compte
des majuscules minuscules voir même des caracteres accentués, accents ¨ ^


Pour limiter la casse, faire la comparaison en tout "majuscule"
If ucase(Cells(j, 2) & Cells(j, 3) & Cells(j, 9)) = ucase(Cells(i, 2) &
Cells(i, 3) & Cells(i, 9)) _
Or Cells(i, 9) = "" Then Rows(i).Delete


--
Salutations
JJ


"kerr2" a écrit dans le message de
news:
Merci Jacky
Je suis dessus depuis que j'ai eu l'indication de ta réponse.
Cela fonctionne. Cela m'a fait modifier la comparaison de mes colonnes. Ce
qui donne en clair:
Effacer ligne si la colonne 9 vide (colonne intitulée ligne 1 adresse)
Effacer ligne si Nom+Prenomeleve+adresse dans colonne9 = ligne +1
Nom+Prenomeleve+adresse dans colonne9 >
Par contre est il possible que le test de comparaison ne tienne pas compte
des majuscules minuscules voir même des caracteres accentués, accents ¨ ^

Merci pour ton suivi.

Sub jj()
Application.ScreenUpdating = False
Application.Calculation = xlManual
For j = 2 To [g65535].End(3).Row
For i = [g65535].End(3).Row To j + 1 Step -1
If Cells(j, 2) & Cells(j, 3) & Cells(j, 9) = Cells(i, 2) &
Cells(i, 3) & Cells(i, 9) _
Or Cells(i, 9) = "" Then Rows(i).Delete
Next
Next
Application.Calculation = xlAutomatic
End Sub

et pour mettre en evidence avec la mise en forme conditionnelle
modification également:

=LC9="" => remplir en bleu


=SOMMEPROD((L1C2:LC2=L(1)C2)*(L1C3:LC3=L(1)C3)*(L1C9:LC9=L(1)C9)*(L(1)C2<>""))
=> remplir en jaune





"Jacky" a écrit dans le message de news:
%23d%
Re...
Jacky serait il possible lorsqu'il y a doublon de supprimer la 2ème
ligne
et
non pas la premiere.
Après test, chez moi, c'est bien la première ligne qui reste en place et

la(les) suivante qui est supprimée.
Voir ici:
http://cjoint.com/?kzvxYBSFqF
Cela fonctionne par contre cela a pris 6'22 sur mon PC au lycee.
Y a t'il moyen d'améliorer la vitesse de la macro.
S'il y a des calculs dans les autres cellules, passer en "Calculation >> xlManual" (voir dans l'exemple)

tester avec 5000 lignes>>= 7 secondes

Une façon simple doit être de limiter aux 3000 premieres lignes. Peut
etre
y
a t'il autrement ?
Cette instruction:

For j = 2 To [g65535].End(3).Row
Va chercher la dernière ligne occupée dans la colonne G et la boucle
"For...Next" n'ira pas au-delà.
Ceci
For j = 2 To [g5000].End(3).Row
ne change à rien dans la durée de la macro
Il faut bien sûre qu'il n'y ait pas de lignes occupées dans cette colonne
en
dehors du tableau concerné

Sinon il reste la solution du "filtre élaboré", que l'on trouve sur
l'excellent site de JB.
http://boisgontierjacques.free.fr/pages_site/FiltreElabore.htm#ExtractionFeuille

--
Salutations
JJ


"Marti" a écrit dans le message de
news:

Jacky serait il possible lorsqu'il y a doublon de supprimer la 2ème
ligne
et
non pas la premiere.
La personne qui a saisi les données dans la base a quelques fois quand
le
pere et la mere d'un eleve habitent a la meme adresse saisi des
informations
en plus pour le premier parent dans une autre colonne. IL n'a pas pris
la
peine de les rentrer a nouveau pour le 2eme parent. En supprimant la
1ere
ligne du doublon on surrprime donc l'information.


J'ai essayé Then Rows(i).Delete a la place de Then Rows(j).Delete
mais cela a effacé toute les lignes sauf les 2 premieres


Code en cours:
-----------------------------------------------------------------------------------------
Sub Sup_doublon()
Application.ScreenUpdating = False
For j = 2 To [g5000].End(3).Row
For i = [g5000].End(3).Row To j + 1 Step -1
If Cells(j, 7) & Cells(j, 9) = Cells(i, 7) & Cells(i, 9) _
Or (Cells(j, 9) = "") Then Rows(j).Delete
Next
Next
End Sub

---------------------------------------------------------------------------------------
J'ai remplacé la valeur de g65535 par g5000 pour essayé de gagner du
temps
sur l'execution de la macro mais cela ne gagne pas grand chose











Avatar
kerr2
Merci Jacky pour le temps passé à m'aider. Cela m'a bien rendu service.


"Jacky" a écrit dans le message de news:

Re...

Par contre est il possible que le test de comparaison ne tienne pas
compte des majuscules minuscules voir même des caracteres accentués,
accents ¨ ^


Pour limiter la casse, faire la comparaison en tout "majuscule"
If ucase(Cells(j, 2) & Cells(j, 3) & Cells(j, 9)) = ucase(Cells(i, 2) &
Cells(i, 3) & Cells(i, 9)) _
Or Cells(i, 9) = "" Then Rows(i).Delete


--
Salutations
JJ


"kerr2" a écrit dans le message de
news:
Merci Jacky
Je suis dessus depuis que j'ai eu l'indication de ta réponse.
Cela fonctionne. Cela m'a fait modifier la comparaison de mes colonnes.
Ce qui donne en clair:
Effacer ligne si la colonne 9 vide (colonne intitulée ligne 1 adresse)
Effacer ligne si Nom+Prenomeleve+adresse dans colonne9 = ligne +1
Nom+Prenomeleve+adresse dans colonne9 >>
Par contre est il possible que le test de comparaison ne tienne pas
compte des majuscules minuscules voir même des caracteres accentués,
accents ¨ ^

Merci pour ton suivi.

Sub jj()
Application.ScreenUpdating = False
Application.Calculation = xlManual
For j = 2 To [g65535].End(3).Row
For i = [g65535].End(3).Row To j + 1 Step -1
If Cells(j, 2) & Cells(j, 3) & Cells(j, 9) = Cells(i, 2) &
Cells(i, 3) & Cells(i, 9) _
Or Cells(i, 9) = "" Then Rows(i).Delete
Next
Next
Application.Calculation = xlAutomatic
End Sub

et pour mettre en evidence avec la mise en forme conditionnelle
modification également:

=LC9="" => remplir en bleu


=SOMMEPROD((L1C2:LC2=L(1)C2)*(L1C3:LC3=L(1)C3)*(L1C9:LC9=L(1)C9)*(L(1)C2<>""))
=> remplir en jaune





"Jacky" a écrit dans le message de news:
%23d%
Re...
Jacky serait il possible lorsqu'il y a doublon de supprimer la 2ème
ligne
et
non pas la premiere.
Après test, chez moi, c'est bien la première ligne qui reste en place et

la(les) suivante qui est supprimée.
Voir ici:
http://cjoint.com/?kzvxYBSFqF
Cela fonctionne par contre cela a pris 6'22 sur mon PC au lycee.
Y a t'il moyen d'améliorer la vitesse de la macro.
S'il y a des calculs dans les autres cellules, passer en "Calculation >>> xlManual" (voir dans l'exemple)

tester avec 5000 lignes>>= 7 secondes

Une façon simple doit être de limiter aux 3000 premieres lignes. Peut
etre
y
a t'il autrement ?
Cette instruction:

For j = 2 To [g65535].End(3).Row
Va chercher la dernière ligne occupée dans la colonne G et la boucle
"For...Next" n'ira pas au-delà.
Ceci
For j = 2 To [g5000].End(3).Row
ne change à rien dans la durée de la macro
Il faut bien sûre qu'il n'y ait pas de lignes occupées dans cette
colonne en
dehors du tableau concerné

Sinon il reste la solution du "filtre élaboré", que l'on trouve sur
l'excellent site de JB.
http://boisgontierjacques.free.fr/pages_site/FiltreElabore.htm#ExtractionFeuille

--
Salutations
JJ


"Marti" a écrit dans le message de
news:

Jacky serait il possible lorsqu'il y a doublon de supprimer la 2ème
ligne
et
non pas la premiere.
La personne qui a saisi les données dans la base a quelques fois quand
le
pere et la mere d'un eleve habitent a la meme adresse saisi des
informations
en plus pour le premier parent dans une autre colonne. IL n'a pas pris
la
peine de les rentrer a nouveau pour le 2eme parent. En supprimant la
1ere
ligne du doublon on surrprime donc l'information.


J'ai essayé Then Rows(i).Delete a la place de Then Rows(j).Delete
mais cela a effacé toute les lignes sauf les 2 premieres


Code en cours:
-----------------------------------------------------------------------------------------
Sub Sup_doublon()
Application.ScreenUpdating = False
For j = 2 To [g5000].End(3).Row
For i = [g5000].End(3).Row To j + 1 Step -1
If Cells(j, 7) & Cells(j, 9) = Cells(i, 7) & Cells(i, 9) _
Or (Cells(j, 9) = "") Then Rows(j).Delete
Next
Next
End Sub

---------------------------------------------------------------------------------------
J'ai remplacé la valeur de g65535 par g5000 pour essayé de gagner du
temps
sur l'execution de la macro mais cela ne gagne pas grand chose















1 2