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 [XL-2003]


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
    Janvier 2010
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 19
    Par défaut Suppression doublons
    Bonjour à tous,

    Je voudrai sur une feuille donnée supprimer les lignes qui pourraient être saisies en double et n'en garder qu'une.

    Sachant que chaque ligne serait composée de 5 colonnes Maxi.

    J'arrive à faire fonctionner ma macro en considérant la colonne A comme référence, mais au delà de 2 colonnes je n'arrive pas à comprendre comment constituer le code de suppression.

    Des explications et un petit exemple seraient les bienvenus.

    Merci à tous.


  2. #2
    Membre Expert
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    2 130
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 2 130
    Par défaut
    Salut Albatros47 et le
    forumJ'arrive à faire fonctionner ma macro en considérant la colonne A comme référence, mais au delà de 2 colonnes je n'arrive pas à comprendre comment constituer le code de suppression.
    Tu as donc créé une macro qui ne te suffit pas. Donnes ton code pour qu'on puisse le modifier.
    A+

  3. #3
    Membre averti
    Inscrit en
    Janvier 2010
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 19
    Par défaut
    Bonjour,

    Voilà le code que j'ai essayé:

    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
    Sub supprimeDoublons()
     
    MaCellule = ("A1")
    Range(MaCellule).Select
    ActiveCell.CurrentRegion.Sort Key1:=Range(MaCellule), Order1:=xlAscending, Header:=xlYes
    donnee1 = ActiveCell
    ActiveCell.Offset(1, 0).Select
     
    While ActiveCell <> ""
    If ActiveCell = donnee1 Then
    ActiveCell.EntireRow.Delete
    ActiveCell.Offset(-1, 0).Select
    donnee1 = ActiveCell
    ActiveCell.Offset(1, 0).Select
    Else
    donnee1 = ActiveCell
    ActiveCell.Offset(1, 0).Select
    End If
    Wend
    End Sub
    Je souhaite vérifier la ligne entière.

    Paul 1 Mars 10:30 12:30= doublon
    Paul 1 Mars 10:30 12:30= doublon
    Paul 2 Mars 10:30 12:30= OK
    Eric 2 Mars 10:30 14:45= OK

    Résultat attendu:

    Paul 1 Mars 10:30 12:30
    Paul 2 Mars 10:30 12:30
    Eric 2 Mars 10:30 14:45

    Merci pour le coup de main, A+

  4. #4
    Expert éminent Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Par défaut
    bonjour,
    regarde un sujet juste en dessous et adaptes http://www.developpez.net/forums/d87...ules-voisines/

  5. #5
    Membre Expert
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    2 130
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 2 130
    Par défaut
    Salut Albatros47 et le forum
    Une proposition (non testée) :
    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
    Sub supprimeDoublons()
    'Définitions ========================
    Dim X As Long, Y As Long
    Dim Flg As Boolean
    'Traitement =========================
    'Classement -------------------------
    [A1].CurrentRegion.Sort Key1:=Range(MaCellule), Order1:=xlAscending, Header:=xlYes
    'Suppression des doublons -----------
    For X = Cells(Rows.Count, "A").End(xlUp).Row To 2 Step -1
    'Pour X = n°dermière ligne utilisée en A, jusqu'à 2 en décrémentant
        If Range("A" & X) = Range("A" & X - 1) Then
        'Si A(x)=A(x-1) alors
            Flg = True
            'Drapeau à VRAI
            For Y = 2 To Cells(X, Columns.Count).End(xlToLeft).Column
            'Pour Y = 2 à n°dernière colonne utilisée dans la ligne X
                If Cells(X, Y) <> Cells(X - 1, Y) Then
                'si cellule en colonne Y, ligne X=ligne X-1, alors
                    Flg = False
                    'Drapeau à FAUX
                    Exit For
                    'sortir de la boucle
                End If
            Next Y
            If Flg Then Rows(X).Delete
            'si drapeau à vrai, supprimer la ligne X
        End If
    Next X
    End Sub
    Quelques remarques sur les macros :
    Tu utilises Select/Activecell => ça ne sert pas à grand chose et ne fait que ralentir ton code. Et dans ton cas, tu étais obligé de stocker la valeur de la cellule active, pour pouvoir la comparer.
    Excel fait ça, parce qu'il est "bête", et enregistre chaque action.
    Mais quand tu fais du code, tu peux pratiquement surprimer tout les tandems Select/Selection ou Select/Activecell, sans voir aucune modification (si ce n'est une accélération du traitement de la macro).

    Dans mon code, je fais une boucle imbriquée (Y).
    On peut remplacer
    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
        If Range("A" & X) = Range("A" & X - 1) Then
        'Si A(x)=A(x-1) alors
            Flg = True
            'Drapeau à VRAI
            For Y = 2 To Cells(X, Columns.Count).End(xlToLeft).Column
            'Pour Y = 2 à n°dernière colonne utilisée dans la ligne X
                If Cells(X, Y) <> Cells(X - 1, Y) Then
                'si cellule en colonne Y, ligne X=ligne X-1, alors
                    Flg = False
                    'Drapeau à FAUX
                    Exit For
                    'sortir de la boucle
                End If
            Next Y
            If Flg Then Rows(X).Delete
            'si drapeau à vrai, supprimer la ligne X
        End If
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
        If Range("A" & X) = Range("A" & X - 1) Then
            If Cells(X, "B") = Cells(X - 1, "B") And _
               Cells(X, "C") = Cells(X - 1, "C") And _
               Cells(X, "D") = Cells(X - 1, "D") And _
               Cells(X, "E") = Cells(X - 1, "E") Then Rows.Delete
        End If
    Mais, si tu as une vingtaine de colonnes, le code en devient moins lisible. Par contre, si tu as des heures inscrites de manière automatique, tu peux faire des arrondis :
    12h30 est complêtement différent, pour Excel de 12h30 et 1 nanoseconde.
    Pour moi, je vois 12h30 dans les deux (mais j'ai des lunettes )
    A+

  6. #6
    Membre averti
    Inscrit en
    Janvier 2010
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 19
    Par défaut
    Bonsoir Gorfael et le forum,

    J'ai testé ta solution, et un message d'erreur apparaît: "Methode range de l'objet global a échoué".

    Peux-tu m'en dire un peu plus?

    Merci pour le coup de main.

    A+

  7. #7
    Membre Expert Avatar de laetitia
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    1 281
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 1 281
    Par défaut
    bonjour Albatros47 les amis Gorfael & mercatog le forum une autre approche .ayant "travaille" sur le sujet pendant quelques semaines j'ai mis au point une methode interessante en utilisant CreateObject("Scripting.Dictionary") & passer par des tablos quasi instantane sur 60000 lignes & sur 5 colonnes ce post me permet de la proposer pour la premiere fois a analyser!!!!

    dans le cas de albatros je suppose que les donnees sont sur la colonne A a E autrement il faut adapter!!

    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
    Option Explicit
    Dim t As Variant, t2() As String, m As Object, x As Long, i As Long, k As Long
    Sub es()
           On Error Resume Next 'preferer une etiquette
          Application.ScreenUpdating = False
           Set m = CreateObject("Scripting.Dictionary")
           t = Range("a1:f" & Cells.Find("*", , , , , xlPrevious).Row)
           x = 1
           For i = LBound(t) To UBound(t)
           t(i, 6) = t(i, 1) & t(i, 2) & t(i, 3) & t(i, 4) & t(i, 5)
           If Not m.Exists(t(i, 6)) Then
           m.Add t(i, 6), t(i, 6)
           ReDim Preserve t2(1 To 5, 1 To x)
           For k = 1 To 5: t2(k, x) = t(i, k): Next k: x = x + 1:  End If: Next i
           Range("a1:e" & Cells.Find("*", , , , , xlPrevious).Row).ClearContents
           Range("a1").Resize(UBound(t2, 2), UBound(t2, 1)) = Application.Transpose(t2)
           Erase t, t2: Set m = Nothing
      End Sub

  8. #8
    Membre averti
    Inscrit en
    Janvier 2010
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 19
    Par défaut
    Bonsoir laetitia et le forum,

    ça marche, que faudrait-il adapter pour respecter le format hh:mm en colonne D et E.

    Déjà c'est une solution qui se rapproche énormément de ce que je voulais obtenir.

    Un grand merci à tous.

    A+

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

Discussions similaires

  1. Suppression doublon sans clé primaire
    Par qbihlmaier dans le forum Access
    Réponses: 6
    Dernier message: 21/03/2007, 10h53
  2. Trigger pour suppression doublons ds table
    Par lg_gaelle dans le forum PL/SQL
    Réponses: 2
    Dernier message: 18/10/2006, 15h53
  3. Suppression doublon Table
    Par francois78 dans le forum Access
    Réponses: 11
    Dernier message: 13/06/2006, 16h16
  4. Suppression doublons
    Par osmoze dans le forum Oracle
    Réponses: 2
    Dernier message: 26/04/2006, 13h17
  5. [MySQL] Problème de syntaxe dans suppression doublons
    Par fred23195 dans le forum Langage SQL
    Réponses: 5
    Dernier message: 13/04/2006, 15h45

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