|
|
|
|
Macro suppression doublon Excel
Dernière réponse le 6 jui 2009 à 17:51:26 Terek, le 9 jan 2008 à 15:27:12Bonjour,
Alors je vous explique la situation. Je suis en stage dans une boîte d'organisation d'évenement médicale et aujourd'hui j'ai recu pour mission de supprimer les doublons (meme nom et prenom et adresse, on ne tient pas compte des autres informations) dans une magnifique liste de 5000 personnes.
Il y en a énormement et donc j'ai décider de me lancer dans une macro excel.
Voila mon code :
Sub Suppressiondouble()
'
' Suppressiondouble Macro
' Macro enregistrée le 09/01/2008 par Prod4
'
Dim I As Long
Dim Plage_nom As Range
Dim Plage_prenom As Range
Dim Plage_addresse As Range
Set Plage_nom = Range("C2:C" & Range("C2").End(xlDown).Row)
Set Plage_prenom = Range("D2:D" & Range("D2").End(xlDown).Row)
Set Plage_adresse = Range("G2:G" & Range("G2").End(xlDown).Row)
For I = Plage_nom.Cells.Count To 1 Step -1
If Plage_nom.Cells(I).Value = Plage_nom.Cells(I - 1).Value And Plage_prenom.Cells(I).Value = Plage_prenom.Cells(I - 1).Value And Plage_adresse.Cells(I).Value = Plage_adresse.Cells(I - 1).Value Then
Plage_nom.Cells(I).EntireRow.Delete
End If
Next
'
End Sub
Lorsque j'éxécute ma macro, j'ai le message d'erreur "La méthode Delete de la classe range a échoué". Je suis débutant en maccro, j'ai appris aujourd'hui en zieutant le forum comment ca marche et donc je ne sais pas comment régler ce probleme. Si j'enlève ma condition IF, tout mon tableau se supprime ce qui montre que le delete fonctionne non? Peut etre ai-je fais une érreur dans la condition de mon IF, aidez moi s'il vous plait.
Merci a bientot.
Configuration: Windows XP Excel 2003 Internet Explorer 7.0
Bonjour
Plage_nom.Cells(I).EntireRow.Delete
par
Rows(I).Delete
Tu utilises "cells" sans mettre le paramètre colonne et cela peux peut-être poser problème et pour supprimer une ligne, pourquoi écrire plus que nécessaire ? Autre petit souci, dans tes réservations de plage :
Set Plage_prenom = Range("D2:D" & Range("D65536").End(xlUp).Row)
et non
Set Plage_prenom = Range("D2:D" & Range("D2").End(xlDown).Row)
En effet si tu as une cellule vide, D10 par exemple, tu t'arrêtes en D9 si tu part du haut. Sinon bravo pour la conception très compacte et très efficace de ton code car c'est rare de voir une telle qualité en débutant. toujours zen |
Parcequ'il va s'arracher le cheveux. une fois que tu commences (et tu réussis) c'est business qui va venir et demander "un peu plus" par ci "un peu plus par là". ça commence petit et 6 mois après tu est dans la merde parcequ'on a seulement hacké une soluce au lieu de trouver une vraie solution.
|
Bonjour
|
Bonjour,
Option Explicit
Sub suppression()
Dim I As Long
Dim Plage_nom As Range
Dim Plage_prenom As Range
Dim Plage_adresse As Range
Set Plage_nom = Range("C2:C" & Range("C2").End(xlDown).Row)
Set Plage_prenom = Range("D2:D" & Range("D2").End(xlDown).Row)
Set Plage_adresse = Range("G2:G" & Range("G2").End(xlDown).Row)
For I = Plage_nom.Cells.Count To 1 Step -1
Plage_nom.Cells(I).Value = UCase(Plage_nom.Cells(I).Value)
Plage_nom.Cells(I - 1).Value = UCase(Plage_nom.Cells(I - 1).Value)
Plage_prenom.Cells(I).Value = UCase(Plage_prenom.Cells(I).Value)
Plage_prenom.Cells(I - 1).Value = UCase(Plage_prenom.Cells(I - 1).Value)
Plage_adresse.Cells(I).Value = UCase(Plage_adresse.Cells(I).Value)
Plage_adresse.Cells(I - 1).Value = UCase(Plage_adresse.Cells(I - 1).Value)
If Plage_nom.Cells(I).Value = Plage_nom.Cells(I - 1).Value And Plage_prenom.Cells(I).
Value = Plage_prenom.Cells(I - 1).Value And Plage_adresse.Cells(I).Value = Plage_adresse.
Cells(I - 1).Value Then
Rows(I).Delete
End If
Next
End Sub
Eu j'ai un petit problème. J'ai rajouter une coloration sans suppression de la ligne afin de vérifier quel ligne était supprimé. Quand je lance la macro, c'est la ligne I-1 qui s'en va pour moi. Je m'explique 1 Bob 2 Hernest 3 Michel 4 Michel 5 Roger Ici je voudrai que Michel (numero 4 soit supprimé) allant de bas en Haut, Michel (numéro 4) = Cells(I) et donc Michel (numéro 3) serait donc égale a Cells(I-1) non ?? A moins que je n'ai pas compris :(. |
"Ici je voudrai que Michel (numero 4 soit supprimé) allant de bas en Haut,
|
Bonjour
Plage_nom.Rows(I).EntireRow.Delete
au temps pour moi qui ai trop simplifié car j'ai l'habitude du mode ligne. toujours zen |
Ok merci pour toutes vos réponses
Option Explicit
Sub Mise_en_forme()
Dim I As Long
Dim Plage_nom As Range
Dim Plage_prenom As Range
Dim Plage_adresse As Range
Dim Plage_TVF As Range
Set Plage_nom = Range("C2:C" & Range("C2").End(xlDown).Row)
Set Plage_prenom = Range("D2:D" & Range("D2").End(xlDown).Row)
Set Plage_adresse = Range("G2:G" & Range("G2").End(xlDown).Row)
Set Plage_TVF = Range("A2:A" & Range("A2").End(xlDown).Row)
For I = Plage_nom.Cells.Count To 2 Step -1
Plage_nom.Cells(I).Value = UCase(Plage_nom.Cells(I).Value)
Plage_nom.Cells(I - 1).Value = UCase(Plage_nom.Cells(I - 1).Value)
Plage_prenom.Cells(I).Value = UCase(Plage_prenom.Cells(I).Value)
Plage_prenom.Cells(I - 1).Value = UCase(Plage_prenom.Cells(I - 1).Value)
Plage_adresse.Cells(I).Value = UCase(Plage_adresse.Cells(I).Value)
Plage_adresse.Cells(I - 1).Value = UCase(Plage_adresse.Cells(I - 1).Value)
Plage_TVF.Cells(I).Value = UCase(Plage_TVF.Cells(I).Value)
Plage_TVF.Cells(I - 1).Value = UCase(Plage_TVF.Cells(I - 1).Value)
If Plage_nom.Cells(I).Value = Plage_nom.Cells(I - 1).Value And Plage_prenom.Cells(I).Value = Plage_prenom.Cells(I - 1).Value And Plage_adresse.Cells(I).Value = Plage_adresse.Cells(I - 1).Value Then
Rows(I + 1).Delete
End If
'suppression si meme nom prenom adresse
Rows(I).Interior.ColorIndex = 6
'Ligne déjà traité JAUNE FONCé
If Plage_nom.Cells(I).Value = Plage_nom.Cells(I - 1).Value And Plage_prenom.Cells(I).Value = Plage_prenom.Cells(I - 1).Value And Plage_adresse.Cells(I).Value <> Plage_adresse.Cells(I - 1).Value And Plage_TVF.Cells(I).Value <> Plage_TVF.Cells(I - 1).Value Then
Rows(I + 1).Interior.ColorIndex = 40
Rows(I).Interior.ColorIndex = 22
End If
'adresse diffère ROSE
If Plage_nom.Cells(I).Value = Plage_nom.Cells(I - 1).Value And Plage_prenom.Cells(I).Value <> Plage_prenom.Cells(I - 1).Value And Plage_adresse.Cells(I).Value = Plage_adresse.Cells(I - 1).Value And Plage_TVF.Cells(I).Value <> Plage_TVF.Cells(I - 1).Value Then
Rows(I + 1).Interior.ColorIndex = 20
Rows(I).Interior.ColorIndex = 42
End If
'prénom diffère BLEU
If (Plage_nom.Cells(I).Value <> Plage_nom.Cells(I - 1).Value Or Plage_TVF.Cells(I).Value <> Plage_TVF.Cells(I - 1).Value) And Plage_prenom.Cells(I).Value = Plage_prenom.Cells(I - 1).Value And Plage_adresse.Cells(I).Value = Plage_adresse.Cells(I - 1).Value Then
Rows(I + 1).Interior.ColorIndex = 34
Rows(I).Interior.ColorIndex = 36
End If
'Nom ou TVF Différent JAUNE
Next
End Sub
Merci pour tout et à bientôt.
|
Salut !
|
Wow pas facile de se remettre la dedans plus d'un an après lol.
|

