IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

supprimer la ligne entière lorsqu'une cellule contient une valeur en doublon [XL-2013]


Sujet :

Macros et VBA Excel

  1. #1
    Membre éprouvé
    Inscrit en
    Avril 2007
    Messages
    1 245
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 1 245
    Par défaut supprimer la ligne entière lorsqu'une cellule contient une valeur en doublon
    Bonjour

    j'ai un tableau Excel qui contient plusieurs colonnes dont la colonne B qui contient plusieurs valeurs en doublons. Je précise que la ligne entière n'est pas un doublon. Seule la valeur contenue dans la colonne B est en doublon.
    J'essaie de créer un code Vba qui me supprime les lignes dont la valeur en colonne B est en doublon.
    La difficulté est que ce n'est pas toute la ligne qui est en doublon mais uniquement la valeur contenue dans la colonne B.

    Ci dessous un exemple de ce que j'essaie de faire
    la colonne "produits en doublons" contient le mot ananas, banane et poire en doublon. Je veux supprimer une deux lignes qui contient ces fruits en doublon. Il n'y pas de priorités de suppression.

    Nom : doublons.PNG
Affichages : 536
Taille : 12,9 Ko

    ET voici le resultat

    Nom : doublons2.PNG
Affichages : 435
Taille : 7,3 Ko

    J'ai récupéré un morceau de code Vba sur google qui à partir de la colonne B récupère des valeurs sans doublons.
    Je souhaiterais l'adapter mais avant, pourriez vous m'expliquer ce code car je ne connais pas le script dictionnaire en vba

    Merci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Set mondico = CreateObject("Scripting.Dictionary")
      For Each c In Range("B2:B" & derniereLigne)
        mondico.Item(c.Value) = mondico.Item(c.Value) + 1
      Next c
      [F2].Resize(mondico.Count, 1) = Application.Transpose(mondico.keys)

  2. #2
    Membre émérite
    Homme Profil pro
    Retraité
    Inscrit en
    Octobre 2022
    Messages
    685
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Octobre 2022
    Messages : 685
    Par défaut
    Bonjour,

    il manque pas mal de contexte pour ce code mais il construit sa liste en mémoire et c'est l'objet mondico qui structurellement fait le dédoublonnage. La seule chose qui est un peu pertinente dans ton cas est la boucle for each. Un peu seulement parce que pour une suppression, il vaut mieux partir de la fin de la liste...

    Essaye ça (à coller dans le code de la feuille)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Option Explicit
    Const ColonneCle = 2 'colonne qui contient la clé
    Const Ligne1 = 2 ' première colonne de data
     
    Sub DeDoublonne()
    Dim I As Long
    I = Me.Cells(Me.Rows.Count, ColonneCle).End(xlUp).Row ' Dernière ligne
    While I > Ligne1 ' on va boucler de bas en haut sur la feuille
        If Application.WorksheetFunction.CountIf(Me.Columns(ColonneCle), Me.Cells(I, ColonneCle)) > 1 Then _
            Me.Rows(I).Delete ' On utilise un nb.si pour compter les valeurs : si > 1, on supprime
        I = I - 1 ' on passe à la ligne au-dessus
    Wend ' fin de la boucle
    End Sub

  3. #3
    Membre éprouvé
    Inscrit en
    Avril 2007
    Messages
    1 245
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 1 245
    Par défaut
    Bonjour Tête de chat

    je reviens vers toi concernant la suppression des doublons.
    Mon fichier excel a evolué et je me heurte à un casse tete
    dans le code initial,j'avais ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Set mondico = CreateObject("Scripting.Dictionary")
      For Each c In Range("B2:B" & derniereLigne)
        mondico.Item(c.Value) = mondico.Item(c.Value) + 1
      Next c
      [F2].Resize(mondico.Count, 1) = Application.Transpose(mondico.keys)
    ce code recuperait la valeur unique de la colonne B et la copiait dans la colonne F
    Maintenant je souhaiterais recuperer les 3 valeurs uniques des colonne B à D. Sur les lignes B à D je peux avoir les memes données;
    Dans l'exemple ci dessous , je souhaite recuperer uniquement une seule ligne ou il y a Nom : image.PNG
