Comparer 2 colonnes sur feuil 1 et feuil 3

Résolu/Fermé
sambrero - Modifié par sambrero le 10/01/2012 à 01:42
 sambrero - 13 janv. 2012 à 15:46
Bonjour,

Sous EXCEL 97 (oui je sais, ce n'est pas de toute première jeunesse)
J'ai ce premier code qui fonctionne à merveille pour comparer colonne A feuille 1 et colonne A feuille 2 et supprimer les doublons sur feuille 2.


Sub compare()
Dim LastLig1 As Long, LastLig2 As Long, i As Long
Dim c As Range

Application.ScreenUpdating = False
LastLig1 = Sheets("Feuil1").Cells(Rows.Count, 1).End(xlUp).Row
With Sheets("Feuil2")
LastLig2 = .Cells(Rows.Count, 1).End(xlUp).Row
For i = LastLig2 To 1 Step -1
Set c = Sheets("Feuil1").Range("A1:A" & LastLig1).Find(.Range("A" & i).Value, lookat:=xlWhole)
If Not c Is Nothing Then
.Rows(i).Delete
LastLig2 = LastLig2 - 1
Set c = Nothing
End If
Next i
If LastLig2 > 0 Then .Range("A1:L" & LastLig2).Copy Sheets("Feuil1").Range("A" & LastLig1 + 1)
End With
End Sub






par contre, je voudrais effectuer la même chose entre feuille 1 et feuille 3 et le code suivant ne fonctionne pas. Quelqu'un saurait-il me dire pourquoi SVP ?




Sub compare2()
Dim LastLig1 As Long, LastLig3 As Long, i As Long
Dim c As Range

Application.ScreenUpdating = False
LastLig1 = Sheets("Feuil1").Cells(Rows.Count, 1).End(xlUp).Row
With Sheets("Feuil3")
LastLig3 = .Cells(Rows.Count, 1).End(xlUp).Row
For i = LastLig3 To 1 Step -1
Set c = Sheets("Feuil1").Range("A1:A" & LastLig1).Find(.Range("A" & i).Value, lookat:=xlWhole)
If Not c Is Nothing Then
.Rows(i).Delete
LastLig3 = LastLig3 - 1
Set c = Nothing
End If
Next i
If LastLig3 > 0 Then .Range("A1:L" & LastLig3).Copy Sheets("Feuil1").Range("A" & LastLig1 + 1)
End With
End Sub

Merci pour votre aide.




A voir également:

9 réponses

Lentzouille2 Messages postés 806 Date d'inscription samedi 22 octobre 2011 Statut Membre Dernière intervention 13 janvier 2020 39
10 janv. 2012 à 09:29
Bonjour,

Est-ce que ta feuille 3 se nomme bien Feuil3 ?
0
bonjour Lentzouille2,

Je viens de m'apercevoir que ma première macro qui fonctionnait pourtant hier (apparemment ne fonctionne plus aujourd'hui ??????? (peut-être trop de données aujourd'hui)
En fait, au lieu de me supprimer les doublons en Feuil2, elle me les recopie en Feuil1 à la suite de ma colonne , et laisse ma Feuil2 bien tranquille ??? (je ne m'en suis pas aperçu hier...

Enfin pour répondre à ta question, ma Feuil3 se nomme bien Feuil3.
Que faire ?
0
nicodrum Messages postés 147 Date d'inscription samedi 29 novembre 2008 Statut Membre Dernière intervention 19 décembre 2014 19
10 janv. 2012 à 09:44
c'est juste feuil2 qu'il faut changer en feuil3 pas tous les 2 en 3.
0
bonjour nicodrum,

J'essaierai après avoir réglé mon premier problème (bug 1ère macro)
Merci A+
0
nicodrum Messages postés 147 Date d'inscription samedi 29 novembre 2008 Statut Membre Dernière intervention 19 décembre 2014 19
10 janv. 2012 à 23:34
j'ai essayé ta macro et ça copie aussi chez moi. Je pensais que c'était normal. Je ne m'y connais pas assez en macro pour régler ce soucis...
0
Ce n'est pas grave merci
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 744
11 janv. 2012 à 09:27
Bonjour,
Combien de lignes doit traiter cette macro?
0
Bonjour,

47201 en Feuil1 et 41990 en Feuil2, 3 et 4.
0
michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 303
Modifié par michel_m le 11/01/2012 à 18:34
Bonjour

Il faut donc comparer 1 à 2, 1 à 3, 1 à 4, et virer les lignes de données identiques dans a 1 dans 2 3 4 ?

as tu des doublons internes dans dans 1 2 3 4 ?

as tu des données dans les autres colonnes ?

Michel
0
Bonjour,

Pour la première question : c'est tout à fait ça.
Pour la deuxième question : dans Feuil1, il se pourrait. Dans 2,3 et 4 : non
Pour la troisième question : c'est non
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 744
Modifié par pijaku le 12/01/2012 à 08:43
Bonjour,
Récapitulons pour être tout à fait exact.
Tu as 4 feuilles de 45 000 lignes.
Tu as des éléments en Feuil1 que l'on retrouve en feuil2, 3 et 4.
Par contre, pas d'éléments communs entre les Feuilles 2, 3 et 4.
Tu veux par conséquent supprimer les doublons.
Donc questions :
Tu veux les supprimer en Feuil1 ou en Feuil2, 3 et 4?
Peux t'il y avoir des doublons au sein même de chaque feuille?
Si oui : suppression?

Cordialement,
Franck P
0
Bonjour Pijaku,

Merci pour ton intérêt que tu me portes...
J'ai Feuil1 = 47201 lignes pour être précis
Feuil2 = 41990 lignes
Feuil3 = 41990 lignes
Feuil4 = 41990 lignes

Effectivement, je n'ai pas d'éléments communs entre les feuilles 2,3 et 4
Il peut y avoir quelques doublons dans la feuille 1 uniquement mais ceci n'est pas grave.
Aucun doublons entre feuilles 2,3 et 4. Aucun doublons à l'intérieur des feuilles 2,3 et 4.

Et je voudrais supprimer les doublons dans les feuilles 2,3 et 4 (après comparaison de ma feuille1) - si oui = suppression.
0
michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 303
Modifié par michel_m le 12/01/2012 à 08:40
Bonjour

testé sur 10000 lignes suppression en 1,3 seconde

Dim Dico2 As Object, Dico3 As Object, Dico4 As Object  
Sub comparer_1234()  
Dim derlig1 As Long, cle  
Dim T_in  
Dim start As Single  

start = Timer  
'---initialisations  
With Sheets(1)  
     Application.ScreenUpdating = False  
     derlig1 = .Columns("A").Find("*", , , , , xlPrevious).Row  
     T_in = Application.Transpose(.Range("A1:A" & derlig1).Value)  
' création des dictionnaires feuilles 2,3,4  
     creer_dicos 2, Dico2  
     creer_dicos 3, Dico3  
     creer_dicos 4, Dico4  

'----détection et suppression des doublons intercolonnes  
     For cptr = 1 To UBound(T_in)  
          cle = .Cells(cptr, 1)  
          If Dico2.exists(cle) Then Dico2.Remove (cle)  
          If Dico2.exists(cle) Then Dico3.Remove (cle)  
          If Dico2.exists(cle) Then Dico4.Remove (cle)  
     Next  
 End With  
'----restitutions des feuilles épurées  
     '---RESTITUTIONS PROVISOIRE COLONNE B POUR ESSAIS  
   Sheets(2).Range("B1").Resize(Dico2.Count, 1) = Application.Transpose(Dico2.keys)   
   Sheets(3).Range("B1").Resize(Dico3.Count, 1) = Application.Transpose(Dico3.keys) 
   Sheets(4).Range("B1").Resize(Dico4.Count, 1) = Application.Transpose(Dico4.keys)  
     
   '--- LIGNES A ACTIVER APRES ESSAIS  
   'With Sheets(2)  
     '.Columns("A").ClearContents  
    ' .Range("A1").Resize(Dico2.Count, 1) = Application.Transpose(dico2.keys)  
   'End With  
   'With Sheets(3)  
     '.Columns("A").ClearContents  
    ' .Range("A1").Resize(Dico3.Count, 1) = Application.Transpose(dico3.keys)  
   'End With  
   'With Sheets(4)  
     '.Columns("A").ClearContents  
    ' .Range("A1").Resize(Dico4.Count, 1) = Application.Transpose(dico4.keys)  
   'End With  
       
MsgBox " suppression des occurences communes terminée en " & Timer - start & " .sec"  
End Sub  

Sub creer_dicos(Num, Dico)  
Dim derlig As Long  
Set Dico = CreateObject("scripting.dictionary")  
With Sheets(Num)  
     derlig = .Columns("A").Find("*", , , , , xlPrevious).Row  
     For cptr = 1 To derlig  
          Dico.Add .Cells(cptr, 1).Value, 1  
     Next  
End With  
End Sub  


le classeur de test
https://www.cjoint.com/?3AmiEUzQ47D


suis absent jusqu'à 18-19h

Michel
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 744
12 janv. 2012 à 08:41
Salut michel,
Ton code est bon et qui plus est super rapide, cependant, il faut tenir compte du fait que le fichier du demandeur comporte 12 colonnes de données de A à L. Ca n'est pas explicite dans la demande en elle même, mais on s'en rends compte dans son code de macro, ici :
If LastLig3 > 0 Then .Range("A1:L" & LastLig3).Copy
0
michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 303
12 janv. 2012 à 09:39
ben, je me suis basé sur le post 8 ET 9 où il précise qu'il y a qu'une seule colonne !

qui + est il recopie la feuille 2 dans la feuille1, ce qui parait bizarre puisque aorès on a la m^me punition avec feuille3....
comme ca a l'air d'^tre un code recopié, faut attendre ce qu'il va dire
s'il y a plusieurs colonnes au lieu de supprimer dans le dico, il faudrait créer 3 tableaux de sortie avec if not dico;exists et un redim preserve tableau (peut-^tre une sous-macro paramétrée)

je te laisse le bébé: ici, temps exceptionnel sans nuages===> rando dans la montagne ardéchoise :o)
j'y va
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 744
12 janv. 2012 à 10:45
qui + est il recopie la feuille 2 dans la feuille1
J'ai un gros gros gros doute sur la recopie des lignes des feuilles 2, 3 et 4 sous les données feuil1... On est sur du Xl97 avec des 40 000 données par feuille!!!
La limite d'excel avant 2007 est de 65536 lignes, donc ...

comme ca a l'air d'^tre un code recopié, faut attendre ce qu'il va dire
tout à fait!!

ici, temps exceptionnel sans nuages===> rando dans la montagne ardéchoise :o)

Yen a qu'on d'la chance... Ici temps pourri, tout gris, et en plus visite de Sarko à Lille donc ===> bordel sur les routes et impossibilité de se garer...........
Bonne balade.
0
Bonjour Michel,

Je vous remercie pour l'intérêt que vous me portez,

J'ai essayé la macro ci dessus, mais ça me créé une erreur d'exécution '13' type incompatible.

La macro s'arrête ici : TablFeuil1 = Application.Transpose(.Range("A1:A" & DrLig).Value).
0
michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 303
13 janv. 2012 à 10:25
désolé mais cette ligne est dans la macro de Pijaku...

cette erreur se produit elle aussi sur cette ligne de mon code:
T_in = Application.Transpose(.Range("A1:A" & derlig1).Value) ?
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 744
Modifié par pijaku le 12/01/2012 à 11:43
Re-
En attendant le retour de sambrero, voici ma proposition (2,214844 secondes pour 45 000 lignes par feuille) :
!!!! ATTENTION : Lorsque l'on copie un code sur Internet, toujours travailler sur une copie de son document original. Surtout si on trouve un Delete dans ce code!!!!

Sub SupprimeDoublonsColonneA()  
'Sources d'inspiration:  
'boisgontierjacques : 
    'http://boisgontierjacques.free.fr/pages_site/Dictionnaire.htm#SupDoubBD  
'Michel_m :
    'http://www.commentcamarche.net/forum/affich-24145736-comparer-2-colonnes-sur-feuil-1-et-feuil-3#11  
Dim Dico, CleDico  
Dim TablFeuil1, TablAutresFeuilles  
Dim DrLig As Long, i As Long  
Dim Wsh As Worksheet  
Dim t  

t = Timer  
Application.ScreenUpdating = False  
Set Dico = CreateObject("Scripting.Dictionary")  
With Sheets("Feuil1")  
    DrLig = .Range("A" & Rows.Count).End(xlUp).Row  
    TablFeuil1 = Application.Transpose(.Range("A1:A" & DrLig).Value)  
    For i = 1 To UBound(TablFeuil1)  
        Dico(TablFeuil1(i)) = ""  
    Next i  
End With  
For Each Wsh In ThisWorkbook.Worksheets(Array("Feuil2", "Feuil3", "Feuil4"))  
    With Sheets(Wsh.Name)  
        DrLig = .Range("A" & Rows.Count).End(xlUp).Row  
        TablAutresFeuilles = Application.Transpose(.Range("A1:A" & DrLig).Value)  
        For i = UBound(TablAutresFeuilles) To 1 Step -1  
            CleDico = TablAutresFeuilles(i)  
            If Dico.Exists(CleDico) Then  
                .Rows(i).Delete  
            End If  
        Next i  
    End With  
Next Wsh  
MsgBox "Suppression terminée en : " & Timer - t & " secondes"  
Set Dico = Nothing  
End Sub  

Cordialement,
Franck P
0
michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 303
12 janv. 2012 à 18:35
Bon,nos propositions n'ont pas l'air d'intéresser Sambrero

On a du encore bosser pour rien...

a part ça, ballade magnifique! ;o)
0
Re,

