Vous utilisez un navigateur obsolète. Il se peut que ce site ou d'autres sites Web ne s'affichent pas correctement. Vous devez le mettre à jour ou utiliser un navigateur alternatif.
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.
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
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.
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
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+
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 ?
Tellement évident quand tu connais que tu oublies d'expliquer
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"
- 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+
Ce site utilise des cookies pour personnaliser le contenu, adapter votre expérience et vous garder connecté si vous vous enregistrez.
En continuant à utiliser ce site, vous consentez à notre utilisation de cookies.