Affichages : 365
Taille : 2,6 Ko

    Voici ce que j'ai fait..mais cela ne fonctionne pas

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
      Set mondico = CreateObject("Scripting.Dictionary")
      For Each c In Range("B2:D" & derniereLigne)
        mondico.Item(c.Value) = mondico.Item(c.Value) + 1
      Next c
      [E2].Resize(mondico.Count, 1) = Application.Transpose(mondico.keys) ' affiche dans la colonne F les CAB sans doublons
    Au fait j'ai essayé ton code il fonctionne mais arrivé une certaine ligne j'ai un message d'erreur "incompatibilité de type"
    Cela se produit lorsque la valeur contenu dans la colonne B est du texte avec 438 caractères

  4. #4
    Membre émérite Avatar de Alex020181
    Homme Profil pro
    Prestataire informatique développeur d'application Excel, Access, VBA
    Inscrit en
    Juin 2012
    Messages
    601
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Prestataire informatique développeur d'application Excel, Access, VBA

    Informations forums :
    Inscription : Juin 2012
    Messages : 601
    Par défaut
    **********
    Edit; laisse tomber ce code sauf à titre d'étude.
    Philippe à raison bien sûr. Autant utiliser la fonctionnalité incluse d'Excel
    **********


    Bonjour,

    En PJ une proposition avec un dictionnaire.

    Le code balaie tes données et ressort un tableau dédoublonné de ta colonne "B" quelles que soient les valeurs des autres colonnes pour "feuil1".
    Le code balaie tes données et ressort un tableau dédoublonné de ta colonne "BCD" quelles que soient les valeurs des autres colonnes pour "feuil2".

    Teste et dis nous.
    Fichiers attachés Fichiers attachés

  5. #5
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    13 114
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 13 114
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Supprimer les doublons est une fonctionnalité native d'excel et comme tout ce qui est natif il y a une méthode en VBA qui est RemoveDuplicatesde l'objet Range

    Exemple du code VBA pour une plage classique
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Sub t()
      Dim r As Range
      Set r = ThisWorkbook.Worksheets("Data").Range("A1").CurrentRegion
      r.RemoveDuplicates Columns:=2, Header:=xlYes
      Set r = Nothing
    End Sub
    Illustration de la suppression manuelle des doublons

    Nom : 230727 dvp RemoveDuplicate.png
Affichages : 355
Taille : 59,1 Ko
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  6. #6
    Membre émérite Avatar de Alex020181
    Homme Profil pro
    Prestataire informatique développeur d'application Excel, Access, VBA
    Inscrit en
    Juin 2012
    Messages
    601
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Prestataire informatique développeur d'application Excel, Access, VBA

    Informations forums :
    Inscription : Juin 2012
    Messages : 601
    Par défaut
    Oh put*** la honte.
    Mais pourquoi n'y ai-je pas pensé moi même ?
    +1000 pour toi.

    Sur ce coup je mérite la flagellation.

    Ce n'est pas comme si je ne connaissais pas cette option ou bien qu'elle était cachée au fin fond d'Excel.

  7. #7
    Membre éprouvé
    Inscrit en
    Avril 2007
    Messages
    1 245
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 1 245
    Par défaut
    Merci tout le monde pour vos réponse.
    Tout est ok pour moi
    Je ferme la discusion

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 22
    Dernier message: 11/08/2020, 16h10
  2. [WD-2013] Masquer une ligne si sa 2ème cellule contient "Non"
    Par Kael_004 dans le forum Word
    Réponses: 1
    Dernier message: 03/07/2017, 12h52
  3. [XL-2003] Supprimer la ligne sélectionnée sauf une cellule
    Par MARGAR dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 02/05/2014, 18h10
  4. ligne grisée lorsqu'une cellule est sélectionnée
    Par NEC14 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 28/10/2011, 10h40
  5. [XL-2003] Suppression d'une ligne entière suite à une valeur
    Par will-1981 dans le forum Macros et VBA Excel
    Réponses: 12
    Dernier message: 06/04/2009, 01h05

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo