VBA doublon

Bonjour,

Je cherche une fonction depuis bientôt une semaine pour savoir comment supprimer une ligne allant de A à U si elle comporte en I une valeur déjà référencé dans cette même colonne.

Il me faut une suppression avec ClearContents et pas autre chose car j'ai des mise en forme, style, tableaux à garder.

En d'autres termes, la fonction fera ça :

1) comparaison de la colonne I

2) si occurence, suppression de la ligne correspondante (grâce à ClearContents)

3) sinon rien.

Merci !!!

5exemple.zip (9.36 Ko)

Il existe une fonction excel suppression des doublons, dans ce cas sélectionne juste la colonne I.

[Données --> Supprimer les doublons]

SI tu veux en VBA, autant dans ce cas enregistrer la macro par apprentissage.

Bonjour,

ClearContents efface le contenu et laisse la ligne. Il faut savoir si tu veux supprimer ou effacer ?

Note aussi que lors de l'insertion d'une ligne, la ligne insérée prend le format de la ligne précédente.

Cordialement.

Salut Lerbofiwol, Steelson, MFerrand,

Lerbofiwol : Ma proposition en 2 petits codes dont tu trouveras les boutons sur ta feuille :

  • Une macro qui supprime les doublons (en clearcontents)
  • Une macro qui bouche les trous en copiant-collant les valeurs des lignes occupées sur les lignes vides (donc sans toucher à la structure du tableau)

Steelson : sa problématique c'est de ne pas bouger la structure de son tableau qui contient une mise en forme particulière, la fonction tri des doublons va juste te faire ressortir ta liste sans doublons, en shootant les lignes

EDIT 13:00 : oups bug de fichier, je remets le bon fichier.

Re,

Aucune importance de supprimer. Tant qu'il reste 2 lignes dans un tableau mis en forme, on peut insérer des lignes qui acquerront d'office la même mise en forme.

Cordialement.

MFerrand a écrit :

Re,

Aucune importance de supprimer. Tant qu'il reste 2 lignes dans un tableau mis en forme, on peut insérer des lignes qui acquerront d'office la même mise en forme.

Cordialement.

en l'occurence ce n'est pas sa demande, il ne souhaite pas insérer, mais supprimer le contenu sans supprimer la ligne, on n'a pas tous les tenants et aboutissants derrière, peut-être que son tableau sera alimenté par des gens qui ne font pas la différence entre insérer une ligne entre deux lignes (auquel cas pas de souci) et ajouter une ligne en fin de tableau (ce qui sera problématique.)

Sa demande c'est de garder sa structure de tableau intacte.

J'ai bien saisi sa demande ! Laquelle dénote également des lacunes dans la connaissance du fonctionnement de base d'Excel, et il n'est jamais inutile d'apporter quelques informations de nature à combler ces manques et à améliorer sa prise en mains de l'application. Cela ne l'empêche nullement à l'issue de la discussion de faire ce que bon lui semble.

Et moi de même d'ailleurs !

Cordialement.

Bonjour !!!!

La réponse est tardive j'en suis désolé...

Merci beaucoup pour votre aide et Gaz0line a parfaitement raison et a parfaitement respecté ma demande !!

Donc merci beaucoup !!!!!!!!

PS: Petite question !!

Est-ce qu'il est possible de passer ces deux macros en Private sub ?? (automatique sans doublon)

Oui tu peux ! Dans le fichier joint tu trouveras un exemple avec la procédure en Private sub dans la feuille concernée, avec un déclenchement à l'activation de la feuille.

Bonjour,

J'ai un petit soucis avec ton code :/ je pense que c'est ma faute mais je ne sais pas pourquoi ^^ Comme sur ton modèle, je passe la macro en activation automatique à l'activation de la feuille. Sauf que j'ai des erreurs :/

Private Sub Worksheet_Activate()

Dim DernLigne As Long
DernLigne = Range("A65536").End(xlUp).Row
'Suppression des doublons
For a = 5 To DernLigne
compteur = 0
    If Cells(a, 9) <> "" Then
        For b = 5 To DernLigne
            If Cells(b, 9).Value = Cells(a, 9).Value Then
                compteur = compteur + 1
                If compteur > 1 Then Cells(b, 9).EntireRow.ClearContents
            End If
        Next b
    End If
Next a

