COMPARER CELLULES ET COPIER COLLER

Résolu
philric Messages postés 36 Date d'inscription jeudi 6 mai 2010 Statut Membre Dernière intervention 28 septembre 2012 - 2 mars 2010 à 12:07
philric Messages postés 36 Date d'inscription jeudi 6 mai 2010 Statut Membre Dernière intervention 28 septembre 2012 - 4 mars 2010 à 12:15
Bonjour

tout d'abord je n'y connais pas grand chose en VB! alors si quelqu'un pouvait me donner un coup de main..
j'ai un classeur excel avec 5 feuilles dans la feuille 5 colonne C (4210 lignes) je dois comparer chaque cellule avec chaque cellule colonne C (max 300 lignes) des feuilles 1,2,3,4 quand la cellule est identique il me faut copier la cellule colonne F correspondante de la feuille 5 et la coller dans la cellule de l'autre feuille
correspondante colonne H

j'ai trouve ce code qui sert a colorier des cellules et qui semble pouvoir être un bon départ mais je ne sait pas comment l'adapter

merci de votre aide
phil

Sub Macro1()
Dim i As Integer
i = 2
While i < 20
If Worksheets("Feuil5").Range("C" + CStr ).Value <> Worksheets("Feuil1").Range("C" + CStr ).Value Then
Worksheets("Feuil1").Activate
Worksheets("Feuil1").Range("C" + CStr ).Select
With Selection.Interior
.Pattern = xlSolid
.PatternColorIndex = xlAutomatic
.Color = 65535
.TintAndShade = 0
.PatternTintAndShade = 0
End With
End If
i = i + 1
Wend

26 réponses

philric Messages postés 36 Date d'inscription jeudi 6 mai 2010 Statut Membre Dernière intervention 28 septembre 2012
4 mars 2010 à 12:15
ok merci bien reçu maintenant je vais essayer de comprendre car il me servira dans d'autre situations
encore merci pour ton aide précieuse
phil
3
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
2 mars 2010 à 13:37
Bonjour,
je dois comparer chaque cellule avec chaque cellule colonne C (max 300 lignes) des feuilles 1,2,3,4

ceci n'est pas suffisamment clair !
Stricto sensu, celà voudrait dire que si par exemple la valeur de la cellule C10 de la feuille 5 était identique à la cellule C4 d'une autre feuille, tu serais dans le cas ! Et comment (par quoi) se traduirait alors :
copier la cellule colonne F correspondante de la feuille 5 et la coller dans la cellule de l'autre feuille correspondante colonne H

Et quid si plusieurs cellules d'une autre feuilles sont dans ce cas ?
Sois donc beaucoup plus précis !

____________________
Vous aimez Codes-Sources ? Il vous aide ? Cliquez ici pour l'aider à continuer
Cliquer sur "Réponse acceptée" en bas d'une solution adéquate est
0
philric Messages postés 36 Date d'inscription jeudi 6 mai 2010 Statut Membre Dernière intervention 28 septembre 2012
2 mars 2010 à 15:07
merci de me répondre
voila c'est ca je doit prendre une par une toutes les cellules de la feuille 5 de C1 a C4210 et comparer avec chaque cellule des colonnes C (C1 a C300) de la feuille 1,2,3,4 quand une cellule correspond je vais copier la cellule en H de la feuille 5 et je la colle dans la cellule F correspondante de la feuille correspondante, je sait pour moi c'est très clair mais sans le fichier ca l'est moins!!! pour donner un exemple plus concret disons que si je devais le faire manuellement ca donnerait ceci:
je regarde dans la feuille 5 cellule C1 je vais dans la feuille 1 je cherche si une cellule correspond, par exemple la C75 correspond, donc je retourne dans la feuille 5 je copie la cellule F1 je retourne dans la feuille 1 et je copie dans la cellule H75, ensuite je continue de contrôler toutes les cellule de la colonne C feuille1, puis ensuite la feuille 2 puis 3 puis 4, quand toutes les feuilles y sont passée je fait de meme avec la cellule C2 de la feuille 5 et ainsi de suite jusqu'à la cellule C4210

pour info le contenu des cellules peut être des chiffres ex: 001458 mais aussi avec des lettres ex: 002532BLACK

voila j'espère que c'est un peu plus clair
phil
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
2 mars 2010 à 15:14
Bon...
Je dois sortir...
Je vais te faire la chose à mon retour, mais une chose me parait plus que certaine : un tel traitement va être très gourmand en temps d'exécution ...
Je vais essayer de voir si je ne trouve pas une méthode pour tenter de réduire cette durée.
A plus ...


____________________
Vous aimez Codes-Sources ? Il vous aide ? Cliquez ici pour l'aider à continuer
Cliquer sur "Réponse acceptée" en bas d'une solution adéquate est
0

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

