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 :

[EXCEL] Mise en évidence des doublons dans une colonne


Sujet :

Macros et VBA Excel

  1. #1
    Membre averti Avatar de dacid
    Homme Profil pro
    Inscrit en
    Juin 2003
    Messages
    1 064
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 064
    Points : 420
    Points
    420
    Par défaut [EXCEL] Mise en évidence des doublons dans une colonne
    Bonjour à tous,

    J'essaye désesperement de mettre en évidence tous les doublons d'une même colonne...

    J'ai, bien sur, essayé avec deux boucles for, mais mon fichier peut atteindre 60000 lignes et là, ça commence à être vraiment long...

    Je m'échine, depuis ce matin, à faire ça avec un find dans une boucle for mais je n'y arrive pas.

    Comment faire un find en ôtant la cellule actuelle ?

    Merci d'avance.
    David.

  2. #2
    Expert confirmé

    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 419
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 419
    Points : 4 297
    Points
    4 297
    Par défaut
    tu utilises deux colonnes supplémentaire
    la première ordre
    avec pour contenu=ligne()
    tu sélectionnes la colonne ordre édition copier édition collage spécial valeur
    tu peux désormais demander le tri de ta table sur la colonne dans laquelle tu cherches les doublons
    dans la deuxième colonne nommé nbdoubl
    tu places 1 dans la première cellule
    dans la seconde tu tapes la formule =SI(A6=A5;C5+1;1)
    qui va augmenter de 1 sur les doublons
    tu sélectionnes la colonne nbdoubl édition copier édition collage spécial valeur
    tu demandes le tri décroissant de nbdoul
    tu peux remettre tes champs en place à l'aide de ordre
    Elle est pas belle la vie ?

  3. #3
    Membre averti Avatar de dacid
    Homme Profil pro
    Inscrit en
    Juin 2003
    Messages
    1 064
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 064
    Points : 420
    Points
    420
    Par défaut
    Bonjour random,

    Merci pour ta réponse mais je n'ai pas la possibilité de faire des manips sur le fichier Excel, tout doit se faire en VBA.

    J'ai trouvé ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
        For i = 2 To nbLigne
            Set c = ActiveSheet.Range("I" + CStr(i + 1) + ":I" + CStr(nbLigne)).Find(what:=ActiveWorkbook.Sheets(1).Cells(i, 9).Value, LookIn:=xlValues)
            If Not c Is Nothing Then
               addErr "DOUBLON: Ligne:" + CStr(i) + " sur " + ActiveWorkbook.Sheets(1).Cells(i, 9).Value
            End If
        Next i
    Mais malheureusement, c'est encore trop long... Pas moyen d'optimiser ?
    David.

  4. #4
    Expert éminent sénior

    Homme Profil pro
    Inscrit en
    Août 2005
    Messages
    3 317
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2005
    Messages : 3 317
    Points : 20 144
    Points
    20 144
    Par défaut
    bonjour

    tu peux tester cette procédure qui liste les doublons et indique combien de fois ils apparaissent dans la colonne 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
    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
    Option Explicit
    Option Base 1
     
    Sub listeDoublons()
        Dim Plage As Range
        Dim Tableau(), Resultat() As String
        Dim i As Long, j As Long, m As Long
        Dim Un As Collection
        Dim Doublons As String
     
        Set Un = New Collection
        'La plage de cellules à tester
        Set Plage = Range("A1:A" & Range("A65536").End(xlUp).Row)
     
        Tableau = Plage.Value
        ReDim Preserve Resultat(2, 1)
     
        On Error Resume Next
        'boucle sur la plage à tester
        For i = 1 To Plage.Count
            'Utilise une collection pour rechercher les doublons
            '(les collections n'acceptent que des données uniques)
            Un.Add Tableau(i, 1), Tableau(i, 1)
     
            'S'il y a une erreur (donc presence d'un doublon)
            If Err <> 0 Then
     
                'boucle sur le tableau des doublons pour verifier s'il a deja
                'été identifié
                For j = 1 To m + 1
                    'Si oui , on  incrément le compteur
                    If Resultat(1, j) = Tableau(i, 1) Then
                        Resultat(2, j) = Resultat(2, j) + 1
                        Err.Clear
                        Exit For
                    End If
                Next j
     
                    'Si non, on ajoute le doublon dans le tableau
                    If Err <> 0 Then
                        Resultat(1, m + 1) = Tableau(i, 1)
                        Resultat(2, m + 1) = 1
     
                        m = m + 1
                        Err.Clear
                        ReDim Preserve Resultat(2, m + 1)
                    End If
            End If
        Next i
     
        '----- Affiche la liste er le nombre de doublons --------
        For j = 1 To m
            Doublons = Doublons & Resultat(1, j) & "-->" & _
                        Resultat(2, j) & vbCrLf
        Next j
     
        MsgBox Doublons
    End Sub

    il faudra bien sur l'adapter pour 60000 lignes ...


    michel

  5. #5
    Membre averti Avatar de dacid
    Homme Profil pro
    Inscrit en
    Juin 2003
    Messages
    1 064
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 064
    Points : 420
    Points
    420
    Par défaut
    Bonjour SilkyRoad,

    Je suis étonné de voir qu'il n'y a pas plus simple.

    C'est dommage que ta solution ne retourne pas le numéro de la ligne...
    J'ai réussi à faire quelque chose qui donne le même résultat que toi et qui est assez rapide:
    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
        ActiveWorkbook.Sheets(2).Range("A:A").Clear
        ActiveWorkbook.Sheets(1).Activate
        Cells(1).Activate
        nbLigne = ActiveCell.CurrentRegion.Rows.Count
        ActiveWorkbook.Sheets(1).Range("I2:I" + CStr(nbLigne)).Copy ActiveWorkbook.Sheets(2).Range("A1")
        ActiveWorkbook.Sheets(2).Range("A1").Sort Key1:=ActiveWorkbook.Sheets(2).Columns("A")
        ActiveWorkbook.Sheets(2).Activate
        nbErr = 0
        ReDim tabErr(10)
        For i = 1 To nbLigne
            str2 = ActiveSheet.Cells(i, 1).Value
            If str = str2 Then
               VIN_addErr "DOUBLON sur: " + str2
            End If
            str = str2
        Next i
    En fait, je copie et trie la colonne sur une autre feuille (un peu la réponse de random, mais en VBA).
    Je ne trouve pas ça très "propre", mais je n'ai pas mieux.
    David.

  6. #6
    Expert éminent sénior

    Homme Profil pro
    Inscrit en
    Août 2005
    Messages
    3 317
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2005
    Messages : 3 317
    Points : 20 144
    Points
    20 144
    Par défaut
    rebonjour

    Je suis étonné de voir qu'il n'y a pas plus simple.
    je n'ai pas prétendu que ma solution était la plus simple ...;o)


    C'est dommage que ta solution ne retourne pas le numéro de la ligne...
    Tu ne l'avais pas demandé...rien ne t'empèche de créer un tableau multidimensionnel pour intégrer les numéros de lignes ...



    michel

  7. #7
    Membre averti Avatar de dacid
    Homme Profil pro
    Inscrit en
    Juin 2003
    Messages
    1 064
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 064
    Points : 420
    Points
    420
    Par défaut
    Hummm, je croit que je vais garder ma solution.

    Utiliser les erreurs d'excel m'effraie un peu (changement de comportement selon les versions, ...).

    Peux tu juste me dire si mon code n'est pas trop "à coté" ?

    Merci encore.
    David.

  8. #8
    Expert éminent sénior

    Homme Profil pro
    Inscrit en
    Août 2005
    Messages
    3 317
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2005
    Messages : 3 317
    Points : 20 144
    Points
    20 144
    Par défaut
    rebonsoir

    La variable str est aussi le nom d'une fonction Excel:
    Il faut éviter d'utiliser les noms réservés dans les déclarations de variables


    Sinon, il n'y a pas de problème dans ta procédure.


    Voici une adaptation sans utiliser la sélection des feuilles (Les Select et Activate ralentissent considérablement les macros)
    Je ne suis pas sur que ça fonctionne avec Excel97


    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
    Dim Ws1 As Worksheet, Ws2 As Worksheet
     
        Set Ws1 = ActiveWorkbook.Sheets(1)
        Set Ws2 = ActiveWorkbook.Sheets(2)
     
        Ws2.Columns(1).Clear
     
        nbLigne = Ws1.Cells(1, 1).CurrentRegion.Rows.Count
        Ws1.Range("I2:I" & nbLigne).Copy Ws2.Range("A1")
     
        Ws2.Range("A1").Sort Key1:=Ws2.Columns("A")
     
        For i = 1 To nbLigne
            str2 = Ws2.Cells(i, 1).Value
            If StrX = str2 Then
               'VIN_addErr "DOUBLON sur: " & str2
            End If
            StrX = str2
        Next i
    bonne soirée
    michel

  9. #9
    Membre averti Avatar de dacid
    Homme Profil pro
    Inscrit en
    Juin 2003
    Messages
    1 064
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 064
    Points : 420
    Points
    420
    Par défaut
    Très bien, tes conseils me sont utiles...
    Je ne suis pas encore à l'aise avec VBA, je code un peu comme je parle.
    J'aime avoir un code propre et optimisé.

    Merci pour ton interêt.
    David.

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 12/03/2015, 11h46
  2. Réponses: 2
    Dernier message: 10/10/2013, 15h35
  3. [AC-2003] Gérer des doublons dans une importation Excel
    Par Perce le vent dans le forum Modélisation
    Réponses: 3
    Dernier message: 19/08/2009, 18h59
  4. [Collections]Supprimer des doublons dans une ArrayList
    Par emie31 dans le forum Collection et Stream
    Réponses: 3
    Dernier message: 12/12/2005, 15h15
  5. Eliminer des Doublon dans une Table
    Par Soulama dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 03/02/2005, 14h27

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