For a = 5 To DernLigne
    If Cells(a, 1) = "" Then
        If Cells(a + 1, 1) <> "" Then
            Range(Cells(a + 1, 1), Cells(a + 1, 21)).Copy
            Cells(a, 1).Select
            Selection.PasteSpecial xlPasteValues
            Cells(a + 1, 1).EntireRow.ClearContents
        End If
    End If
Next a

End Sub

Quand je lance il me dit : La méthode PasteSpecial de la classe range a échoué.

Même erreur pour la ligne du dessus : La méthode select de la classe range a échoué.

Si vous avez la solution et l'expliquation j'aimerai bien comprendre pourquoi il fait cette erreur.

Merci beaucoup !!!

EDIT----------------------------------------------------

En fait je pense que pour le select, sachant que j'ai rassemblé tes 2 macros et que je l'ai passe en Worksheet_SelectionChange(etc...)

car je préfère que ça se fasse dès que j'ajoute une ligne depuis un autre onglet (une macro me fait ça) la selection doit merdouiller sur ce point.

A voir vue que je ne suis qu'un jeune padawan en VBA ^^

Cependant si tu as une recommendation car tes 2 macros vont s'executer sur un tableau qui comportera beauuuucoup de lignes.

>>> soucis de vitesse d'execution s'il y en a..

De mon côté ça fonctionne, j'ai fait le test.

Eventuellement teste en faisant comme ça :

Puisque la procédure fonctionnait quand tu 'las testée et qu'elle était dans un module, laisse la procédure BoucheTrous dans un module et appelle cette procédure à la fin de ton tri de doublons

Private Sub Worksheet_Activate()

Dim DernLigne As Long
DernLigne = Range("A65536").End(xlUp).Row
'Suppression des doublons
For a = 5 To DernLigne
compteur = 0
    If Cells(a, 9) <> "" Then
        For b = 5 To DernLigne
            If Cells(b, 9).Value = Cells(a, 9).Value Then
                compteur = compteur + 1
                If compteur > 1 Then Cells(b, 9).EntireRow.ClearContents
            End If
        Next b
    End If
Next a

Call BoucheTrous

End Sub

lerbofiwol a écrit :

EDIT----------------------------------------------------

En fait je pense que pour le select, sachant que j'ai rassemblé tes 2 macros et que je l'ai passe en Worksheet_SelectionChange(etc...)

car je préfère que ça se fasse dès que j'ajoute une ligne depuis un autre onglet (une macro me fait ça) la selection doit merdouiller sur ce point.

A voir vue que je ne suis qu'un jeune padawan en VBA ^^

Cependant si tu as une recommendation car tes 2 macros vont s'executer sur un tableau qui comportera beauuuucoup de lignes.

>>> soucis de vitesse d'execution s'il y en a..

teste ma solution de laisser la procédure dans un module à part déjà Après je ne suis pas très calée sur les macros événementielles, je ne m'en sers quasiment jamais

pour la vitesse d'éxécution tu peux ajouter au début un Application.ScreenUpdating = False qui va désactiver l'affichage des étapes de ta macro (c'est à dire que ta macro tourne, selectionne des trucs etc... mais ton écran ne bouge pas, ça économise de la puissance donc du temps )

et mettre à la fin un Application.ScreenUpdating = True qui va réactiver la mise à jour de l'écran

Alors !!

Effectivement ça marche sauf que ^^

Quand ma ligne est copiée plus d'une ligne en dessous de mes données elle fait du pas à pas pour remonter ^^

Mis à part ça merci beaucoup !!!! Tu peux pas imaginer à quel point tu me débloques ^^

EDIT-----------------------------------

De plus j'ai remarqué une erreur quand je passe la fonction en Private Sub .....SelectionChange(......)

L'erreur du pastespecial revient !!

lerbofiwol a écrit :

Effectivement ça marche sauf que ^^

Quand ma ligne est copiée plus d'une ligne en dessous de mes données elle fait du pas à pas pour remonter ^^

Ok, ajoute a=a-2 dans ta procédure BoucheTrous, à l'endroit ci-dessous :

Sub BoucheTrous()

Dim DernLigne As Long
DernLigne = Range("A65536").End(xlUp).Row

For a = 5 To DernLigne
    If Cells(a, 1) = "" Then
        If Cells(a + 1, 1) <> "" Then
            Range(Cells(a + 1, 1), Cells(a + 1, 21)).Copy
            Cells(a, 1).Select
            Selection.PasteSpecial xlPasteValues
            Cells(a + 1, 1).EntireRow.ClearContents
           a = a - 2
        End If
    End If
Next a

End Sub
lerbofiwol a écrit :

De plus j'ai remarqué une erreur quand je passe la fonction en Private Sub .....SelectionChange(......)

L'erreur du pastespecial revient !!

A mon avis y a un conflit entre le SelectionChange et le fait que dans la macro on sélectionne une cellule pour coller (---> du coup ça déclenche encore ton SelectionChange je pense)

Je réfléchie à un contournement

Gaz0line a écrit :
lerbofiwol a écrit :

De plus j'ai remarqué une erreur quand je passe la fonction en Private Sub .....SelectionChange(......)

L'erreur du pastespecial revient !!

A mon avis y a un conflit entre le SelectionChange et le fait que dans la macro on sélectionne une cellule pour coller (---> du coup ça déclenche encore ton SelectionChange je pense)

Je réfléchie à un contournement

Bon bah ça marche nickel j'ai testé avec des lignes qui sont entre des doublons qui sont toutes seuls dans le bas du tableau c'est juste nickel !!!

De plus, étant donné que ça marche comme celà, ne te presse pas pour le passe en .SelectionChange, ce sera pour ma culture personnel en vba

Merci énormément !!! Celà fait une à deux semaine que je cherchais cette solution !! =) Merci beaucoup beaucoup !!!