Posez votre question
philric Messages postés 36 Date d'inscription jeudi 6 mai 2010 Statut Membre Dernière intervention 28 septembre 2012
2 mars 2010 à 17:14
oui effectivement je me doute mais je peut le laisser tourner la nuit et de toutes façon ca prendra moins de temps et de mal de tête que si je le fait a la main!!!
phil
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
2 mars 2010 à 17:16
Hep là !
Me voilà de retour, mais je note au passage, avant de commencer, un point à élucider !
Ton truc est impossible à mettre en oeuvre si la colonne C de ta feuille 5 contient elle-même des doublons !
Si telo était le cas, en effet, que mettrre en colonne H de la "feuille correspondante" ?
Exemùple :
en C4 de feuille 5 : "toto"
en C20 de feuille 5 :"toto" (doublo, donc)
je compare C4 avec la colonne C de feuille 1 : je trouve "toto" en cellule C3. ==>> j'écris en colonne F de feuille 1 la valeur de H4 de feuille 5 ==>> OK
je continue dans ma colonne C de feuille 5 ==>> j'arrive à la cellule C20 ==>> je chercxhe dans feuille 1 à nouveau ==>> je retrouve donc "toto", toujours présent en C3 ===>> j'écris quoi en sa colonne F3 (déjà remplie en raison du 1er "toto" trouvé en C5 ?
Confirme-moi donc que ta colonne C de feuille 5 est sans doublons !
Dans le cas contraire : explique-moi clairement ce que tu aurais l'intention de faire exactement dans le cas de doublons présents sur ta feuille 5 !
____________________
Vous aimez Codes-Sources ? Il vous aide ? Cliquez ici pour l'aider à continuer
Cliquer sur "Réponse acceptée" en bas d'une solution adéquate est
0
philric Messages postés 36 Date d'inscription jeudi 6 mai 2010 Statut Membre Dernière intervention 28 septembre 2012
2 mars 2010 à 17:33
pas de soucis il n'y a pas de doublon et de toutes façons pour en être sur a 100% je ferais un contrôle avant, ca c'est facile a faire
phil
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
2 mars 2010 à 19:27
Je te propose alors ceci, que je pense le moins lent et le plus concis :

Private dico As Object ' >>>> à mettre tout en haut (partie déclarations)
Private Sub CommandButton1_Click()
  Dim i As Integer
  tablo Sheets(5).Range("C1:C10").Value '>> toi, remplace cette plage par la tienne (celle de Feuil 5à
  Set dico = CreateObject("Scripting.Dictionary")
  For i = 1 To UBound(tablo, 1)
      If Not dico.exists(tablo(i, 1)) Then dico.Add tablo(i, 1), i
  Next
  For i 1 To 4 '>> nous n'allons traiter qyue les feuilles 1 à 4
    fouillons i, "C1:C5", 5
  Next
  Set dico = Nothing
End Sub

Private Sub fouillons(NF As Integer, R As String, ifeuil As Integer)
 Dim i  As Integer
 letabl = Sheets(NF).Range(R).Value
 For i = 1 To UBound(letabl, 1)
    If dico.exists(letabl(i, 1)) Then
      Sheets(NF).Range("F" & i).Value = Sheets(ifeuil).Range("H" & dico(letabl(i, 1))).Value
    End If
 Next
End Sub


Voilà !
du condensé, hein ? et un peu de gymnastique
DXis-moi si c'est bien là ce que tu voulais ...




____________________
Vous aimez Codes-Sources ? Il vous aide ? Cliquez ici pour l'aider à continuer
Cliquer sur "Réponse acceptée" en bas d'une solution adéquate est
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
2 mars 2010 à 19:41
Et bmets donc Application.ScreenUpdating = false juste avant la boucle For dans l'évènement Click et remets le à Application.ScreenUpdating = true juste avant le End Sub de l'évènement Click (tu gagneras encore un peu sur le temps d'affichages)


____________________
Vous aimez Codes-Sources ? Il vous aide ? Cliquez ici pour l'aider à continuer
Cliquer sur "Réponse acceptée" en bas d'une solution adéquate est
0
philric Messages postés 36 Date d'inscription jeudi 6 mai 2010 Statut Membre Dernière intervention 28 septembre 2012
2 mars 2010 à 19:52
tu va dire que je suis nul ! mais je comprend pas ou tu veux que je mettre "Private dico As Object" en haut j'ai 2 champs 1 a gauche avec general et celui de droite declaration, CommandButton1_Click, fouillons mais je ne peut pas ecrire dans ces champs?
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
2 mars 2010 à 20:33
Ce n'est pas dans des "champs", qu'on écrit du code, mais dans des modules de code !

Ecoute :
1) tu ouvres ta feuille 5
2) tu y insères un boiuton de commande CommandButton1 (à choisir dans la zone ActiveX en cliquant sur insertion (tu dois au préalable avoir cliqué sur l'onglet "développeur" de ta barre d'outils
3) tu double cliques sur le bouton ainsi inséré
4) dans le module de code ainsi atteint ===>> tu colles la totalité de mon code
5) tu reviens dans Feuil5 et clique sur "mode création" (pour revenir en mode exécution

6) dès lors : en cliquant sur le bouton Commanbvutton1, tu déclenches les opérations que j'ai écrites....