Je réponds au post en rentrant du boulot.

J'ai essayé la macro ci dessus, mais ça me créé une erreur d'exécution '13' type incompatible.

La macro s'arrête ici : TablFeuil1 = Application.Transpose(.Range("A1:A" & DrLig).Value)
0
Si, si : vos propositions m'intéressent. Mais laissez moi le temps de rentrer du boulot lol.

Vous ne bossez pas pour rien, ne vous en faites pas.

Merci à vous.
0
Au fait, mes données dans mes colonnes A sont de ce type là :

01;05;07;10;16;17;18;19
01;05;07;10;16;17;18;20
01;05;07;10;16;17;19;20
01;05;07;10;16;18;19;20
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 744
13 janv. 2012 à 08:23
Bonjour,
@Michel_m : ballade magnifique Scrogneugneu... Là je t'envie vraiment !!

@Sambrero : n'hésite pas à donner de tes nouvelles régulièrement, j'ai aussi craint de n'avoir bossé pour rien. Ici une fois n'est pas coutume et c'est vraiment rageant... D'autant plus qu'une procédure comme celle demandée ne se fait pas en 10 minutes...

Bon L'incompatibilité de type erreur d'exécution 13 ne le fait pas avec TES données sur MA version d'excel (2003). Je suppute donc grandement ta version (97) de nous jouer des tours...
N'achèterais tu point une version plus récente? (je plaisante).

