Comparer 2 bases et suppression lignes en double

patsyl60

XLDnaute Occasionnel
Bonjour le forum,

Depuis hier, je cherche comment supprimer par vba des lignes en double avec plusieurs criteres. Et également comparer 2 bases sur 2 feuilles différentes pour supprimer les lignes en double. J'ai lu pleins de choses mais je n'arrive pas à comprendre le fonctionnement.Ci joint un petit exemple ( j'ai fait 2 feuilles : Base1 & Base2) . Merci de faire le maximum de commentaire pour que je comprenne le fonctionnement.

Encore une fois, d'avance merci de votre aide.

Patsyl60
 

Pièces jointes

  • Test1.xls
    14 KB · Affichages: 128
  • Test1.xls
    14 KB · Affichages: 133
  • Test1.xls
    14 KB · Affichages: 137

Gorfael

XLDnaute Barbatruc
Re : Comparer 2 bases et suppression lignes en double

Salut patsyl60 et le forum
Rappel : pas de devin, ni de télépathe, et le seul qui sache ce qui est évident, c'est toi.

Ceci étant posé, avant d'avoir un code, il faut savoir ce qu'il doit faire exactement :
On a deux bases : Base1 et Base2
Si AA apparaît dans les 2, on a deux solutions :
Soit Base1 est prioritaire sur Base2 => on supprime le AA de Base2
Soit Base2 est prioritaire sur Base1 => on supprime le AA de Base1

Une logique de base de données voudrait qu'il y ait une base de référence unique, avec un dispatching de ses données en fonction de certains critères.

Dupont 75000 apparaît 2 fois en Base1 (Lignes 2 et 4) 2 fois en Base2 (Lignes 2 et 5)
D'après la description, il ne devrait "en rester qu'un"

Si ce que tu veux en final, c'est que Base1 = Base2, le plus simple, c'est de :
- Pour chaque cellule de A de Base1 (en partant de la ligne la plus basse et en remontant)
- on recherche une égalité dans base1 : si elle existe, on recherche une égalité des 2 lignes sur toutes les colonnes
- S'il y a égalité complète, on efface la ligne en cours, puis on recommence la boucle.
- S'il n'y a pas égalité, on compare avec la colonne A de Base2
- S'il y a égalité, on vérifie toutes les colonnes
- S'il y a égalité complète, on supprime la ligne
- S'il n'y a pas égalité, on passe à la suivante.
À l'issue de cette boucle principale, on a deux listes :
Base1, qui contient toutes les lignes de base1 sans doublon
Base2, qui contient toutes les lignes n'existant pas en Base1
On fait une boucle d'élimination des doublons de Base2
À l'issue de cette boucle, on colle Base2 derrière Base1, puis on recopie la nouvelle Base1 sur Base2

C'est un principe : on ne connaît aucune des grandeur des listes, Pas sûr que ce qu'on cherche ce soit ça.

En fonction de la grandeur des listes, on peut faire plus rapide :
- Copie de Base2 derrière Base1 => liste unique contenant tous les doublons.
- On efface Base2
- On filtre (avancé) sur Base2 sans doublon Base1 sur les 4 colonnes
- On efface Base1
- On copie Base2 sur Base1

Mais tout dépend de ce que tu as en tête...
A+
 

patsyl60

XLDnaute Occasionnel
Re : Comparer 2 bases et suppression lignes en double

Bonjour Gorfael, Bonjour le forum,

Merci pour ta longue réponse claire. C'est vrai que les choses évidentes pour nous ne sont pas forcément pour tout le monde.

Pour mon exemple, je veux 2 choses :

1/ comparer uniquement la liste de la base1 et surligner ou supprimer un des doublons (voir lignes 2 et 4 de ma base1 ).
2/ comparer la base 2 à la base 1 et garder ou surligner dans la base2 les lignes qui ne sont pas en doublons avec la base1 (ligne 4 de ma base2).

Mon objectif est de comprendre comment gérer les doublons par ligne et les doublons sur des bases sur 2 feuilles différentes.

J'espère avoir été clair cette fois ci. Sinon, n'hésites pas à me demander des infos complémentaires.

Merci encore de ton aide.

Bonne journée.

Patsyl60
 

jvandreae

XLDnaute Nouveau
Re : Comparer 2 bases et suppression lignes en double

Bonjour Gorfael, Bonjour Patsyl, bonjour le forum,
Tout d'abord, je ne suis pas un habitué des forum, mon intrusion est peut être déplacée mais la réponse de Gorfael m'intéresse beaucoup car elle répond exactement à ma problématique.
Faut il que j'ouvre une nouvelle discussion en exposant mon problème, je ne souhaite pas court-circuiter celle de Patsyl?
Merci de votre réponse.

Jvandreae

(Suite)
Je viens de m'informer, j'ouvre une nouvelle discussion. Merci
 
Dernière édition:

Gorfael

XLDnaute Barbatruc
Re : Comparer 2 bases et suppression lignes en double

Salut patsyl60 et le forum
1/ comparer uniquement la liste de la base1 et surligner ou supprimer un des doublons (voir lignes 2 et 4 de ma base1 ).
2/ comparer la base 2 à la base 1 et garder ou surligner dans la base2 les lignes qui ne sont pas en doublons avec la base1 (ligne 4 de ma base2).
Il y a un gros problème avec Excel : Ce n'est pas qu'on ne trouve pas de solutions... c'est qu'il y en a trop !
Après, ça dépend de ta propre méthodologie de travail.

Dans la pièce jointe, une réponse par MFC :
Sur une seule feuille, aucun problème. Mais sur plusieurs, Les MFC n'aiment pas ;)
Donc, on passe par une astuce de nomination de plage et comme c'est sur 4 colonnes, on crée une colonne les regroupant
Sur la première feuille (Base 1)
Une MFC qui colorie tous les doublons de la feuille (on parle d'égalité des 4 premières colonnes)
Une autre qui ne colorie pas l'original
Une MFC qui colorie les doublons sur Base1 de Base 1 et Base 2 (avec une définition dynamique de plage)

Mais pour reprendre mon exemple, si tu as une ligne avec AA; BB; CC; DD, elle se retrouvera en doublon de la ligne A; ABBC; ; CDD

On peut aussi travailler par Macro
- Soit en Function et MFC => une MFC est purement visuelle, et ne touche pas à la coloration de la cellule => en annulant la MFC, on retrouve la couleur originale de la cellule
- Soit par Macro pure, et dans ce cas, il faut définir comment elle doit se lancer : automatiquement (et par quel automatisme) ou manuellement.

Beaucoup de questions, mais en définitive, les réponses viendront généralement de tes habitudes de travail.
A+
 

Pièces jointes

  • Doublons par MFC.xls
    20 KB · Affichages: 221

patsyl60

XLDnaute Occasionnel
Re : Comparer 2 bases et suppression lignes en double

Salut Gorfael et le forum

Merci pour ta réponse. Je pense partir sur une macro qui se lancera manuellement.Mais pour cela, il faut que je maitrise encore pas mal de choses...
En regardant ton fichier, je ne comprend pas ou tu vas chercher la valeur Val_Base_1 ou Val_Base_2.Peux tu me donner des infos. Est que Val_Base_1 va chercher dans toutes les valeurs de la feuille "Base1" ?.
Peux tu également m'aider sur la méthodologie "logique" pour créer une macro.( je pense partir de ton fichier formule et mfc et ensuite via macro supprimer ou surligner les lignes correspondant à vrai ou faux ou à la couleur de la cellule). Qu'en penses tu ?

A te lire.

Bonne journée.

Patsyl60
 

Gorfael

XLDnaute Barbatruc
Re : Comparer 2 bases et suppression lignes en double

Salut patsyl60 et le forum
En regardant ton fichier, je ne comprend pas ou tu vas chercher la valeur Val_Base_1 ou Val_Base_2
Tellement évident quand tu connais que tu oublies d'expliquer :p
Menu Insertion>>Nom>>Définir
Tu as 2 plages nommées, qui sont définies dynamiquement par le nombre de valeurs qui sont en A. C'est une plage, et on va tester la présence de plus d'une valeur (dans la même page) ou d'une valeur (dans l'autre page), pour mettre la couleur par MFC.
Peux tu également m'aider sur la méthodologie "logique" pour créer une macro.
Difficile de t'aider : chaque programmeur a une manière de coder qui lui est propre.
Quand je veux faire une macro :
- je définis une zone de déclarations de variables : Toutes mes variables sont déclarées, dans le type voulu, et commence par une majuscule.
- Je travaille par "module" : une partie de la macro, pas trop importante, que je peux tester. Et je teste chacun de ces modules, avec des valeurs limites, avant de continuer.
- J'utilise les indentations pour me situer dans les boucles, les tests...
- Je renseigne mon code. Ça me sert quand je dois modifier un code longtemps après l'avoir créé, ou quand j'ai "trouvé une super astuce" :D
- j'utilise ma tête pour résoudre une erreur, plutôt que de l'effacer avec des instructions On Error.
- Quand ça ne fonctionne pas comme je voudrais, j'exécute ma macro sur le papier, et la fait en Pas-à-pas pour trouver où ça diverge, et pourquoi.
Il y a toujours une infinité de chemin pour parvenir à un résultat. Un exemple de macro :
Code:
Sub Test()
'Déclarations des variables propres à la macro ============================
Dim F_1 As Worksheet, F_2 As Worksheet
Dim Cel As Range, Cel_1 As Range
Dim X As Long, Y As Integer, Flg As Boolean
'Mise à l'Etat Initial ====================================================
Set F_1 = Sheets("Base1")
Set F_2 = Sheets("Base2")
With F_1
    .Range(.[A1], .Cells(Rows.Count, "A").End(xlUp)).Interior.ColorIndex = xlNone
End With
'remise à 0 de la couleur des cellules de A
'Traitement des doublons Set F_1 = Sheets("Base1") ========================
For X = F_1.Cells(Rows.Count, "A").End(xlUp).Row To 1 Step -1 'Boucle1 ++B1
'Pour x=dernire ligne non-vide de A à 1ère en décrémentant
    If Range("A" & X).Interior.ColorIndex <> 3 Then 'Test 1 +++++++++++++T1
    'si on ne l'a pas déjà traitée
        Set Cel = F_1.Range(F_1.[A1], F_1.Cells(X, "A")).Find(F_1.Cells(X, "A"))
        'Cel= cellule doublon
        If Not (Cel Is Nothing) And Cel.Row <> X Then 'Test 2 +++++++++++T2
        's'il y a doublon, et que ce n'est pas celle qu'on teste
            Flg = True
            'drapeau à vrai
            For Y = 2 To 4 'Boucle 2 ++++++++++++++++++++++++++++++++++++B2
            'Pour y=2 à 4
                If F_1.Cells(X, Y) <> F_1.Cells(Cel.Row, Y) Then '+++++++T3
                    Flg = False
                    'drapeau à faux
                    Exit For
                    'sortie boucle 2
                End If '-------------------------------------------------T3
            Next Y 'fin Boucle 2 ----------------------------------------B2
            'Y suivant
            If Flg Then F_1.Range("A" & X).Interior.ColorIndex = 3
            'si drapeau à vrai, alors colorier en rouge (2ème syntaxe de if)
        End If 'Fin test 2 ----------------------------------------------T2
    End If 'Fin test 1 --------------------------------------------------T1
Next X 'fin boucle 1 ----------------------------------------------------B1
'x suivant
'Traitement de Base2 ======================================================
With F_2 'mise en préfixe
    .Range(.[A1], .Cells(Rows.Count, "A").End(xlUp)).Interior.ColorIndex = xlNone
    For X = .Cells(Rows.Count, "A").End(xlUp).Row To 1 Step -1
        Set Cel = F_1.Range("A:A").Find(.Range("A" & X))
        If Not (Cel Is Nothing) Then
            Set Cel_1 = Cel
            Do
                Flg = True
                For Y = 2 To 4
                    If F_1.Cells(Cel.Row, Y) <> .Cells(X, Y) Then
                        Flg = False
                        Exit For
                    End If
                Next Y
                If Flg Then
                    .Range("A" & X).Interior.ColorIndex = 4
                    Exit Do
                End If
                Cel = F_1.Range("A:A").Find(.Range("A" & X))
                If Cel Is Nothing Then Exit Do
            Loop Until Cel.Row = Cel_1.Row
        End If
    Next X
End With ' fin de mise en préfixe
End Sub
Comme j'avais la flemme, j'ai commenté au départ, moins après.
Je suis parti de l'exemple que tu as fournis dans ton premier poste.
Le but des deux parties n'est pas le même, même si la finalité est identique(supprimer les doublons).
Il y a donc deux façons de traiter le problème. Comme on peut supprimer les ligne au lieu de las colorer, je par de la dernière, pour aller à la première.

Il est nécessaire de comprendre complètement un code pour pouvoir l'utiliser et le maintenir. Si tu as des questions, ne pas hésiter à les poser : une question n'est jamais bête... la réponse peut être parfois évidente.
A+
 

patsyl60

XLDnaute Occasionnel
Re : Comparer 2 bases et suppression lignes en double

Salut Gorfael et le forum,

Merci pour ta réponse. J'ai regardé ta macro. Je pense avoir compris le principe.

Je regarde de plus près et si j'ai des questions, je n'hésites pas à revenir vers toi.

Encore merci d'avoir pris le temps de me répondre aussi clairement.

Bonne journée.

Patsyl60
 

Discussions similaires

Réponses
26
Affichages
1 K

Statistiques des forums

Discussions
312 545
Messages
2 089 487
Membres
104 183
dernier inscrit
bast.coud