PS : je crains fort, au vu de tes réactions, que l'essentiel de VBA t'échappes et que tu n'aies, dans de telles conditions, aucune chance de comprendre le code que j'ai écrit (il n'est pas simple !)
____________________
Vous aimez Codes-Sources ? Il vous aide ? Cliquez ici pour l'aider à continuer
Cliquer sur "Réponse acceptée" en bas d'une solution adéquate est
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
2 mars 2010 à 22:20
Rien ne t'empêche par ailleurs d'écrire la totalité de ce code, ainsi, là où tu avais écrit tyon premier code !

Private dico As Object ' >>>> à mettre tout en haut (partie déclarations)

Sub Macro1()
  Dim i As Integer
  tablo Sheets(5).Range("C1:C10").Value '>> toi, remplace cette plage par la tienne (celle de Feuil 5à
  Set dico = CreateObject("Scripting.Dictionary")
  For i = 1 To UBound(tablo, 1)
      If Not dico.exists(tablo(i, 1)) Then dico.Add tablo(i, 1), i
  Next
  For i 1 To 4 '>> nous n'allons traiter qyue les feuilles 1 à 4
    fouillons i, "C1:C5", 5
  Next
  Set dico = Nothing
End Sub

Private Sub fouillons(NF As Integer, R As String, ifeuil As Integer)
 Dim i  As Integer
 letabl = Sheets(NF).Range(R).Value
 For i = 1 To UBound(letabl, 1)
    If dico.exists(letabl(i, 1)) Then
      Sheets(NF).Range("F" & i).Value = Sheets(ifeuil).Range("H" & dico(letabl(i, 1))).Value
    End If
 Next
End Sub


Le résultat sera le même, sauf qu'au lieu de cliquer sur un bouton de commande, il te faudra lancer Macro1

voilà tout !
____________________
Vous aimez Codes-Sources ? Il vous aide ? Cliquez ici pour l'aider à continuer
Cliquer sur "Réponse acceptée" en bas d'une solution adéquate est
0
philric Messages postés 36 Date d'inscription jeudi 6 mai 2010 Statut Membre Dernière intervention 28 septembre 2012
2 mars 2010 à 22:25
j'ai un peu galerer pour le bouton maintenant il y est mais quand je clic dessus il se passe rien, je vais essayer l'autre solution par conttre j'ai toujours pas trouver ou mettre "Private dico As Object"
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
2 mars 2010 à 22:33
C'est pas vrai !
Tout en haut de la page de code, avant toute procédure (sub ou autre)
Il te suffit, là où tu avais écrit ta macro précédemment, d'écraser tout ton code par celui (le deuxième) que je t'ai montré !
Fais-moi ça calmement ... ce n'est pas la mer à boire !


____________________
Vous aimez Codes-Sources ? Il vous aide ? Cliquez ici pour l'aider à continuer
Cliquer sur "Réponse acceptée" en bas d'une solution adéquate est
0
philric Messages postés 36 Date d'inscription jeudi 6 mai 2010 Statut Membre Dernière intervention 28 septembre 2012
2 mars 2010 à 22:43
oui c'est bon alors, je l'ai coller dedans et il se trouve en haut avant tout autre chose, mais d'après ce que tu disais précédemment je pensais qu'il fallait le mettre ailleurs que dans le code! c'est toi qui m'embrouille!!;)
mais ca marche pas, en faisant pas a pas détaillé il va pas plus loin que la première ligne
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
3 mars 2010 à 07:56
1) Il n'y a aucune raison pour qu'il s'arrête à la 1ère ligne !
2) j'ai bien évidemment testé mon code ===>> fonctionne sans faille
Conclusion ? ===>> tu as dû faire une boulette !
Alors :
1) montre ton code (par copier/coller) en nous précisant dans quel module tu l'as écrit !
2) le mieux serait que tu mettes ton fichier, tel quel, à disposition ...

