Suppression de ligne en doublons...

Gwad063 Messages postés 23 Date d'inscription lundi 10 décembre 2007 Statut Membre Dernière intervention 25 janvier 2008 - 24 janv. 2008 à 12:27
Gwad063 Messages postés 23 Date d'inscription lundi 10 décembre 2007 Statut Membre Dernière intervention 25 janvier 2008 - 25 janv. 2008 à 09:59
Bonjour à tous,

Je me permets de solliciter encore votre aide parce que j'ai un peu de mal à mettre sur pied une macro toute simple qui va balayer un tableau ligne par ligne et, lorsque elle trouve en ligne i+1 les mêmes valeurs que sur la ligne i (pour les colonnes de A à E), elle va supprimer la ligne avant de passer à la suivante...
Voilà ce que donne ma code :

Sub SuppressionDoublons()
Dim i, j as long
Dim NomFeuille as String
Dim LigPrem as long
Dim Original, Doublons as range

LigPrem = 2
NomFeuille="Spécifiques sur BPR standard"

For i = LigPrem to Sheets(NomFeuille).Range("A" & "65536").End(xlup).row
For j= LigPrem +1 to Sheets(NomFeuille).Range("A" & "65536").End(xlup).row + 1

Set Original = sheets(NomFeuille).Range("A", i & sheets(NomFeuille).range("E", i))
Set Doublons = sheets(NomFeuille).Range("A", j & sheets(NomFeuille).range("E",j))

If Original = Doublons Then
Rows(j).Delete
End If

Next j
Next i

End If

J'ai une erreur à partir du morceau de code en rouge...
Si quelqu'un a quelques conseils à me donner.
Merci beaucoup par avance.

Gwad.

15 réponses

NHenry Messages postés 15112 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 13 avril 2024 159
24 janv. 2008 à 13:34
Bonjour

Change un peu le code :
Set Original = sheets(NomFeuille).Range("A1").offset(i-1,0)
Set Doublons = sheets(NomFeuille).Range("A1").offset(j-1,0)

If Original.value = Doublons.value Then

Dans Word, j'Excel. (juste pour la citation)
VB (6, .NET1&2), C++, C#.Net1
Mon site
0
Gwad063 Messages postés 23 Date d'inscription lundi 10 décembre 2007 Statut Membre Dernière intervention 25 janvier 2008
24 janv. 2008 à 14:25
Bonjour NHenry,

Merci pour la réponse.
J'ai suivi tes conseils mais ça ne marche pas....

Je continue de chercher...

Gwad.
0
nanardino64 Messages postés 131 Date d'inscription vendredi 18 août 2006 Statut Membre Dernière intervention 17 mars 2010
24 janv. 2008 à 14:28
Salut,
For i = LigPrem to Sheets(NomFeuille).Range("A" & "65536").End(xlup).row
For j= LigPrem +1 to Sheets(NomFeuille).Range("A" & "65536").End(xlup).row + 1
Pourquoi tu pars de tout en bas de ton tableau pour remonter ?


Ensuite j'arrive pas à voir quand est-ce que tu regardes les valeurs dans ta ligne ? Parce que en fait dans original et doublon tu ne mets que des adresses ?

Nanardino64
Développons-nous, développeurs.
0
nanardino64 Messages postés 131 Date d'inscription vendredi 18 août 2006 Statut Membre Dernière intervention 17 mars 2010
24 janv. 2008 à 14:36
Bon ok non rien j'ai compris pourquoi tu pars de tout en bas. Mais pour le reste ?

Nanardino64
Développons-nous, développeurs.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Gwad063 Messages postés 23 Date d'inscription lundi 10 décembre 2007 Statut Membre Dernière intervention 25 janvier 2008
24 janv. 2008 à 15:51
Bonjour nanardino64,

Bon, j'ai fait quelques modifications (sans que cela marche pour autant...) :

Sub SuppressionDoublons()
Dim i, j as long
Dim NomFeuille as String
Dim LigPrem as long
Dim Original as range

LigPrem = 2
NomFeuille="Spécifiques sur BPR standard"

For i = LigPrem to Sheets(NomFeuille).Range("A" & "65536").End(xlup).row
'For j= LigPrem +1 to Sheets(NomFeuille).Range("A" & "65536").End(xlup).row + 1

Set Original = sheets(NomFeuille).Range("A" & i & ":E65536").End(xlup).offset(i, 0)
'Set Doublons = sheets(NomFeuille).Range("A", j & sheets(NomFeuille).range("E",j))

If Original.Value = Sheets(NomFeuille).Range("A" & i+1 & ":E65536").End(xlup).Offset (i+1, 0).Value Then
Rows(i +1).Delete
End If

Next i

End If

Quelqu'un a t'il une idée?
0
NHenry Messages postés 15112 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 13 avril 2024 159
24 janv. 2008 à 16:10
Bonjour

Ma proposition (non testée) :