Je regarde ça dans la journée...
0
Non je n'achèterai pas une version plus récente dans l'immédiat.
Mais je pense y être obligé d'ici 2014 car mon windows XP ne fera plus l'objet de mise à jour de sécurité...
Effectivement, c'est certainement mon excel 97 qui m....
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 744
Modifié par pijaku le 13/01/2012 à 10:16
Re-
Alors après recherche, en ce qui concerne les variables tableaux sous Excel 97, j'ai trouvé ce tuto extrait de la FAQ XLD. Le 2- Les Tableaux Multidimensionnels aborde le cas d'Excel 97 et comment déclarer une variable tableau :
ATTENTION: : Sous Excel 97 et MAC, quand on affecte une plage de cellules à un tableau, il ne faut pas déclarer de variable Tableau mais tout simplement en Variant=> .Dim TabContributeurs et non Dim TabContributeurs()
Enfin, même si on affecte qu'une colonne=>TabContributeurs=Range("A1:A20"),on aura un tableau bidimensionnel de 20 lignes sur une colonne.(Ubound(TabContributeurs,1)=20 et Ubound(TabContributeurs,1)=1


De plus, je suppose, mais là dessus je n'ai rien trouvé, que "Application.transpose" pose problème sous 97. En effet, dans mon code précédent, les variables tableaux étaient belles et bien déclarées en Variant, donc à part ça, je ne vois pas ce qui gène l'exécution sous 97...