Re !

Essaie ce code (je t'ai tout remis comme ça pas d'erreurs) :

Normalement ça passe j'ai testé de mon côté

Private Sub Worksheet_SelectionChange(ByVal Target As Range)

Dim DernLigne As Long
DernLigne = Range("A65536").End(xlUp).Row

'Suppression des doublons
For a = 5 To DernLigne
compteur = 0
    If Cells(a, 9) <> "" Then
        For b = 5 To DernLigne
            If Cells(b, 9).Value = Cells(a, 9).Value Then
                compteur = compteur + 1
                If compteur > 1 Then Cells(b, 9).EntireRow.ClearContents
            End If
        Next b
    End If
Next a

' suppression des trous
For a = 5 To DernLigne
    If Cells(a, 1) = "" Then
        If Cells(a + 1, 1) <> "" Then
            Range(Cells(a + 1, 1), Cells(a + 1, 21)).Copy
            Cells(a, 1).PasteSpecial xlPasteValues
            Cells(a + 1, 1).EntireRow.ClearContents
            a = a - 2
        End If
    End If
Next a

End Sub

lerbofiwol a écrit :
lerbofiwol a écrit :

Merci énormément !!! Celà fait une à deux semaine que je cherchais cette solution !! =) Merci beaucoup beaucoup !!!

De rien

Arf !!!!!!

T'es un Dieu !!!!

ça marche nickel !!! =)

T'es troop fort encore merci !!!

lerbofiwol a écrit :

Arf !!!!!!

T'es un Dieu !!!!

ça marche nickel !!! =)

T'es troop fort encore merci !!!

N'exagérons rien j'ai juste viré le .select pour mettre le .pastespecial directement !

(mais sinon c'est "déesse" pour moi, plutôt, si ça t'embête pas )

Gaz0line a écrit :

(mais sinon c'est "déesse" pour moi, plutôt, si ça t'embête pas )

Mdrr Ok va pour déesse !!

Ceci étant dit où as tu appris le vba ?? Je fais du C donc je comprend se qui se passe dans un code vba mais la structure d'écriture est trop bizarre je ne m'y retrouve pas....

J'aimerai bien apprendre notamment pour les UserForm qui sont supeeeeer pratiques !!!!!!!!

Je bosse sur excel à longueur de journée, et j'avais besoin d'automatiser certaines tâches et de faire tourner des trucs la nuit.

Du coup j'ai appris plus ou moins sur le tas et avec les cours VBA en ligne d'Excel-Pratique (ici), et puis ensuite j'ai fait une petite formation de 2 jours pour, on va dire, structurer mes connaissances qui étaient un peu dans tous les sens

Et puis après , aider sur le forum me permet d'apprendre plein de trucs que je connaissais pas, en cherchant des solutions, on apprend beaucoup comme ça

Le plus gros enseignement que j'ai retenu de ma petite formation c'est d'arrêter de perdre du temps à me demander si telle ou telle chose est possible, parce qu'en réalité, tout est possible en VBA

Rechercher des sujets similaires à "vba doublon"