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 :

Contrôle des doublons sur plusieurs feuilles, puis suppression [XL-2003]


Sujet :

Macros et VBA Excel

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    salarié
    Inscrit en
    Janvier 2013
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : salarié
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2013
    Messages : 24
    Points : 26
    Points
    26
    Par défaut Contrôle des doublons sur plusieurs feuilles, puis suppression
    Bonjour,

    Toujours grand débutant dans le "codage", je viens vers vous avec une nouvelle question.

    J'ai plusieurs feuilles dans un même classeur, issues de trois documents différents.
    Je souhaiterai trouver des doublons entre les feuilles, et supprimer les doublons.
    Pour celà, je me base sur la colonne C, contenant un identifiant à 9 chiffres.

    Dans mon idéal, celà donnerait :

    1 identifier les doublons entre feuilles
    2 supprimer les dits doublons des feuilles 2 et 3

    J'ai vu plusieurs méthodes de recherches, et je me perds dès qu'il s'agit de comparer une liste d'une feuille avec une autre.

    Y a-t-il une solution ?
    Toute aide est la bienvenue, mes collègues attendant actuellement à proximité de mon bureau, dans cette posture :

    Je cherche à automatiser cette opération car la fréquence est bi-mensuelle.

    Cordialement, Jérôme D

  2. #2
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 379
    Points : 12 075
    Points
    12 075
    Billets dans le blog
    8
    Par défaut heu...
    bonjour

    pour comparer les doublons présents sur deux feuille tu pourrais utiliser
    les dictionnaires avec des variables tableaux

    tu a plusieurs sujet ouvert voir résolu sur la question

    tout d'abord dois tu supprimer les doublons présents sur la meme feuille ou pas ?
    ou simplement les doublons identiques sur les deux feuilles ?

    au plaisir
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  3. #3
    Invité
    Invité(e)
    Par défaut Contrôle des doublons sur plusieurs feuilles, puis suppression
    Bonsoir,
    Tu veux une occurrence unique de valeur dans tout le classeur ?
    J’ai proposé a plusieurs reprise la Méthode Highlander (il ne peut en rester qu'un), elle est terriblement efficace et peut s’adapter à toutes sorte de problématiques, mais j’ai besoin d’être sur du résultat recherché.

  4. #4
    Nouveau membre du Club
    Homme Profil pro
    salarié
    Inscrit en
    Janvier 2013
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : salarié
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2013
    Messages : 24
    Points : 26
    Points
    26
    Par défaut
    Bonsoir,

    Merci pour vos réponses ; je pense creuser la solution du dictionnaire pour voir ce que je peux en sortir pour ma culture générale.

    Effectivement, il ne peut en rester qu'un, celui de la feuille 1.
    Pour affiner encore, je dirai que si un doublon venait à apparaître entée la feuille 2 et la feuille 3, automatiquement celui de la feuille 3 devrait être supprimé.

    Pour précision, il s'agit de tableaux générés par extraction d'une base de données, suivant différents critères. Le critère global nous renvoie 65533 itérations, et les deux autres à peu près 3000. Mes collègues ne sont que trois à reprendre toutes ces itérations pour vérifier les correspondances, avec une moyenne de 3 minutes par traitement. Comprenez donc l'importance de virer les doublons.

    Je pencherai donc en faveur de la solution Highlander, afin de leur faciliter au plus vite la tâche.

    Merci à vous.

  5. #5
    Invité
    Invité(e)
    Par défaut
    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
    Dim Doublon As Collection
    Sub Scan()
    Dim RowsSup() As String
    Dim L As Long
    Dim Linge As Long
    Dim MyRange As Range
    Dim C As Long
    Dim Feuille As Worksheet
    Dim SplitR
    Const L_Start = 2 'L_Start=1 Si pas de titre de colonne L_Start=2 si titre de colone.
    Set Doublon = New Collection
     
     ReDim RowsSup(0)
    For C = 1 To ActiveWorkbook.Sheets.Count
        Set MyRange = ActiveWorkbook.Sheets(C).Range("C1").CurrentRegion
        For L = L_Start To MyRange.Rows.Count
            Linge = MethodeHighlander(L, MyRange)
            If Linge <> 0 Then
                ReDim Preserve RowsSup(1 + UBound(RowsSup))
                RowsSup(UBound(RowsSup)) = ActiveWorkbook.Sheets(C).Name & ";" & Linge
            End If
        Next
    Next
    For L = UBound(RowsSup) To 1 Step -1
        SplitR = Split(RowsSup(L), ";")
        Set Feuille = ActiveWorkbook.Sheets(SplitR(0))
        Feuille.Rows(SplitR(1)).EntireRow.Delete
     
     
    Next
    End Sub
    Function MethodeHighlander(L As Long, MyRange As Range) As Long
    'La Méthode Highlander il ne peut en rester qu'un.
    Dim col As Integer
    Dim Text As String
    Text = ""
    MethodeHighlander = 0
    For col = 3 To 3 'MyRange.Columns.Count
        Text = Text & "_" & MyRange(L, col)
    Next
    On Error Resume Next
    'On peut ajouter dans une collection un enregistrement en lui donnant un nom.
    'Le problème est qu'elle ne supporte pas les doublons.
    'On utilise les messages d'erreur pour définir les doublons.
    Doublon.Add txt, "T_" & Text
    If Err <> 0 Then
        MethodeHighlander = L
        Err.Clear
    End If
    On Error GoTo 0
    End Function

  6. #6
    Nouveau membre du Club
    Homme Profil pro
    salarié
    Inscrit en
    Janvier 2013
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : salarié
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2013
    Messages : 24
    Points : 26
    Points
    26
    Par défaut Problème résolu
    Bonjour,

    La solution Highlander fonctionne parfaitement, nous avons pu retirer quelques 2000 itérations

    Je vais pouvoir me concentrer sur les dictionnaires, et voir comment celà fonctionne

    Encore merci à vous de la part de mes collègues

  7. #7
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 379
    Points : 12 075
    Points
    12 075
    Billets dans le blog
    8
    Par défaut re
    bonjour
    puisque ca t'intéresse

    voici un exemple tres simple qui utilise un dictionnaire pour comparer les sheets suivant le premier

    ouvre un nouveau classeur

    et met ca dans un module standard

    tu a une macro "liste" qui va générer une liste de 20000 nombres aléatoires dans la colonne "A" de chaque sheets

    ensuite tu a la macro "tri_les_doublons_partout"
    cette macro ma mettre en rouge tout les occurrences trouvées dans les sheets 2 au dernier correspondant aux occurrences du premier sheets
    bien que l'on pourrait encore l'ameliorer la macro met moins de 4 secondes pour comparer 20000 lignes multipliées par le nombre de sheets -le premier
    voila le code
    je l'ai largement commenté (ligne par ligne )
    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
     
    Option Explicit
    Option Base 1
    Dim tableau, d As Object, elem As Variant, e As Long, a As Long, i As Long
       Sub tri_les_doublons_partout()
         'on créé un dictionnaire pour la page 1
        Set d = CreateObject("Scripting.Dictionary")
        'plutot que boucler sur X 'cellules je vais mettre la plage dans un tableau
        tableau = Sheets(1).Range("a1:a" & Range("a" & Rows.Count).End(xlUp).Row)
     
        ' boucler sur les éléments d'un tableau est plus rapide que boucler sur les cellules
        For Each elem In tableau
            'on met l'item dans le dictionnaire(d)les doublons ne sont pas permis dans un dictionnaire ils seront _
             eliminés automatiquement
            d.Item(elem) = ""
        Next
        'on a maintenant un dictionnaire representant les éléments de la page 1 et sans doublons
        'on boucle sur tout les sheets
        For e = 2 To Sheets.Count
            'donc a chaque boucle on change de sheets le premier etant le 2 eme puisque le premier etant la reference
            With Sheets(e)
                'on boucle sur toute les cellules de la colonne a jusqu'a la derniere utilisée
                For a = 1 To .Range("a" & Rows.Count).End(xlUp).Row
                    'si la valeur de la cellules existe dans le dictionnaire
                    If d.Exists(.Cells(a, 1).Value) Then
                        'on met la cllule en rouge
                        Sheets(e).Cells(a, 1).Interior.Color = vbRed
                    End If
                Next a    'jusqua la derniere cellule
            End With
        Next e    'jusqu'au dernier sheets
    End Sub
    'on va créer une liste de nombre aleatoire dans la colonne "A" sur 25000 lignes dans tout les sheets
    Sub liste()
        For e = 1 To Sheets.Count
            For i = 1 To 20000
                Randomize
                Sheets(e).Cells(i, 1) = Round((Rnd * 25000), 0)
            Next
        Next
    End Sub
    je regarde encore pour l'ameliorer

    au plaisir
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  8. #8
    Membre régulier
    Femme Profil pro
    Inscrit en
    Février 2013
    Messages
    56
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Février 2013
    Messages : 56
    Points : 88
    Points
    88
    Par défaut
    Bonjour,

    Repérage des doublons entre feuilles avec MFC

    (nf est un champ qui contient les noms des feuilles)

    =SOMMEPROD(--(NB.SI(INDIRECT("'"&nf&"'!A2:B10");A2)>0))>1

    Repérage des doublons de champs 3D entre feuilles + doublons dans chaque champ avec MFC


    =SOMMEPROD((--(NB.SI(INDIRECT("'"& nf &"'!A2:B10");A2)>0))+
    (--(NB.SI(INDIRECT("'"& nf &"'!A2:B10");A2)>1)))>1

    Ceuzin
    Fichiers attachés Fichiers attachés

  9. #9
    Nouveau membre du Club
    Homme Profil pro
    salarié
    Inscrit en
    Janvier 2013
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : salarié
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2013
    Messages : 24
    Points : 26
    Points
    26
    Par défaut
    Holà ça en fait tout ça

    Je vois pour m'octroyer une licence Office 2003 par mon entreprise (j'utilise Libre office à la maison), et je teste tranquillement installé, avec un café.

    Puis-je me permettre de vous relancer par MP si j'ai des questions sur ces bouts de codes, et considérer ce sujet comme résolu ?

    Cordialement, Jérôme D

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

Discussions similaires

  1. contrôle des doublons sur plusieurs champs
    Par christy1 dans le forum Modélisation
    Réponses: 3
    Dernier message: 09/12/2011, 14h13
  2. [XL-2003] Doublons sur plusieurs feuilles
    Par bbcancer dans le forum Macros et VBA Excel
    Réponses: 31
    Dernier message: 11/10/2010, 16h06
  3. [AC-2007] Identifier des doublons sur plusieurs champs.
    Par neiluj26 dans le forum Requêtes et SQL.
    Réponses: 15
    Dernier message: 22/09/2010, 20h49
  4. Manipuler des données sur plusieurs feuilles
    Par gil71 dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 04/05/2010, 14h55
  5. Calcul sur des cellules sur plusieurs feuilles
    Par vlksoft dans le forum Excel
    Réponses: 2
    Dernier message: 12/03/2009, 08h08

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