Copier/Coller de lignes si un id est le même dans 2 feuilles [Résolu/Fermé]

Signaler
-
Messages postés
23813
Date d'inscription
mardi 11 septembre 2007
Statut
Contributeur
Dernière intervention
24 janvier 2021
-
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

Messages postés
23813
Date d'inscription
mardi 11 septembre 2007
Statut
Contributeur
Dernière intervention
24 janvier 2021
6 590
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
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

CCM 63550 internautes nous ont dit merci ce mois-ci

Messages postés
23813
Date d'inscription
mardi 11 septembre 2007
Statut
Contributeur
Dernière intervention
24 janvier 2021
6 590
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
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
Messages postés
23813
Date d'inscription
mardi 11 septembre 2007
Statut
Contributeur
Dernière intervention
24 janvier 2021
6 590
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
>
Messages postés
23813
Date d'inscription
mardi 11 septembre 2007
Statut
Contributeur
Dernière intervention
24 janvier 2021

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
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
Messages postés
23813
Date d'inscription
mardi 11 septembre 2007
Statut
Contributeur
Dernière intervention
24 janvier 2021
6 590
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
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
Messages postés
23813
Date d'inscription
mardi 11 septembre 2007
Statut
Contributeur
Dernière intervention
24 janvier 2021
6 590
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