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 de doublons sur deux colonnes via VBA [XL-2010]


Sujet :

Macros et VBA Excel

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Technicien réseaux et télécoms
    Inscrit en
    Février 2016
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Technicien réseaux et télécoms

    Informations forums :
    Inscription : Février 2016
    Messages : 6
    Par défaut Suppression de doublons sur deux colonnes via VBA
    Bonjour,

    Je dois créer un module excel permettant de supprimer les doublons sur deux colonnes afin de pouvoir ensuite extraire les deux colonnes sans doublons. Mon soucis repose sur la suppression des doublons. Je ne connais pas du tout le VBA et ai suivi les tutoriels d'un site en ligne pour apprendre les bases, j'espère que mon code ne piquera pas trop les yeux ...
    A savoir : les valeurs de ma première colonne sont sur N et les valeurs de la seconde sont sur M, toutes mes valeurs commencent à la ligne 2 et peuvent aller jusqu'à 150 approximativement.

    Voici mon code :

    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
    Sub doublon()
     
    i = 2
     
    While i < 150
     
    If Range("M2").Value = Range("N" & i).Value Then
     
    Range("M2").Delete
    Range("N" & i).Delete
    i = 2
     
    End If
     
    Wend
     
    End Sub
    L'algorythme que j'ai voulu appliqué :

    On teste la valeur de la case M2 avec toutes les valeurs des cases Ni (avec i commençant à 2), si on trouve une correspondance, il y a suppression des deux cases, sinon on passe à i+1. Vu que la valeur de la cellule M2 a été supprimée, une nouvelle valeur à tester a pris sa place donc réinitialisation de i à 2.
    Le code fonctionne quand deux valeurs identiques sont l'une en face de l'autre, mais quand il faut commencer à chercher une valeur plus loin dans la colonne N, le module mouline dans le vide, je dois arrêter le process et le débogage pointe la ligne "End if".

    Pour tester le code j'ai tapé quelques valeurs dans les deux colonnes :
    10 10
    12 12
    15 5
    22 105
    5 100
    7 15
    Tout se passe bien pour les 10 et les 12, mais le programme bug sur le 15.

    J'espère avoir bien résumé mon problème, merci d'avance pour vos réponses !!

    P.S. : N'hésitez pas à me poser des questions, je reste disponible.
      0  0

  2. #2
    Membre très actif
    Homme Profil pro
    Analyste programmeur
    Inscrit en
    Mai 2014
    Messages
    393
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Analyste programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2014
    Messages : 393
    Par défaut
    Il te faut tout simplement une boucle imbriquée dans ta première boucle, voici l'algorithme :

    Pour i allant de Début à Fin
    ____Récupère ValeurAI de la Colonne A, Ligne i
    ____Pour j allant de Début à Fin
    ________Récupère ValeurBJ de Colonne B, Ligne i
    ________Si ValeurAI = BJ alors
    __________Supprimer ValeurBJ
    ________Fin Si
    ____Next j
    Next i
      0  1

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Technicien réseaux et télécoms
    Inscrit en
    Février 2016
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Technicien réseaux et télécoms

    Informations forums :
    Inscription : Février 2016
    Messages : 6
    Par défaut
    Tout d'abord merci de ta réponse !

    Voici le code que j'ai tapé en suivant l'algorithme (le code est à applique à des suites des lettres et de chiffres, je ne sais pas si ça a un réél impact mais je préfère préciser au cas où...) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Sub doublon2()
     
    For i = 2 To 100
        ValeurMI = Range("M" & i).Value
        For j = 2 To 100
            ValeurNJ = Range("N" & j).Value
            If ValeurMI = ValeurNJ Then
                Range("M" & i).Delete
                Range("N" & j).Delete
            End If
        Next j
    Next i
     
    End Sub
    Le code ne supprime pas tous les doublons et fini en boucle infinie, une idée ?

    J'ai testé sur cette séquence :
    10 10
    12 12
    15 5
    22 105
    5 100
    7 15

    Et il reste :
    12 12
    22 105
    7 100

    Quand j'essaie sur la vraie liste d'une centaine de lignes, il n'y quasiment aucune suppression de doublon, avant que le programme se mette à mouliner dans le vide.
      0  0

  4. #4
    Membre très actif
    Homme Profil pro
    Analyste programmeur
    Inscrit en
    Mai 2014
    Messages
    393
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Analyste programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2014
    Messages : 393
    Par défaut
    Oui, tu n'as pas fait totalement attention à ce que j'ai noté :
    Il ne faut supprimer que la valeur d'une seule colonne. Sinon forcément tu te retrouves avec une cellule vide dans chaque colonne, et du coup tu boucles à l'infini.

    En un peu plus performant, tu peux décaler les cellules vers le haut plutôt que faire une suppression, ce qui t'évites les cellules vides. Mais attention à ne pas dépasser le nombre de valeurs.
      0  0

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Technicien réseaux et télécoms
    Inscrit en
    Février 2016
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Technicien réseaux et télécoms

    Informations forums :
    Inscription : Février 2016
    Messages : 6
    Par défaut
    Je pense que j'ai mal exprimé mon problème, toutes mes excuses. Mon but est en fait de supprimer les valeurs égales non seulement sur une mais sur les deux colonnes, car normalement, après le programme il ne reste plus que deux colonnes desquelles on a "purgé" toutes les valeurs qui se retrouvaient auparavant dans les deux colonnes. Encore merci pour ton aide et la rapidité de tes réponses !!
      0  0

  6. #6
    Expert éminent
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Par défaut
    Bonjour, bonjour !

    Citation Envoyé par Instinct Voir le message
    Je dois créer un module excel permettant de supprimer les doublons sur deux colonnes afin de pouvoir ensuite extraire les deux colonnes sans doublons.
    La suppression dans les colonnes sources est donc tout à fait inutile ‼

    Soit l'utilisation du B-A-BA d'Excel pour un dictionnaire interne
    comme par exemple via la fonction de feuille de calculs EQUIV (Match en VBA) et une variable tableau;
    soit l'utilisation d'un dictionnaire externe, voir l'aide VBA de l'objet Dictionary et les exemples de ce forum …

    Ou encore recopie de chaque colonne dans une colonne unique puis utilisation de la méthode RemoveDuplicates

    ______________________________________________________________________________________________________
    Je suis Paris, Charlie, …
      1  1

  7. #7
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    ceci dit tu peux toujours utiliser la méthode Highlander que je n'essai plus de vendre aux internaute du forum!
      0  0

  8. #8
    Membre très actif
    Homme Profil pro
    Analyste programmeur
    Inscrit en
    Mai 2014
    Messages
    393
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Analyste programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2014
    Messages : 393
    Par défaut
    Citation Envoyé par Instinct Voir le message
    Je pense que j'ai mal exprimé mon problème, toutes mes excuses. Mon but est en fait de supprimer les valeurs égales non seulement sur une mais sur les deux colonnes, car normalement, après le programme il ne reste plus que deux colonnes desquelles on a "purgé" toutes les valeurs qui se retrouvaient auparavant dans les deux colonnes. Encore merci pour ton aide et la rapidité de tes réponses !!
    Une question alors :
    Peux-tu avoir la même valeur plusieurs fois dans une même colonne? Si oui, comment cela doit-il être pris en compte?
      0  0

  9. #9
    Nouveau membre du Club
    Homme Profil pro
    Technicien réseaux et télécoms
    Inscrit en
    Février 2016
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Technicien réseaux et télécoms

    Informations forums :
    Inscription : Février 2016
    Messages : 6
    Par défaut
    Non il ne peut pas y avoir deux fois la même valeur dans une même colonne.

    Mettons deux colonnes :

    25 10
    5 12
    20 5
    2 3
    10 25

    Le résultat doit être :

    20 12
    2 3

    Si une valeur est à gauche ET à droite elle doit être supprimée à gauche ET à droite.

    Voici ce que j'ai pour le moment qui marche presque comme je voudrais mais qui fini en débogage :

    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
    Sub doublon3()
     
    For i = 2 To 100
     
    For j = 2 To 100
     
    If Range("M" & i).Value = Range("N" & j).Value Then
     
    Range("M" & i).Delete
    Range("N" & j).Delete
    'Je pense que la redéfinition de i et j sont à revoir, j'essaie de prendre en compte la suppression des colonnes afin de rester logique
    i = 1
    j = 2 
     
    End If
     
    Next i
     
    Next j
     
    End Sub
    @Marc-L : Désolé mais je dois absolument utiliser VBA en Excel dans le cadre de mon projet... merci tout de même de ta réponse !

    Je ne répondrais plus avant demain matin, mais n'hésitez pas si vous avez des idées, merci beaucoup pour l'aide c'est la première fois que je viens sur ce forum, je reviendrais
      0  0

  10. #10
    Membre très actif
    Homme Profil pro
    Analyste programmeur
    Inscrit en
    Mai 2014
    Messages
    393
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Analyste programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2014
    Messages : 393
    Par défaut
    Essaye avec ça (N'oublie pas de change ton workbook, ta feuille, et tes colonnes)

    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
     
    Public Sub doublons()
        Dim i As Integer, j As Integer
        Dim lignesM As Integer, lignesN As Integer
        Dim valeur As Integer
        Dim trouve As Boolean
     
        With ThisWorkbook.Sheets(1)
     
            lignesM = .Range("M1").End(xlDown).Row
            lignesN = .Range("N1").End(xlDown).Row
     
            i = 1
            While i <= lignesM
                j = 1
                trouve = False
                valeur = .Range("M" & i).Value
                While j <= lignesN
                    If (valeur = .Range("N" & j).Value) Then
                        trouve = True
                        .Range("M" & i).Delete Shift:=xlUp
                        .Range("N" & j).Delete Shift:=xlUp
                        lignesM = lignesM - 1
                        lignesN = lignesN - 1
                    Else
                        j = j + 1
                    End If
                Wend
                If (Not trouve) Then
                    i = i + 1
                End If
            Wend
        End With
    End Sub
      0  1

  11. #11
    Nouveau membre du Club
    Homme Profil pro
    Technicien réseaux et télécoms
    Inscrit en
    Février 2016
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Technicien réseaux et télécoms

    Informations forums :
    Inscription : Février 2016
    Messages : 6
    Par défaut
    Bonjour !!

    J'ai essayé ton code, il marche très bien, malgré le fait qu'il remonte le tout d'une cellule, ce qui se règle assez facilement. Merci beaucoup de ton aide !!

    J'avais trouvé une autre solution qui fonctionne en cherchant un peu hier soir grâce à nos échanges de posts, mais à la fin du tri, le programme mouline dans le vide... Si tu as le courage et que tu veux bien regarder pourquoi il me fait ça, ça serait super sympa, mais à toi de voir, c'est surtout pour satisfaire ma curiosité Mais sinon de toutes façons je vais essayer de comprendre ton code et je le garde, c'est plus "propre" que ce que j'ai fait !

    Mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Sub doublon()
     
    For i = 2 To 100
        For j = 2 To 100
            If Range("M" & i).Value = Range("N" & j).Value Then
                Range("M" & i).Delete
                Range("N" & j).Delete
                i = 2
                j = 1
            End If
        Next j
    Next i
     
    End Sub
    Encore merci pour ton aide !!! J'attends ta réponse pour clore le sujet en "Résolu".
      0  0

  12. #12
    Expert éminent
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Par défaut
    Citation Envoyé par Instinct Voir le message
    @Marc-L : Désolé mais je dois absolument utiliser VBA en Excel dans le cadre de mon projet...
    C'est exactement mon propos, à relire donc !
      1  1

  13. #13
    Membre très actif
    Homme Profil pro
    Analyste programmeur
    Inscrit en
    Mai 2014
    Messages
    393
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Analyste programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2014
    Messages : 393
    Par défaut
    Citation Envoyé par Instinct Voir le message
    Bonjour !!

    J'ai essayé ton code, il marche très bien, malgré le fait qu'il remonte le tout d'une cellule, ce qui se règle assez facilement. Merci beaucoup de ton aide !!

    J'avais trouvé une autre solution qui fonctionne en cherchant un peu hier soir grâce à nos échanges de posts, mais à la fin du tri, le programme mouline dans le vide... Si tu as le courage et que tu veux bien regarder pourquoi il me fait ça, ça serait super sympa, mais à toi de voir, c'est surtout pour satisfaire ma curiosité Mais sinon de toutes façons je vais essayer de comprendre ton code et je le garde, c'est plus "propre" que ce que j'ai fait !

    Mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Sub doublon()
     
    For i = 2 To 100
        For j = 2 To 100
            If Range("M" & i).Value = Range("N" & j).Value Then
                Range("M" & i).Delete
                Range("N" & j).Delete
                i = 2
                j = 1
            End If
        Next j
    Next i
     
    End Sub
    Encore merci pour ton aide !!! J'attends ta réponse pour clore le sujet en "Résolu".
    Tout d'abord, voici mon code précédent auquel j'ai ajouté des commentaires pour aider à la compréhension :
    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
     
    Public Sub doublons()
    ''''''''''''''''''''Déclaration des variables
        Dim i As Integer, j As Integer
        Dim lignesM As Integer, lignesN As Integer
        Dim valeur As Integer
        Dim trouve As Boolean
    '''''''''''''''''''''''
     
        With ThisWorkbook.Sheets(1) 'Sélection du classeur et de la feuille
     
            lignesM = .Range("M1").End(xlDown).Row '''''''Compte le nombre de lignes remplies dans la colonne M (compte les cellules remplies en allant vers le bas, s'arrête à la première cellule vide)
            lignesN = .Range("N1").End(xlDown).Row '''''''Idem que pour la colonne M
     
            i = 1 'initialisation pour le parcours de la colonne M
            While i <= lignesM   '''''''Parcours de la Colonne M, allant de la ligne M1 la dernière ligne (comprise) de M selon le calcul précédent
                j = 1                   '''''''Initialisation de j à chaque changement de ligne dans M
                trouve = False     '''''''Initialisation de trouve, qui indiquera le passage à la ligne suivante ou non
                valeur = .Range("M" & i).Value  '''''On récupère la valeur de MI
                While ((j <= lignesN) & (trouve = false))      ''''''''''''Parcours de la colonne N selon le même principe que pour M
                    If (valeur = .Range("N" & j).Value) Then '''''''Si la valeur dans M est identique à la valeur de N
                        trouve = True                '''''''On a trouvé, donc on n'incrémentera pas i, et on sort de la boucle j
                        .Range("M" & i).Delete Shift:=xlUp     '''''''On supprime la cellule de M en décalant toutes les cellules vers le haut
                        .Range("N" & j).Delete Shift:=xlUp     '''''''Idem pour N
                        lignesM = lignesM - 1      '''''''Le nombre de lignes dans la colonne M en contient une de moins, donc on évite de boucler en surplus
                        lignesN = lignesN - 1      '''''''''Idem
                    Else               ''''''''Si les valeurs ne sont pas identiques
                        j = j + 1    '''''''On passe à la ligne suivante de la colonne N
                    End If
                Wend    '''''''''Fin du parcours de la colonne N
                If (Not trouve) Then    ''''''Si on a trouvé 2 valeurs identiques, comme on supprime en décalant vers le haut, la valeur suivante a pris la place de celle que l'on vient de supprimer, du coup, on ne passe à la ligne suivante que s'il n'y avait pas de doublon
                    i = i + 1
                End If
            Wend   ''''''Fin du parcours de la colonne M
        End With
    End Sub
    Ensuite, dans ton code, tu parcours 100 lignes, imagine que tu aies 50 doublons, tu auras donc cellules vides dans ta colonne N. Si ta colonne M ne contient pas 99 valeurs, alors tu vas te retrouver à supprimer des cellules vides, ce qui va causer un ralentissement.
    En plus de cela, si tu n'as pas de doublon dans une même colonne, tu n'as jamais besoin de réinitialiser i, parcourir une seule fois complétement ta colonne M est suffisant. Tu peux également passer directement à la prochaine valeur de M dès que tu trouves un doublon, sans oublier de réinitialiser ta boucle sur N.

    Tu as également un problème, tu réinitialises tes deux variables (i et j) dans ta boucle utilisant j. Du coup, 2 choses qui ralentissent beaucoup :
    - Chaque fois que tu trouves un doublon, tu recommences toute ta recherche de doublon depuis le début.
    - Chaque fois que tu trouves un doublon, tu recommences tout ton parcours de la colonne N depuis le début.

    Ton code devrait donc plus ressembler à ça :

    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
     
    Sub doublon()
        Dim i As Integer, j As Integer
     
        With ThisWorkbook.Sheets(1)    '''''Je te conseille de laisser cette partie, ça facilite les changements de référence
            For i = 2 To 100                '''''C'est avant de parcourir la colonne N que tu dois initialiser ta variable j
                If (.Range("M" & i) <> "") Then    '''''Si ta celulle n'est pas vide, alors tu cherches les doublons
                    For j = 2 To 100 ''''Parcours de la colonne N
                        If (.Range("M" & i).Value = .Range("N" & j).Value) Then ''''S'il y a un doublon
                            .Range("M" & i).Value = ""  '''''On vide la cellule dans M (La supprimer ferait remonter la colonne vers le haut)
                            .Range("N" & j).Value = ""  '''''Idem
                            j = 222                   '''''Il est préférable de donner une valeur supérieur pour sortir de la boucle, sinon il faut utiliser un while avec ton compteur j et une condition supplémentaire en booléen
                        End If
                    Next j
                End If
            Next i
        End With
    End Sub
      0  1

  14. #14
    Membre très actif
    Homme Profil pro
    Analyste programmeur
    Inscrit en
    Mai 2014
    Messages
    393
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Analyste programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2014
    Messages : 393
    Par défaut
    Voilà sinon mon programme, sans décaler les cellules vers le haut (c'est-à-dire que cette fois il remplace les doublons pas des cellules vides)

    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
     
    Public Sub doublons()
    ''''''''''''''''''''Déclaration des variables
        Dim i As Integer, j As Integer
        Dim lignesM As Integer, lignesN As Integer
        Dim valeur As Integer
        Dim trouve As Boolean
    '''''''''''''''''''''''
     
        With ThisWorkbook.Sheets(1) 'Sélection du classeur et de la feuille
     
            lignesM = .Range("M1").End(xlDown).Row '''''''Compte le nombre de lignes remplies dans la colonne M (compte les cellules remplies en allant vers le bas, s'arrête à la première cellule vide)
            lignesN = .Range("N1").End(xlDown).Row '''''''Idem que pour la colonne M
     
            i = 1 'initialisation pour le parcours de la colonne M
            While i <= lignesM   '''''''Parcours de la Colonne M, allant de la ligne M1 la dernière ligne (comprise) de M selon le calcul précédent
                j = 1                   '''''''Initialisation de j à chaque changement de ligne dans M
                trouve = False     '''''''Initialisation de trouve, qui indiquera le passage à la ligne suivante ou non
                valeur = .Range("M" & i).Value  '''''On récupère la valeur de MI
                While ( (j <= lignesN) & (trouve=false))  ''''''''''''Parcours de la colonne N selon le même principe que pour M
                    If (valeur = .Range("N" & j).Value) Then '''''''Si la valeur dans M est identique à la valeur de N
                        trouve = True                '''''''On a trouvé, donc on n'incrémentera pas i
                        .Range("M" & i).value = ""     '''''''On vide la cellule de la colonne M
                        .Range("N" & j).value = ""     '''''''Idem pour N
                    Else               ''''''''Si les valeurs ne sont pas identiques
                        j = j + 1    '''''''On passe à la ligne suivante de la colonne N
                    End If
                Wend    '''''''''Fin du parcours de la colonne N
                If (Not trouve) Then    ''''''Si on a trouvé 2 valeurs identiques, comme on supprime en décalant vers le haut, la valeur suivante a pris la place de celle que l'on vient de supprimer, du coup, on ne passe à la ligne suivante que s'il n'y avait pas de doublon
                    i = i + 1
                End If
            Wend   ''''''Fin du parcours de la colonne M
        End With
    End Sub
      0  1

  15. #15
    Expert éminent
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Par défaut
    Citation Envoyé par Instinct Voir le message
    […] supprimer les doublons sur deux colonnes afin de pouvoir ensuite extraire les deux colonnes sans doublons. Mon soucis repose sur la suppression des doublons. […] j'espère que mon code ne piquera pas trop les yeux ...
    A savoir : les valeurs de ma première colonne sont sur N et les valeurs de la seconde sont sur M, toutes mes valeurs commencent à la ligne 2 et peuvent aller jusqu'à 150 approximativement.
    Ce qui pique les yeux, c'est déjà la logique de l'explication, l'à peu près, voire même contradictoire !
    Cela demande une présentation initiale claire et exhaustive !

    Normal la lenteur car y-a-il vraiment besoin de supprimer les doublons dans la source pour les extraire ?
    La réponse est non si la destination n'est pas la plage d'origine !
    Au passage, les extraire vers où ?‼ Quel est le but, c'est pour quoi faire ?! Ce serait vraiment utile pour optimiser …

    La première colonne est la N, la seconde est la M ? Ben non c'est le contraire dans l'ordre de l'alphabet !
    Du reste si l'ordre compte, là encore aucune information précise …

    Il n'y aurait donc pas de doublon (sans s comme il n'y en a pas !) par colonne …
    Mais y-a-t-il toujours le même nombre d'éléments dans chaque colonne, vont-ils par paires ?
    Ou par exemple peut-il y avoir 5 nombres dans une colonne et 9 dans l'autre ?

    Bref, avec une présentation enfin digne de ce nom, aucun souci pour proposer une solution efficiente, (*)
    surtout que c'est le genre d'exercice que l'on donne à un niveau débutant, aucune difficulté particulière,
    d'autant plus si sont utilisées des fonctionnalités d'Excel, même en VBA …

    (*) Je vois plusieurs boucles ainsi que plusieurs tests dans le code précédent or
    un seul test au sein d'une boucle unique est nécessaire, donc forcément plus rapide …
      1  1

  16. #16
    Expert éminent
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Par défaut
    Citation Envoyé par Instinct Voir le message
    Mettons deux colonnes :

    25 10
    5 12
    20 5
    2 3
    10 25

    Le résultat doit être :

    20 12
    2 3
    Avec le B-A-BA d'Excel, réalisable en moins de 20 lignes de code …
      1  1

  17. #17
    Membre très actif
    Homme Profil pro
    Analyste programmeur
    Inscrit en
    Mai 2014
    Messages
    393
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Analyste programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2014
    Messages : 393
    Par défaut
    Citation Envoyé par Marc-L Voir le message
    Avec le B-A-BA d'Excel, réalisable en moins de 20 lignes de code …
    Et si tu lisais la totalité des messages de ce topic, tu aurais remarqué que parmi les solutions proposées, il y en a une en particulier qui fait moins de 20 lignes de code. Ensuite, tout dépend de la complexité de la recherche de doublons (unicité des valeurs dans une colonne, dans une ligne, ...), et du fait d'être sur des tailles fixes ou dynamiques. D'où mon code personnel un adaptable à toute taille.
      0  2

  18. #18
    Expert éminent
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Par défaut
    Citation Envoyé par jeanmidudu Voir le message
    il y en a une en particulier qui fait moins de 20 lignes de code
    Oui mais avec deux boucles, c'est réalisable avec une seule et peut-être même sans mais je n'ai pas eu le temps de chercher …


    Citation Envoyé par jeanmidudu Voir le message
    Ensuite, tout dépend de la complexité de la recherche de doublons (unicité des valeurs dans une colonne, dans une ligne, ...), et du fait d'être sur des tailles fixes ou dynamiques. D'où mon code personnel un adaptable à toute taille.
    Si tu lisais les posts du demandeur, pas de doublon au sein d'une colonne …

    En attendant une clarification du demandeur, mes démonstrations se basant sur des plages variables :
    • une comme un débutant avec le B-A-BA d'Excel avec une boucle et deux tests, deux lignes de code au sein de la boucle
    • une seconde toujours avec la même fonction d'Excel mais optimisé côté VBA (fonction et utilisation de variables tableau)
    avec une boucle et au sein de la boucle un test unique et deux lignes de code …

    Ce qui compte ce n'est pas vraiment la compacité du code (quoique) mais la logique et son efficacité.
    C'est dommage d'additionner des boucles alors qu'il existe diverses fonctions de feuille de calculs d'Excel
    utilisables donc en VBA contrôlant l'existence d'une donnée dans une plage et donc sans boucle !

    Si par contre il pouvait y avoir des doublons au sein d'une colonne, j'utiliserais une troisième voie
    comme déjà évoquée via des dictionnaires, soit interne (toujours via le B-A-BA d'Excel) soit externe (objet Dictionary) …
      1  1

  19. #19
    Membre très actif
    Homme Profil pro
    Analyste programmeur
    Inscrit en
    Mai 2014
    Messages
    393
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Analyste programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2014
    Messages : 393
    Par défaut
    [QUOTE=Marc-L;8534870]
    Oui mais avec deux boucles, c'est réalisable avec une seule et peut-être même sans mais je n'ai pas eu le temps de chercher …

    Si tu lisais les posts du demandeur, pas de doublon au sein d'une colonne …
    Exactement, j'ai fait cette erreur en premier lieu, suite à quoi le demandeur s'est expliqué TRES CLAIREMENT, et la suite de la discussion ne contient que des éléments prenant en compte cette consigne.

    En attendant une clarification du demandeur, mes démonstrations se basant sur des plages variables :
    Le demandeur a parfaitement éclairci la situation (en 2 fois certes, mais tout est clair). Mais il semblerait que tu ne lises pas les messages.

    une comme un débutant avec le B-A-BA d'Excel avec une boucle et deux tests, deux lignes de code au sein de la boucle
    Il est absolument impossible de comparer une ligne d'une colonne avec toutes les lignes d'une autre colonne en une seule boucle. Dès lors que l'on travaille sur x colonnes, il faut 2^(X-1) boucles de parcours pour trouver chaque correspondance.

    une seconde toujours avec la même fonction d'Excel mais optimisé côté VBA (fonction et utilisation de variables tableau)
    avec une boucle et au sein de la boucle un test unique et deux lignes de code …
    Trois choses qui ne vont pas cette fois :
    1) D'après le demandeur, tout doit être fait via VBA, c'est-à-dire (selon mon interprétation, je te l'accorde) pas d'utilisation des fonctions Excel
    2) L'utilisation de variables tableau alourdiraient considérablement le programme pour une utilisation futile, puisqu'il n'y a qu'une seule valeur tout au plus à stocker (il est même possible de ne pas stocker la moindre valeur)
    3)Même chose que précédemment il faut un minimum de 2^(X-1) boucles pour en parcourir la totalité, avec X = nombre de colonnes à parcourir

    Ce qui compte ce n'est pas vraiment la compacité du code (quoique) mais la logique et son efficacité.
    Exactement ce que je disais, deux codes ont été présentés : un optimisé pour une utilisation avec des colonnes de taille fixe, et un optimisé pour une utilisation avec des colonnes de taille variable. La compacité du code à dimensions variables pourrait cependant ici être améliorée, je te l'accorde.

    C'est dommage d'additionner des boucles alors qu'il existe diverses fonctions de feuille de calculs d'Excel
    utilisables donc en VBA contrôlant l'existence d'une donnée dans une plage et donc sans boucle !
    Si l'utilisation de fonctions Excel était "autorisé", il suffirait d'utiliser la suppression de doublons proposée dans Excel (même par macro, il suffirait d'utiliser l'enregistreur de macro pour l'avoir de façon automatique)

    [quote]Si par contre il pouvait y avoir des doublons au sein d'une colonne, j'utiliserais une troisième voie
    comme déjà évoquée via des dictionnaires, soit interne (toujours via le B-A-BA d'Excel) soit externe (objet Dictionary) …[quote]
    Solution EXTREMEMENT LOURDRE POUR PAS GRAND CHOSE! Qui plus est l'utilisation de dictionnaires est limité dans les capacités de ceux-ci, or l'utilisateur est tout à fait capable de définir de nouveaux éléments qui ne seraient pas inclus. A EVITER ABSOLUMENT.

    Ce que je peux dire à ce moment, c'est que :
    1) 2 solutions fonctionnelles, de code VBA PUR (sans utilisation de fonctions Excel), et optimisées au maximum ont été proposées.
    2) Tu ne lis pas les topics en entier, ni les réponses de façon complète
    3) Tu ne vérifies pas tes informations avant de proposer des solutions.
    4) Tu ne prends pas en compte les réponses proposées par autrui

    Cordialement,
      1  1

  20. #20
    Expert éminent
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Par défaut

    Je réponds dans l'ordre du message précédent …

    • Désolé mais pas clair du tout ! Par exemple si extraire veut dire laisser les données sur place, bonjour ! …
    Le demandeur a juste précisé « VBA en Excel », cela n'ampute donc pas les fonctions, sinon ce serait tellement idiot ‼

    A part pour un exercice d'étudiant en FAC, c'est idiot d'effectuer un code en VBA "pur"
    car le VBA interprété est souvent bien plus long que les fonctions déjà compilées !
    Comme le demandeur est un technicien réseau, pourquoi devrait-il se limiter ?
    Et n'étant pas sûr qu'il ait bien compris ma réponse du post 6 …

    Donc non seulement il est possible en VBA de comparer avec une seule boucle et
    comme je viens de le tester, il est aussi possible de l'effectuer sans boucle en dix lignes de code
    mais là il faut connaître un tant soit peu Excel et le VBA ! …

    • L'utilisation de variables tableau évite une seconde boucle et accélère donc le traitement.
    Cependant avec seulement 150 lignes à traiter, la différence est peu sensible, je te l'accorde …

    • La suppression des doublons - que j'avais déjà évoquée ! - n'est pas une fonction de feuilles de calculs,
    c'est une fonctionnalité accessible depuis Excel et est donc une méthode faisant partie du VBA,
    j'ai l'impression que tu te perds en confusion …

    • Les dictionnaires ne sont pas lourds et sont extrêmement véloces !
    Pour 150 lignes, là encore peu de différence mais avec des milliers de lignes, l'écart serait en secondes !
    Ils n'ont pas de limite vis à vis du besoin exposé, pour ce que j'ai pu comprendre de ta phrase car,
    même avec de nouveaux éléments, ils seraient bien évidemment inclus dans les dictionnaires !
    Évite-les juste si tu ne les maîtrises pas …

    On arrête là en attendant des éclaircissements du demandeur.
      2  1

Discussion fermée
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. [AC-2003] Condition de NON doublon sur deux colonnes de facon simultanee :
    Par Bonero dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 26/01/2012, 14h28
  2. [XL-2007] Doublons sur deux feuilles avec 26 colonnes chacunes
    Par jimmycamelon dans le forum Macros et VBA Excel
    Réponses: 9
    Dernier message: 04/03/2011, 16h56
  3. excel vba condition sur deux colonnes
    Par Thibautrives dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 13/05/2008, 15h12
  4. [Débutant] doublon sur deux colonnes
    Par mephilith dans le forum Langage SQL
    Réponses: 8
    Dernier message: 28/01/2008, 19h28
  5. [CR] Faire un groupe sur deux colonnes, voir mon exemple
    Par Etienne51 dans le forum SAP Crystal Reports
    Réponses: 6
    Dernier message: 08/10/2004, 14h02

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