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 :

Suppression doublons dans deux colonnes


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Octobre 2008
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 22
    Par défaut Suppression doublons dans deux colonnes
    Salut,

    Voila, j'ai un tableau excel de 600 lignes environ (valeur qui change en fonction du remplissage) avec d'une part, une référence dans la colonne A et un indice dans la colonne B.
    L'idée étant de supprimer les doublons avec la même référence et le même indice.

    Je galère un peu car une fois la référence trouvée, il faut chercher l'indice et si c'est le même, le supprimer. Deuxième problématique, il peut y avoir dans le tableau 5/6 références identiques avec des indices identiques ou pas.

    Ma macro fonctionne partiellement : elle supprime les doublons (même ref et meme indice) mais par pour tous. Ou alors, elle boucle en permanence sans sortir.

    Si vous avez des idées de modif,

    Les définitions de variables :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    'Ligne de début et fin du tableau
    LigneDebut = Sheets(OngletAccord).Range(CodAccord & lideb).Row
    LigneFin = Sheets(OngletAccord).Range(CodAccord & "65536").End(xlUp).Row
    Les constantes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    Option Explicit
    Option Base 1
     
    Public LigneDebut As Long, LigneFin As Long, i As Long
     
    Const CodAccord = "A"   ' colonne Numero Accord
    Const CodInd = "B"   ' colonne indice
    Const lideb = 3     ' premiere ligne des données
    Const OngletAccord = "Accords"
    La macro :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
     
    Sub RetireDoublons(LigneDebut As Long, LigneFin As Long)
    'Définit la plage de cellules pour la recherche de doublons
     
    Dim Valeur_Cherchee As String
    Dim obj As Object, plage As Range, AdresseTrouvee As String
    Dim LigneRecherche As Long, p As Long
    Dim Indice_Objet_Encours As Integer, Indice_Objet_Trouve As Integer
     
    ' boucle sur les lignes en partant de la dernière (à cause des suppressions eventuelles de lignes)
    For p = LigneFin To LigneDebut Step -1
     
        ' plage où on va rechercher
        Set plage = Worksheets(OngletAccord).Range(CodAccord & lideb, CodAccord & p - 1)
     
            ' Accord et Indice ligne i
            Valeur_Cherchee = Range(CodAccord & p).Value
            LigneRecherche = Range(CodAccord & p).Row
     
            ' recherche Accord dans plage
            Set obj = plage.Cells.Find(what:=Valeur_Cherchee, LookAt:=xlWhole)
     
            ' si Accord est trouvé
            If Not obj Is Nothing And Valeur_Cherchee <> "" And p <> lideb Then
     
                AdresseTrouvee = obj.Row
     
                'Vérification de l'indice
                'indice de l'objet trouvé et objet en cours
                Indice_Objet_Encours = Range(CodAccord & p).Offset(0, 1).Value
                Indice_Objet_Trouve = obj.Offset(0, 1).Value
     
                If Indice_Objet_Encours = Indice_Objet_Trouve Then
                    MsgBox "L'accord " & Valeur_Cherchee & " indice " & Indice_Objet_Encours & " existe déjà à la ligne " _
                    & AdresseTrouvee & "." & Chr(10) & Chr(10) & "Il va être supprimé."
     
                    Application.EnableEvents = True
                    Sheets(OngletAccord).EnableSelection = xlUnlockedCells
                    Sheets(OngletAccord).Protect Contents:=True, UserInterfaceOnly:=True
     
                    Rows(p).Delete 'Efface la ligne en doublon
                Else
                    Do 'Faire la boucle tant qu'il existe des doublons sur les numéros d'accord
                        Set obj = plage.Cells.FindNext(obj) 'Recherche du suivant
     
                        AdresseTrouvee = obj.Row
     
                        'Vérification de l'indice
                        'indice de l'objet trouvé et objet en cours
                        Indice_Objet_Encours = Range(CodAccord & p).Offset(0, 1).Value
                        Indice_Objet_Trouve = obj.Offset(0, 1).Value
     
                        If Indice_Objet_Encours = Indice_Objet_Trouve Then
                            MsgBox "L'accord " & Valeur_Cherchee & " indice " & Indice_Objet_Encours & " existe déjà à la ligne " _
                            & AdresseTrouvee & "." & Chr(10) & Chr(10) & "Il va être supprimé."
     
                            Application.EnableEvents = True
                            Sheets(OngletAccord).EnableSelection = xlUnlockedCells
                            Sheets(OngletAccord).Protect Contents:=True, UserInterfaceOnly:=True
     
                            Rows(p).Delete 'Efface la ligne en doublon
                        End If
                    Loop While Not obj Is Nothing And AdresseTrouvee <> (p - 1) 'And Valeur_Cherchee <> "" And p <> lideb)
                End If
            End If
    Next p
     
    'vidage des variables
    Set plage = Nothing
    Set obj = Nothing
     
    End Sub

  2. #2
    Expert confirmé
    Homme Profil pro
    Responsable des études
    Inscrit en
    Juillet 2014
    Messages
    2 681
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable des études
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2014
    Messages : 2 681
    Par défaut
    Citation Envoyé par fred792 Voir le message
    Voila, j'ai un tableau excel de 600 lignes environ (valeur qui change en fonction du remplissage) avec d'une part, une référence dans la colonne A et un indice dans la colonne B.
    L'idée étant de supprimer les doublons avec la même référence et le même indice.
    Bonjour,

    Pourquoi ne pas utiliser l'outil de suppression de doublons intégré à Excel (onglet données) ?
    Si tu ne sais pas comment l'utiliser en vba l'enregistreur de macro peut te livrer la base du code.

    petite remarque qui ne résoudras en rien ton problème mais:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    LigneFin = Sheets(OngletAccord).Range(CodAccord & "65536").End(xlUp).Row
    A mois de travailler encore sur des fichiers xls cette ligne est obsolète, il vaut mieux remplacer "65536" par rows.count qui a l'avantage de fonctionner correctement peu importe la version d'Excel.

  3. #3
    Membre averti
    Inscrit en
    Octobre 2008
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 22
    Par défaut
    Citation Envoyé par halaster08 Voir le message
    Bonjour,

    Pourquoi ne pas utiliser l'outil de suppression de doublons intégré à Excel (onglet données) ?
    Si tu ne sais pas comment l'utiliser en vba l'enregistreur de macro peut te livrer la base du code.
    Car cette suppression de doublons s'intègrent dans beaucoup d'autres traitements et calculs.

    Citation Envoyé par halaster08 Voir le message
    petite remarque qui ne résoudras en rien ton problème mais:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    LigneFin = Sheets(OngletAccord).Range(CodAccord & "65536").End(xlUp).Row
    A mois de travailler encore sur des fichiers xls cette ligne est obsolète, il vaut mieux remplacer "65536" par rows.count qui a l'avantage de fonctionner correctement peu importe la version d'Excel.
    C'est fait merci. Les vielles habitudes

  4. #4
    Expert éminent Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Par défaut
    Citation Envoyé par fred792 Voir le message
    Voila, j'ai un tableau excel de 600 lignes environ (valeur qui change en fonction du remplissage) avec d'une part, une référence dans la colonne A et un indice dans la colonne B.
    L'idée étant de supprimer les doublons avec la même référence et le même indice.
    Ce que tu décris peut se faire en une seule ligne de code avec RemoveDuplicates.
    https://msdn.microsoft.com/fr-fr/lib.../ff193823.aspx

  5. #5
    Membre averti
    Inscrit en
    Octobre 2008
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 22
    Par défaut
    j'essaye de l'adapter :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Worksheets(OngletAccord).Range(CodAccord & lideb, CodAccord & LigneFin).RemoveDuplicates Columns:=Array(1, 2), Header:=xlNo
    Erreur d'exécution 5 : Argument ou appel de procédure incorrect

    ???

  6. #6
    Expert confirmé
    Homme Profil pro
    Responsable des études
    Inscrit en
    Juillet 2014
    Messages
    2 681
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable des études
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2014
    Messages : 2 681
    Par défaut
    Dans ton range plutôt qu'un virgule pour séparer il faut utiliser les deux points (ex: range(A1:A100) )
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Range(CodAccord & lideb & ":" & CodAccord & LigneFin)
    Mais ça ne suffit pas à régler ton problème, tu n'utilise qu'une seule colonne dans le range (CodAccord) et tu lui demande les doublons sur deux colonnes Columns:=Array(1, 2), il ne peut pas prendre la deuxième colonne d'une plage n'en contenant qu'une seule.

    De plus j'insiste à nouveau sur le fait que l'enregistreur de macro pourrait te donner la base du code, tu n 'aurais plus qu'a y insérer tes variables.

  7. #7
    Membre averti
    Inscrit en
    Octobre 2008
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 22
    Par défaut
    Merci pour vos conseils.

    J'ai donc inclus des ":" à la place des virgules et utilisé l'enregistreur de macros pour trouver la solution.

    La suppression de doublons fonctionne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Sub doublons()
    'suppression des doublons
     
    LigneFin = Sheets(OngletAccord).Range(CodAccord & Rows.Count).End(xlUp).Row
     
    Worksheets(OngletAccord).Range(CodAccord & lideb & ":$aa" & LigneFin).RemoveDuplicates Columns:=Array(1, 2), _
        Header:=xlYes
     
    End Sub
    J'ai aussi retiré en tête de module la ligne suivante qui générait une erreur :
    Par contre, il me manque le message où j'indique à l'utilisateur à quelle ligne existait les doublons :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    MsgBox "L'accord " & Valeur_Cherchee & " indice " & Indice_Objet_Encours & " existe déjà à la ligne " _
                            & AdresseTrouvee & "." & Chr(10) & Chr(10) & "Il va être supprimé."
    Est-ce possible avec RemoveDuplicates d'afficher le message avec les lignes où existaient les doublons ?

    Merci pour vos réponses.

  8. #8
    Expert éminent Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Par défaut
    Citation Envoyé par fred792 Voir le message
    Est-ce possible avec RemoveDuplicates d'afficher le message avec les lignes où existaient les doublons ?
    Non.
    RemoveDuplicate est un rouleau compresseur : efficace mais peu subtile.

    Si tu veux demander l'avis de l'utilisateur avant la suppression, tu peux faire une petite mise en forme conditionnelle qui signale les doublons en rouge.
    Ceci peut bien sûr être fait également en VBA et, là encore, le judicieux conseil de halaster08 ( ) s'applique : l'enregistreur automatique de macro te fournira 80% du code en quelques clics.

    Perso, je ne m'em...de pas à faire une macro pour ce type d'application.
    En supposant que tes données soient en colonne A et B et commencent en ligne 2, le mettrais en C2 la formule :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    =NB.SI.ENS(A$2:A2;A2;B$2:B2;B2)
    Tu copies cette cellule sur toutes les lignes.
    Tu fais un "copier / coller valeurs" sur la colonne C pour figer les valeurs : toutes les lignes de doubles seront celles qui ont 2 ou plus en colonne C.
    Tu fais un tri en utilisant la colonne C comme clé et tu pourras les supprimer toutes d'un coup.

    C'est certainement plus rapide à faire qu'une macro.

Discussions similaires

  1. [XL-2016] suppression des doublons dans deux colonnes
    Par yobor dans le forum Macros et VBA Excel
    Réponses: 9
    Dernier message: 15/08/2016, 02h55
  2. [XL-2010] Suppression de doublons sur deux colonnes via VBA
    Par Instinct dans le forum Macros et VBA Excel
    Réponses: 38
    Dernier message: 18/02/2016, 15h56
  3. Suppression doublon dans une colonne après consolidation fichiers
    Par Gigelle dans le forum Macros et VBA Excel
    Réponses: 16
    Dernier message: 04/12/2013, 13h53
  4. [XL-2007] Interdire doublons dans deux colonnes
    Par apdf1 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 03/12/2011, 16h32
  5. [EXCEL] Mise en évidence des doublons dans une colonne
    Par dacid dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 30/10/2006, 19h14

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