Le nouveau code tient donc compte de ceci, vous pourrez le constater dans les lignes en gras ci dessous.

Option Explicit 

Sub SupprimeDoublonsColonne1Version2() 

'Sources d'inspiration: 
'boisgontierjacques : 
    'http://boisgontierjacques.free.fr/pages_site/Dictionnaire.htm#SupDoubBD 
'Michel_m : 
    'http://www.commentcamarche.net/forum/affich-24145736-comparer-2-colonnes-sur-feuil-1-et-feuil-3#11 
'FAQ XLD : 
    'http://www.excel-downloads.com/forum/93353-vba-les-tableaux-le-ki-ki-de-zon.html 

Dim Dico, CleDico 
Dim TablFeuil1, TablAutresFeuilles 
Dim DrLig As Long, i As Long 
Dim Wsh As Worksheet 
Dim t 

t = Timer 
Application.ScreenUpdating = False 
Set Dico = CreateObject("Scripting.Dictionary") 
With Sheets("Feuil1") 
    DrLig = .Range("A" & Rows.Count).End(xlUp).Row 
    TablFeuil1 = .Range("A1:A" & DrLig) 
    For i = 1 To UBound(TablFeuil1, 1) 
        Dico(TablFeuil1(i, 1)) = "" 
    Next i 