____________________
Vous aimez Codes-Sources ? Il vous aide ? Cliquez ici pour l'aider à continuer
Cliquer sur "Réponse acceptée" en bas d'une solution adéquate est
0
philric Messages postés 36 Date d'inscription jeudi 6 mai 2010 Statut Membre Dernière intervention 28 septembre 2012
3 mars 2010 à 12:40
bonjour

voici le code copié

Sub Macro1()
Dim i As Integer
tablo Sheets(5).Range("C1:C10").Value '>> toi, remplace cette plage par la tienne (celle de Feuil 5à
Set dico = CreateObject("Scripting.Dictionary")
For i = 1 To UBound(tablo, 1)
If Not dico.exists(tablo(i, 1)) Then dico.Add tablo(i, 1), i
Next
For i 1 To 4 '>> nous n'allons traiter qyue les feuilles 1 à 4
fouillons i, "C1:C5", 5
Next
Set dico = Nothing
End Sub

Private Sub fouillons(NF As Integer, R As String, ifeuil As Integer)
Dim i As Integer
letabl = Sheets(NF).Range(R).Value
For i = 1 To UBound(letabl, 1)
If dico.exists(letabl(i, 1)) Then
Sheets(NF).Range("F" & i).Value = Sheets(ifeuil).Range("H" & dico(letabl(i, 1))).Value
End If
Next
End Sub

(j'ai laissé C1:C10 volontairement pour le moment pour faire les essais)

il est dans la macro "Feuil5.Macro1" -> afficher les macros -> macros -> onglet affichage

je peut envoyer bien sur le fichier complet apparemment d'ici je peut pas mais si tu m'envois ton mail pas de problemes
phil
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
3 mars 2010 à 14:05
1) je ne vois pas, dans ce code, la déclaration de dico ! (et ne risque pas de fonctionner sans cette déclaration !)
2) je te donne une adresse email par MP.

____________________
Vous aimez Codes-Sources ? Il vous aide ? Cliquez ici pour l'aider à continuer
Cliquer sur "Réponse acceptée" en bas d'une solution adéquate est
0
philric Messages postés 36 Date d'inscription jeudi 6 mai 2010 Statut Membre Dernière intervention 28 septembre 2012
3 mars 2010 à 16:23
tu l'a bien recu?
phil
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
3 mars 2010 à 17:39
Je l'ai reçu et viens de l'"examiner.
Tu_ m'inquiètes à plusieurs titres :
1) j'ai trouvé mon code sur le click d'un bouton de commande CommandBox1 .... qui n'est pas posé sur ta feuille 5 ! *
Tu as de plus mis ce code dans deux modules bas (Module1 et module2) ... 2 fois le même code !
Mais voyons donc : ce code aurait normalement dû être mis dans le module de code de ta feuille 5 et commandbutton1 aurait dû être placé sur ta feuille 5 !
Pas étonnant que rien ne marchait au click, précédemment
Peu importe : on va l'oublier puisque tu as choisi de le faire par macro1 plutôt que par un bouton de commande ! (mais enlève alors ce code qui devient là totalement inutile, maintenant
!)
2) j'ai bien trouvé ta macro1 liéez à ta feuille5 et elle est bien écrite pour l'exemple que je t'avais donné (comparaison des cellules C1 à c10 de ta feuille 5 avec les cellules C1 à C5 de chacune de tes autres feuilles.
Tu as tout simplement repris ces plages au lieu de les remplacer par les tiennes !
Je veux bien, maintenant que j'ai ton classeur entre mes mains, faire à ta place cette adaptation à tyon classeur, mais ====>> il va falloir s'expliquer sur le dernier point, qui suit :
Voici ce que tu avais dit :
voila c'est ca je doit prendre une par une toutes les cellules de la feuille 5 de C1 a C4210 et comparer avec chaque cellule des colonnes C (C1 a C300) de la feuille 1,2,3,4 quand une cellule correspond je vais copier la cellule en H de la feuille 5 et je la colle dans la cellule F correspondante de la feuille correspondante

Cela veut dire que sur chacune des feuilles 1 à 4, lorsque l'on trouve en colonne C une valeur présente dans la colonne C de la feuille 5, on attribue en colonne F de la feuille concernée la valeur qui figure en colonne H de la feuille 5 ....
OK, mais oh, surprise : la colonne H de la feuille 5 de ton classeur ne comporte que des cellules vides (de même, d'ailleurs, que les colonnes F de tes autres feuilles) ! Remplacer un vide par du vide, ma foi ....
Tu ne te serais pas un peu mélangé les pinceaux, dans ce qui figure en citation ?
____________________
Vous aimez Codes-Sources ? Il vous aide ? Cliquez ici pour l'aider à continuer
Cliquer sur "Réponse acceptée" en bas d'une solution adéquate est
0
Rejoignez-nous