Sub SuppressionDoublons()
    Dim i as long, j as long, z as long
    Dim NomFeuille as String
    Dim LigPrem as long
    Dim lOriginal(0 to 4) as variant
    dim lIdentique as Boolean
    Dim lToControl as range
   
    Dim lMaxLine as long
    lMaxLine=Sheets(NomFeuille).Range("A" & "65536").End(xlup).row
   
    LigPrem = 2
    NomFeuille="Spécifiques sur BPR standard"
   
    For i = LigPrem to lmaxLine
        'Mise en tampon de la ligne à controler et controle de non vide (risque de bouclage infini sinon)
        lIdentique=true
        for z=0 to 4
            lOriginal(z)=sheets(NomFeuille).Range("A" & i).offset(0, z).value
            if lOriginal(z)<>"" then lIdentique=false
        next z
        if not lIdentique then
            For j= i +1 to lmaxLine+1
               
                if j< i +1 then j= i +1
               
                set lToControl=sheets(NomFeuille).Range("A" & j)
                lIdentique=True
                for z=0 to 4
                    if lOriginal(z)<>lToControl.Offset(0,z).value then
                        lIdentique=false
                        exit for
                    end if
                next z
                if lIdentique then
                    Rows(j).Delete
                    j=j-2
                end if
            Next j
        end if
    Next i
End Sub

Dans Word, j'Excel. (juste pour la citation)
VB (6, .NET1&2), C++, C#.Net1
Mon site
0
nanardino64 Messages postés 131 Date d'inscription vendredi 18 août 2006 Statut Membre Dernière intervention 17 mars 2010
24 janv. 2008 à 16:27
En fait je pense qu'il ne peut pas mettre dans une variable les valeurs d'une plage de cellules enfin en tout cas en faisant un test simple ça ne marche pas.
Je pense qu'il va falloir que tu compares les colonnes de chaque ligne en faissant une boucle de colonnes dans ta boucle de lignes.


Je sais pas si j'ai été très clair donc dis moi si c'est clair pour toi.

Nanardino64
Développons-nous, développeurs.
0
NHenry Messages postés 15112 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 13 avril 2024 159
24 janv. 2008 à 16:36
Bonjour

nanardino64, c'est ce que fait le code que j'ai proposé, il lit chaque colonne de chaque ligne pour faire une comparaison cellule par cellule.

Dans Word, j'Excel. (juste pour la citation)
VB (6, .NET1&2), C++, C#.Net1
Mon site
0
nanardino64 Messages postés 131 Date d'inscription vendredi 18 août 2006 Statut Membre Dernière intervention 17 mars 2010
24 janv. 2008 à 16:45
Et oui effectivement j'avais pas vu je l'ai testé il marche super bien en plus !!
Chapeau l'artiste

Nanardino64
Développons-nous, développeurs.
0
NHenry Messages postés 15112 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 13 avril 2024 159
24 janv. 2008 à 16:50
Bonjour

Et uniquement avec le bloc note ...

Dans Word, j'Excel. (juste pour la citation)
VB (6, .NET1&2), C++, C#.Net1
Mon site
0
nanardino64 Messages postés 131 Date d'inscription vendredi 18 août 2006 Statut Membre Dernière intervention 17 mars 2010
24 janv. 2008 à 17:04
J'ai quand même une remarque
pas besoin de faire j=j-2
j=j-1 suffit vu que tu supprimes une ligne il faut revenir d'une ligne et comme ça tu économises le bloc
 if j< i +1 then j= i +1
Qui n'a plus lieu d'être car impossible
Et bonne idée de contrôler le non vide car j'avais commencé à taper un code et je m'étais fait b....er
Voilà juste pour perfectionner ce code qui l'était déjà pas mal (en même temps j'espère que j'ai pas dit une grosse connerie qui va me rendre ridicule une fois de plus)
@+

Nanardino64
Développons-nous, développeurs.
0
Gwad063 Messages postés 23 Date d'inscription lundi 10 décembre 2007 Statut Membre Dernière intervention 25 janvier 2008
24 janv. 2008 à 18:02
Bonsoir à tous,

NHenry, j'ai testé ton code dans mon fichier mais la macro ne fonctionne pas...elle tourne correctement aprs 2/3 modif pour l'adapter, mais sans effacer les lignes identiques...
En tout cas, joli code...

Gwad.
0
nanardino64 Messages postés 131 Date d'inscription vendredi 18 août 2006 Statut Membre Dernière intervention 17 mars 2010
24 janv. 2008 à 18:05
Qu'est ce qui ne marche pas au juste parce que je l'ai testée sur 4 colonnes et ça marche nickel !!

Nanardino64
Développons-nous, développeurs.
0
cs_MPi Messages postés 3877 Date d'inscription mardi 19 mars 2002 Statut Membre Dernière intervention 17 août 2018 23
24 janv. 2008 à 22:28
Gwad063,
Si tu veux effacer des lignes, commence toujours par la fin et tu n'auras pas besoin de réajuster ta variable de ligne (compteur)

For i = Fin to Début Step - 1
    If Cells(i, 1) = Cells(i-1, 1) and _
       Cells(i, 2) = Cells(i-1, 2) and _
       Cells(i, 3) = Cells(i-1, 3) and _

       Cells(i, 4) = Cells(i-1, 4) and _

       Cells(i, 5) = Cells(i-1, 5) Then
   
        Rows(i).Delete
    End If

Next

MPi²
Pour ceux qui programment sous Office, n'oubliez pas qu'il existe un forum dédié à ces applications VBA....... ICI
0
Gwad063 Messages postés 23 Date d'inscription lundi 10 décembre 2007 Statut Membre Dernière intervention 25 janvier 2008
25 janv. 2008 à 09:59
Bonjour,

Merci à tous pour le temps que vous avez consacré à la résolution de mon problème...
MPi, je pense que je vais suivre tes conseils (une fois de plus...); je suis un peu pris par le temps, et c'est ta solution qui me parle le plus...

Gwad.
0
Rejoignez-nous