End With 
For Each Wsh In ThisWorkbook.Worksheets(Array("Feuil2", "Feuil3", "Feuil4")) 
    With Sheets(Wsh.Name) 
        DrLig = .Range("A" & Rows.Count).End(xlUp).Row 
        TablAutresFeuilles = .Range("A1:A" & DrLig) 
        For i = UBound(TablAutresFeuilles, 1) To 1 Step -1 
            CleDico = TablAutresFeuilles(i, 1)
            If Dico.Exists(CleDico) Then 
                .Rows(i).Delete 
            End If 
        Next i 
    End With 
Next Wsh 
MsgBox "Suppression terminée en : " & Timer - t & " secondes" 
Set Dico = Nothing 
End Sub
--
Cordialement,
Franck P
0
Un grand merci car cela fonctionne à merveille.
Je vous remercie tout particulièrement, Pijaku et Michel, pour vous êtes donnés la peine de résoudre mon problème.
Il n'y a qu'un mot : vous êtes des Dieux.
MERCIIII Mon problème est Résolu.
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 744
Modifié par pijaku le 13/01/2012 à 12:56
Alors, juste pour éclairer notre lanterne à tous, je te demanderai de bien vouloir répondre à la question de michel_m ci dessus : ICI.
Juste pour voir ce qui pose problème à Xl97 et aussi par pure politesse...
0
Bonjour,
J'ai bien cliqué sur le lien, mais je ne vois pas sa question.
Pensez bien que j'ai l'intention naturelle d' y répondre, ne serait-ce bien sur que par politesse...
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 744
13 janv. 2012 à 13:31
Sa question suis ton post :

Bonjour Michel,
Je vous remercie pour l'intérêt que vous me portez,
J'ai essayé la macro ci dessus, mais ça me créé une erreur d'exécution '13' type incompatible.
La macro s'arrête ici : TablFeuil1 = Application.Transpose(.Range("A1:A" & DrLig).Value).


Et sa question :
désolé mais cette ligne est dans la macro de Pijaku...

cette erreur se produit elle aussi sur cette ligne de mon code:
T_in = Application.Transpose(.Range("A1:A" & derlig1).Value) ?


Remonte dans le sujet, tu verras...
0
michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 303
13 janv. 2012 à 13:45
J'ai l'impression que Sambrero n'a pas regardé mon code et ignore mes remarques (m'en f... un peu); déjà qu'il a pas répondu à la contradiction entre le nombre de colonnes qu'il m'a indiqué:1, et 12 dans le code

pour Pijaku: s'il y a qu'une seule colonne, on devrait gagner quelques 1/10 de secondes avec ce que j'avais codé; ce, simplement "pour la beauté du geste"

petit détail set dico=nothing est inutile (pas grave)
0