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 :

Doublons sur deux feuilles avec 26 colonnes chacunes [XL-2007]


Sujet :

Macros et VBA Excel

  1. #1
    Futur Membre du Club
    Inscrit en
    Mars 2011
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Mars 2011
    Messages : 13
    Points : 6
    Points
    6
    Par défaut Doublons sur deux feuilles avec 26 colonnes chacunes
    bjr,
    Ci dessous un code qui ne fonctionne pas correctement.
    J'ai deux feuilles avec 26 colonnes chacunes. Premiere colonne on a des noms qui commencent par la lettre A sur les deux feuilles, pour la deuxième colonne donc la "B" on a des noms qui commencent par la lettre B. Et cela pour les 26 lettres de l'alphabet. On a ça sur les deux feuilles.

    voici mon code qui ne nettoye pas tout car j'ai plus de ligne sur la colonne C que sur la A et la B... . En plus je ne sais pas comment eviter de mettre ce code 26 fois, une fois pour chaque lettre.
    voir ci dessous.

    Si vous pouvez m'aider, mille mercisssssss



    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
    Sub Compare()
    Dim LastLig1 As Long, LastLig2 As Long, i As Long
    Dim c As Range
     
    LastLig1 = Sheets("Feuil4").Cells(Rows.Count, 1).End(xlUp).Row
    With Sheets("Feuil3")
        LastLig2 = .Cells(Rows.Count, 1).End(xlUp).Row
        For i = LastLig2 To 1 Step -1
            Set c = Sheets("Feuil4").Range("A1:A" & LastLig1).Find(.Range("A" & i).Value, lookat:=xlWhole)
            If Not c Is Nothing Then
                .Rows(i).Delete
                Set c = Nothing
            End If
        Next i
    End With
     
    LastLig1 = Sheets("Feuil4").Cells(Rows.Count, 1).End(xlUp).Row
    With Sheets("Feuil3")
        LastLig2 = .Cells(Rows.Count, 1).End(xlUp).Row
        For i = LastLig2 To 1 Step -1
            Set c = Sheets("Feuil4").Range("B1:B" & LastLig1).Find(.Range("B" & i).Value, lookat:=xlWhole)
            If Not c Is Nothing Then
                .Rows(i).Delete
                Set c = Nothing
            End If
        Next i
    End With
     
    LastLig1 = Sheets("Feuil4").Cells(Rows.Count, 1).End(xlUp).Row
    With Sheets("Feuil3")
        LastLig2 = .Cells(Rows.Count, 1).End(xlUp).Row
        For i = LastLig2 To 1 Step -1
            Set c = Sheets("Feuil4").Range("C1:C" & LastLig1).Find(.Range("C" & i).Value, lookat:=xlWhole)
            If Not c Is Nothing Then
                .Rows(i).Delete
                Set c = Nothing
            End If
        Next i
    End With
     
    ......
     
    End Sub
    Merci pour votre aide

  2. #2
    Membre habitué Avatar de LouiMz
    Homme Profil pro
    Inscrit en
    Février 2010
    Messages
    104
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 104
    Points : 154
    Points
    154
    Par défaut
    Bonjour,

    EDIT: Ce code n'est pas optimisé

    J'ai recupéré directement votre code, a adapté selon vos besoins.
    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 Compare()
    Dim LastLig1 As Long, LastLig2 As Long, i As Long, j as Long
    Dim c As Range
     
    LastLig1 = Sheets("Feuil4").Cells(Rows.Count, 1).End(xlUp).Row
     
    For j = 1 to 26 'Parcours des 26 colonnes
     
       With Sheets("Feuil3")
          LastLig2 = .Cells(Rows.Count, 1).End(xlUp).Row
          For i = LastLig2 To 1 Step -1
            Set c = Sheets("Feuil4").Range("" & Chr(j+96) & "1:" & Chr(j+96) & LastLig1 & "").Find(.Range("" & Chr(j+96) & j & "").Value, lookat:=xlWhole)
             If Not c Is Nothing Then
                .Rows(i).Delete
                Set c = Nothing
             End If
          Next i
       End With
     
    next 
    End Sub
    Le Chr(j+96) permet de recuperer la lettre correspondante
    Chr(97) renvoit "A".

    Cordialement

  3. #3
    Futur Membre du Club
    Inscrit en
    Mars 2011
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Mars 2011
    Messages : 13
    Points : 6
    Points
    6
    Par défaut
    bjr,

    Je pense que la macro ne compare pas la feuille 3 colonne A avec la feuille 4 colonne A etc.. feuille 3 colonne B avec la feuille 4 colonne B.... etc... mais elle compare toutes les colonnes.

    Du coup j'ai testé.
    J'ai mis dans la feuille 3 que des noms commençant par la lettre "B" dans la colonne A (qui ne doit contenir que des nom en A).
    Il y a dans la feuille 4 colonne A que des noms commençant par "A", dans la colonne B que des noms commençant par "B".

    En lançant la macro. Toute la saisie feuille 3 colonne A a été éffacé.

    Sais tu comment pallier à ce pb ?

    Sinon pour ce qui est du J = 1 to 26 ça fonctionne très bien.

    Merci pour m'avoir repondu si rapidement, c'est vraiment cool.

  4. #4
    Membre habitué Avatar de LouiMz
    Homme Profil pro
    Inscrit en
    Février 2010
    Messages
    104
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 104
    Points : 154
    Points
    154
    Par défaut
    Re,

    Je reprends. Est ce que le but est d'avoir une procédure supprimant les noms de la feuille 3 qui se trouvent aussi dans la feuille 4 ?

    Si c'est le cas voilà ma proposition , en remplaçant le nom des feuilles bien sûr ^^

    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 suppression_doublons()
     
    Dim i As Integer, j As Integer, k As Integer
    Dim colonne As String
     
    For j = 1 To 26 'Colonne de la feuille 1 de A jusqu'à Z
        colonne = Chr(j + 96) 'On declare la colonne courante
        For i = 1 To Sheets("feuille1").Range("" & colonne & "65536").End(xlUp).Row 'De la ligne 1 à la derniere ligne, non vide, de la colonne j
            'La cellule courante ici est Cells(i,j)
            'Puis on part comparer dans l'autre feuille en utilisant la même colonne
            For k = 1 To Sheets("feuille2").Range("" & colonne & "65536").End(xlUp).Row 'Feuille 2 Ligne 1 à derniere, non vide, de la colonne j
                If Sheets("feuille1").Cells(i, j).Value = Sheets("feuille2").Cells(k, j).Value Then
                    'Si doublons alors on supprime la cellule courante de la feuille 2 en remontant pour eviter de decaler les autres colonnes
                    Sheets("feuille2").Cells(k, j).Delete (xlUp)
                    k = 30000 'Puis on augmente la variable k pour sortir de la boucle et passer à la valeur suivante
                End If
            Next
        Next
    Next
     
    End Sub
    J'attends vos retours et éventuellement un mini + .

    Cordialement

  5. #5
    Futur Membre du Club
    Inscrit en
    Mars 2011
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Mars 2011
    Messages : 13
    Points : 6
    Points
    6
    Par défaut
    Hello,

    Merci pour le temps que tu passes c'est vraiment cool.
    J'ai testé et ça supprime une cellule sur deux dans la feuille 3 pour toutes les colonnes et je ne comprends vraiment pas pk.

    Si t'as encore du temps pour jetter un oeil, se serait super.



    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 suppression_doublons()
     
    Dim i As Integer, j As Integer, k As Integer
    Dim colonne As String
     
    For j = 1 To 26 'Colonne de la feuille 3 de A jusqu'à Z
        colonne = Chr(j + 96) 'On declare la colonne courante
        For i = 1 To Sheets("Feuil3").Range("" & colonne & "65000").End(xlUp).Row 'De la ligne 1 à la derniere ligne, non vide, de la colonne j
            'La cellule courante ici est Cells(i,j)
            'Puis on part comparer dans l'autre feuille en utilisant la même colonne
            For k = 1 To Sheets("Feuil4").Range("" & colonne & "65000").End(xlUp).Row 'Feuille 4 Ligne 1 à derniere, non vide, de la colonne j
                If Sheets("Feuil3").Cells(i, j).Value = Sheets("Feuil4").Cells(k, j).Value Then
                    'Si doublons alors on supprime la cellule courante de la feuille 2 en remontant pour eviter de decaler les autres colonnes
                    Sheets("Feuil3").Cells(i, j).Delete (xlUp)
                    k = 30000 'Puis on augmente la variable k pour sortir de la boucle et passer à la valeur suivante
                End If
            Next
        Next
    Next
     
    End Sub

  6. #6
    Expert éminent
    Avatar de fring
    Homme Profil pro
    Engineering
    Inscrit en
    Février 2008
    Messages
    3 900
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : Belgique

    Informations professionnelles :
    Activité : Engineering

    Informations forums :
    Inscription : Février 2008
    Messages : 3 900
    Points : 7 964
    Points
    7 964
    Par défaut
    Citation Envoyé par jimmycamelon Voir le message
    J'ai testé et ça supprime une cellule sur deux dans la feuille 3 pour toutes les colonnes et je ne comprends vraiment pas pk.[/code]
    Bonjour,

    Lorsqu'on veut réaliser une boucle pour supprimer des lignes ou des cellules, il faut impérativement parcourir les cellules de bas en haut.
    L'explication du pourquoi est la suivante : en supprimant par exemple la 3ème ligne, toutes les lignes à partir de la ligne 4 remontent d'un cran. La ligne 4 devient donc la 3 mais la boucle se poursuit et passe à la ligne suivante, la ligne 4, sans revérifier le contenu de la ligne 3.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    For i = Sheets("Feuil3").Cells(Rows.Count, colonne).End(xlUp).Row Step -1
    Autre petite remarque, pour sortir d'une boucle il n'est pas nécessaire de faire ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    k = 30000 'Puis on augmente la variable k pour sortir de la boucle et passer à la valeur suivante
    il suffit d'écrire

  7. #7
    Futur Membre du Club
    Inscrit en
    Mars 2011
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Mars 2011
    Messages : 13
    Points : 6
    Points
    6
    Par défaut
    oui en effet c'est bcp mieux; Mais par contre je suis paumé et avec le code ci dessous rien ne se passe.

    Il doit pas manquer grand chose mais je ne vois pas quoi....

    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 suppression_doublons()
     
    Dim i As Integer, j As Integer, k As Integer
    Dim colonne As String
     
    For j = 1 To 26             'Colonne de la feuille 3 de A jusqu'à Z
        colonne = Chr(j + 96)         'On declare la colonne courante
    For i = 1 To Sheets("Feuil3").Cells(Rows.Count, colonne).End(xlUp).Row Step -1
                   'La cellule courante ici est Cells(i,j)
                    'Puis on part comparer dans l'autre feuille en utilisant la même colonne
    For k = 1 To Sheets("Feuil4").Cells(Rows.Count, colonne).End(xlUp).Row Step -1            'Feuille 4 Ligne 1 à derniere, non vide, de la colonne j
    If Sheets("Feuil3").Cells(i, j).Value = Sheets("Feuil4").Cells(k, j).Value Then
                              'Si doublons alors on supprime la cellule courante de la feuille 2 en remontant pour eviter de decaler les autres colonnes
     Sheets("Feuil3").Rows(i).Delete (xlUp)
           End If
                Exit For
            Next
        Next
    Next
    End Sub

  8. #8
    Expert éminent sénior 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
    Points : 31 877
    Points
    31 877
    Par défaut
    Essaies ceci
    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 Test()
    Dim LastLig As Long, i As Long
    Dim j As Integer
    Dim c As Range
     
    Application.ScreenUpdating = False
    With Sheets("Feuil3")
        For j = 1 To 26
            LastLig = .Cells(.Rows.Count, j).End(xlUp).Row
            For i = 1 To LastLig
                If .Cells(i, j).Value <> "" Then
                    Set c = Sheets("Feuil4").Columns(j).Find(.Cells(i, j).Value, LookIn:=xlValues, lookat:=xlWhole)
                    If Not c Is Nothing Then
                        c.Delete shift:=xlShiftUp
                        Set c = Nothing
                    End If
                End If
            Next i
        Next j
    End With
    End Sub

  9. #9
    Membre habitué Avatar de LouiMz
    Homme Profil pro
    Inscrit en
    Février 2010
    Messages
    104
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 104
    Points : 154
    Points
    154
    Par défaut
    Bonjour,

    Merci pour l'astuce pour sortir de la boucle ^^

    J'avais zappé le decalage, d'habitude j'utilise un While avec une condition pour incrementer ou non la ligne.

    J'ai toujours effectué les boucles de haut en bas.

    Est-ce qu'au niveau de l'algo, le decalage des lignes ou des cellules prend beaucoup de temps? Parce qu'avec un fichier de 60000 lignes sur 110 colonnes où je fais le même type de traitement je n'ai jamais vu de différence.
    Même si j'effectue le traitement de haut en bas ou de bas en haut.

    Une idée?

    Cordialement

  10. #10
    Futur Membre du Club
    Inscrit en
    Mars 2011
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Mars 2011
    Messages : 13
    Points : 6
    Points
    6
    Par défaut
    En ce qui me concerne, ça marche.
    C'est le top. Merci à tout le monde.

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

Discussions similaires

  1. Recherche de Doublons sur deux feuilles différentes
    Par Papou5091 dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 07/03/2015, 11h57
  2. [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
  3. transfert lignes,colonnes sur deux feuille avec condition
    Par explosion dans le forum Macros et VBA Excel
    Réponses: 10
    Dernier message: 10/06/2010, 14h42
  4. [Toutes versions] Requête sur deux champs avec doublons.
    Par RKU01 dans le forum Access
    Réponses: 2
    Dernier message: 22/07/2009, 12h19
  5. [Débutant] doublon sur deux colonnes
    Par mephilith dans le forum Langage SQL
    Réponses: 8
    Dernier message: 28/01/2008, 19h28

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