Copier/Coller de lignes si un id est le même dans 2 feuilles

Résolu/Fermé
Stan6363 - 16 janv. 2014 à 15:25
eriiic Messages postés 24570 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 23 avril 2024 - 17 janv. 2014 à 12:59
Bonjour,

Comme la plupart des personnes qui postent un sujet ici, j'ai un petit problème.
J'aimerai créer une macro (fonction) qui en fonction d'un identifiant dans une colonne dans deux feuilles différentes copie dans une troisième feuille les lignes de la première feuille si l'identifiant est dans la liste de la deuxième feuille. (Je vais expliquer un peu plus le principe... )

Dans la feuille 1, j'ai en colonne : Date I Info 1 I ID I Info 2 I Info 3
Dans la feuille 2, j'ai en colonne : Info 4 I ID

Le resultat attendu en feuille 3 (appelée Merge) : Date I Info 1 I ID I Info 2 I Info 3 I Info 4
Sachant que je ne veux que les lignes où l'ID a été trouvé dans la feuille 2.

Donc en gros, j'ai plus de lignes dans la feuille 1, et j'aimerais en fonction des ID de la feuille 2 copier les lignes de la feuille 1 dans la feuille 3 en ajoutant les données (Info 4) dans la dernière colonne.

Petite précision, dans la feuille 1 (et 2) les ID sont répétées plusieurs fois avec des Dates, Infos 1, 2 et 3 différents. Mais les Infos 4 sont toujours liées à un ID.

Ce que je ne veux pas :
C'est que si je trouve plusieurs fois l'ID dans la feuille 2 ça me copie plusieurs fois une ligne de la feuille 1.

Je ne sais pas si tout est clair... :s Mais je veux bien donner un peu plus d'explications s'il faut !!

En tout cas, un très grand merci pour votre aide et pour le temps que vous prennez au moins pour me lire.

Stan6363

4 réponses

eriiic Messages postés 24570 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 23 avril 2024 7 213
16 janv. 2014 à 21:03
Re,

Sélectionner Sheet1 qui ne doit pas avoir de filtre automatique, et lancer la macro Traiter.
Travaille en mémoire vu le nombre de lignes des 2 sheets (est bcp plus rapide)
Je me sers de la colonne Sheet1!F sensée être libre comme dans le classeur de travail.
https://www.cjoint.com/c/DAqu635O2VZ
Regarde si c'est comme tu voulais et s'il n'y a pas d'erreur.

eric
1
eriiic Messages postés 24570 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 23 avril 2024 7 213
16 janv. 2014 à 16:03
Bonjour,

pourquoi en vba?
Une formule dans une colonne sur laquelle tu pourras filtrer et finir par un copier-coller ne suffit pas ?

Déposer un fichier de travail sur cjoint.com et coller ici le lien fourni.

eric
0
Bonjour eriiic,

Dans un premier temps, merci pour l'intérêt que vous portez à ma question.
Plusieurs raisons expliquent le fait que je veuille une macro et pas une simple formule :
- Avec une formule VLookup par exemple, le temps de traitement serait trop long (dans un tableau environ 250000 lignes et dans l'autre 18000)
- Ensuite, j'essaye d'automatiser un fichier dans lequel il y a déjà un import des 2 sheets, et la génération d'une PivotTable automatique.

Voici un exemple avec les données qui peuvent être en entrée.
http://cjoint.com/?DAqqCIrxU2x

D'avance un grand merci

Stan6363
0
eriiic Messages postés 24570 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 23 avril 2024 7 213
16 janv. 2014 à 17:22
Re,

Avec une formule VLookup par exemple, le temps de traitement serait trop long
Les fonctions natives d'excel sont souvent beaucoup plus rapides que du vba, tant qu'elles ne sont pas matricielles.

C'est que si je trouve plusieurs fois l'ID dans la feuille 2 ça me copie plusieurs fois une ligne de la feuille 1.
A l'inverse, quand on trouve plusieurs fois l'ID en feuille1 que fait-on ?

eric
0
Stan6363 > eriiic Messages postés 24570 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 23 avril 2024
16 janv. 2014 à 17:31
Re,

Si je trouve plusieurs lignes identiques dans la feuille 1, je les copie à chaque fois car souvent une info est différente (peut être pas dans mon exemple...)

Merci beaucoup !

Stan6363
0
Re,

Déjà un grand bravo... En one shot, c'est bon !!! Et un grand merci !!!!

Cependant, il faut que j'essaye sur mon fichier maintenant en adaptant le code.
Et comme je ne recopie pas bêtement ce que tu as fait, j'avais quelques questions.. (Désolé de t'embêter)
Premièrement, quand tu crées ton dictionnaire avec les valeurs de la sheet2, pourquoi tu refais une boucle for derrière sachant que les valeurs sont déjà en mémoire ?

Et ensuite sur la sheet 1, pourquoi ne pas créer un dictionnaire avec la dernière colonne Info3 ? ou alors pourquoi ne pas se limiter à 3 colonnes sachant que l'identifiant est dans la troisième ?

(Bien entendu ces questions sont pour ma compréhension personnelle...)

En attendant de te lire, je vais essayer d'appliquer ton code à mes données.

Stan6363
0
eriiic Messages postés 24570 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 23 avril 2024 7 213
Modifié par eriiic le 16/01/2014 à 22:02
Premièrement, quand tu crées ton dictionnaire avec les valeurs de la sheet2, pourquoi tu refais une boucle for derrière sachant que les valeurs sont déjà en mémoire ?
Pour créer la liste sans doublons dans le dictionary.
Il faut bien que je balaye toutes les valeurs pour ne retenir qu'un exemplaire.
Pour aller plus vite je lis en 1 fois toutes les valeurs sur la feuille, que je stocke dans une variable. Le travail se fait ensuite en mémoire.
Le dictionary est l'objet le plus pratique et le plus rapide pour les listes sans doublons.
Je te conseille de te renseigner dessus sur google.

Et ensuite sur la sheet 1, pourquoi ne pas créer un dictionnaire avec la dernière colonne Info3 ? ou alors pourquoi ne pas se limiter à 3 colonnes sachant que l'identifiant est dans la troisième ?
J'ai besoin de toutes les lignes pour mettre en correspondance Infos4.
Le dictionary n'est pas adapté pour ça.
Ceci dit, effectivement dans data (c'est une variable tableau, pas un dictionary, c'est totalement différent) on pourrait se contenter de la colonne 3. Ca économisera de la mémoire, pas vraiment de temps.
Fait vite fait, c'est la force de l'habitude qui m'a fait prendre les 3 colonnes...

Par curiosité tu me diras combien de temps pour traiter tes milliers de lignes.

eric
0
Bonjour Eric !

Encore un grand merci, c'est exactement ce que je voulais !!!
J'ai adapté un peu le code pour qu'il soit plus maléable (paramètres dans la fonction) mais c'est très bien.
Pour le temps de traitement, c'est vraiment très court, c'est aproximativement 2-5 secondes...
Donc vraiment rapide !!!

Merci beaucoup et bonne journée !!!

Stan6363
0
eriiic Messages postés 24570 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 23 avril 2024 7 213
17 janv. 2014 à 12:59
Bonjour,

paramètres dans la fonction
? il n'y a pas de fonction. Enfin, ça doit être une question de vocabulaire...
Si tu t'en sors c'est très bien.
Pour le temps de traitement je ne suis pas mécontent ;-)

Bonne continuation
eric
0