Macro VBA pour copier données

Bonjour à tous,

J’ai deux fichiers dont les titres de la ligne 3 correspondent (mais qui ne sont pas forcément au même endroit) et je souhaiterai copier les données de l’un à l’autre quand les titres sont les mêmes.
Genre j’ouvre mes deux fichiers, je clique sur un bouton et la macro récupère les données se trouvant sous les titres qui sont les mêmes entre les deux fichiers.
Je suis une vraie bille sur VBA et je n’arrive pas à grand chose.
Cela doit être faisable mais rien que d’écrire la macro doit être long j’imagine.
Quoiqu’il en soit, merci pour toute l’aide que vous pourrez, c’est formidable ce genre de site d’entre-aide.
Je joins les deux fichiers à mon post. Encore une fois merci.

Fichier test 1.xlsx (137,3 Ko)
Fichier test 2.xlsx (981,7 Ko)

Bonjour

Ci-joint ma proposition

Après avoir ouvert tes 2 fichiers (« Fichier test 1.xlsx » source et « Fichier test 2.xlsx » cible) avec pour chacun deux l’onglet à utiliser actif à l’écran à partir du fichier joint ci-après cliques sur le bouton « Traitement »
Une boite de dîalogue te demande de saisir à partir d’une liste le numéro du classeur source puis une deuxième boîte de dialogue de saisir le numéro du classeur cible

Ces 2 saisies effectuées va vérifier la recopie dans le classeur cible
Celle-ci s’effectue à partir de la première ligne libre dans ce classeur de l’onglet actif à l’écran

Fais des tests et dis moi

Outil copie.xlsm (21,2 Ko)

1 « J'aime »

Bonsoir,

Je ne sais que dire, cela semble fonctionner parfaitement. Point intrigant tout de même, mais facilement corrigeable, les lignes du fichier recevant les données s’agrandissent exagérément après la macro, sans aucune raison. Mais comme je l’ai dit, ça se règle facilement après.
Il faut encore que je teste ça demain avec d’autres fichiers, mais sinon c’est nickel.
Merci vraiment beaucoup, cela va m’être beaucoup utile.

Bonsoir
Merci pour ce retour
Pour l agrandissement des lignes de l onglet fichier cible la macro n est pas concernée car celle-ci ne ramène que les valeurs rien d autre et donc en aucun cas un quelconque format
Fais des tests avec d autres fichiers cibles pour voir ce qu il en est
Enlèves le paramétrage retour à la ligne dans le format de toutes les cellules ainsi les lignes devraient rester avec leur hauteur d origine
N oublies de valider ma réponse un plus sympathique
Donnes moi des nouvelles de tous tes tests
A bientôt pour te lire

1 « J'aime »

Bonjour,

Après quelques tests, je me suis aperçu de certaines choses. Sur les 2 fichiers que j’ai fourni, il y en a un avec deux colonnes vertes. Si j’enlève ces colonnes (sur certains fichiers que j’ai, elles n’existent pas, d’où mon test sans ces colonnes), les résultats sont décalés. Avec les deux fichiers que je joins à ce message, il y a aussi un décalage. Je ne sais quel est le souci.
En fait, ce que je voudrai, c’est que, quel que soit l’ordre des colonnes entre les deux fichiers, la macro reprennent les données dont les titres sont commun entre les deux fichiers (et ce même s’il y a des décalages entre les fichiers).
Enfin, petite question, que se passe t-il s’il y a plus de 24 lignes de données (genre 100 par exemple)?
Je me permets de vous remercier une fois de plus.
Blousons.xlsx (999,2 Ko)
IT COUNTRY MEN DB - P.xlsx (132,1 Ko)

Bonjour

« Si j’enlève ces colonnes (sur certains fichiers que j’ai, elles n’existent pas, d’où mon test sans ces colonnes), les résultats sont décalés »

Normal j’ai tenu compte du décalage qui était présent dans les 2 premiers fichiers fournis

Le traitement récupère les données du fichier source dans les colonnes où elles se trouvent pour les recopier dans le fichier cible dans les colonnes appropriées

Celles-ci ne doivent pas être fluctuantes car elles sont figées dans le code

Dans le cas contraire
Soit elles sont dans le même ordre à l’identique dans les 2 fichiers reste à déterminer la première colonne pour chacun qui peut être par la recherche ligne 3 de son nom d’entête ou par boîte de dialogue la saisie de sa lettre (2 boîtes de dialogue qu’il faudra alimenter) ou à défaut à mettre dans 2 cellules de l’outil

Soit l’ordre de celles-ci est aléatoire donc d’un fichier à l’autre différent nécessité pour chacune d’entre elles d’adopter la disposition ci-dessus avec un alourdissement du temps de traitement incontournable chacune devant être traitée de manière indépendante l’une après l’autre

Autre solution avant la recopie mettre les colonnes en rapport avec les besoins du traitement exemple pour ces 2 derniers fichiers réaliser le même décalage que pour les 2 premiers transmis

Bien savoir que toute recherche d’un libellé nécessite que celui-ci soit présent dans l’onglet où il s’effectue avec une écriture strictement identique à la casse prés et présence des mêmes espaces y compris à ses extrémités au risque d’échouer

A toi de voir en sachant q une automatisation offre l’avantage d’une sécurité rapidité et confort mais nécessite une rigueur du contexte dans lequel il s’exécute

Merci de me donner celui-ci avec mes différentes propositions

En ce qui concerne le nombre de lignes le traitement prend en charge l’intégralité de celui-ci quelque soit son importance mais seulement à partir de la ligne 4 après celle des entêtes

1 « J'aime »

Bonsoir,

Je vais tenter d’expliquer plus clairement ma problématique.
J’ai plusieurs fichiers qui se ressemblent et dont certains titres correspondent exactement (ceux de la ligne 3). Le problème, c’est que les titres ne sont pas tous placés au même endroit selon le fichier (mais ils sont toujours en ligne 3). Parfois il y a des colonnes en moins, parfois en plus. Certains titres sont présents sur certains fichiers, d’autres non.
J’aimerai récupérer les données d’un fichier plein vers un fichier vide, en ne prenant uniquement que les données dont les titres matchent.
Par exemple il y a le titre « external_product_id » en ligne 3, colonne D sur le fichier 1, et le titre « external_product_id » en ligne 3, colonne D sur le fichier 2. J’aimerai que la macro récupère les données de la colonne D du fichier 1, er les place dans la colonne A du fichier 2.

Et désirerai la même chose, même s’il existe des différences de placement sur les titres entre les fichiers.
Par exemple il y a le titre « brand_name » en ligne 3, colonne D sur le fichier 1, et le titre « brand_name » en ligne 3, colonne A sur le fichier 2. J’aimerai que la macro récupère les données de la colonne D du fichier 1, er les place dans la colonne A du fichier 2.

Je ne sais pas si je suis bien clair. Ce que vous avez réalisé est déjà beaucoup, encore une fois merci de votre aide. Si vous avez besoin de fichiers pour faire des tests, dîtes-le moi.

On ne pas demander n importe quoi à une macro il lui faut un minimum pour fonctionner notamment les colonnes sources à utiliser vers qu’elles colonnes cible à alimenter ce n est pas elle qui pourra le deviner
Donc il faut trouver un fonctionnement qui puisse lui donner ces informations nécessaires à son fonctionnement
Compte tenu de ce que tu décris quant aux différents contextes qui peuvent se présenter je ne vois qu une solution mettre dans une colonne de l outil colonne A par exemple la liste des colonnes source avec leur lettre respective en colonne B la liste des colonnes cibles en correspondance avec leur lettre
Ainsi le traitement passera en revu chaque cellule de la colonne A pour récupérer la lettre de la colonne source à traiter avec en colonne B même ligne celle de la cible à alimenter

Cela nécessite de ta part pour chaque traitement à réaliser une vérification avec ou non mise à jour de ces 2 colonnes

C est la seule solution que te propose compte tenu de l instabilité de tes fichiers à faire correspondre

À toi de voir et me dire

« Par exemple il y a le titre « brand_name » en ligne 3, colonne D sur le fichier 1, et le titre « brand_name » en ligne 3, colonne A sur le fichier 2. J’aimerai que la macro récupère les données de la colonne D du fichier 1, er les place dans la colonne A du fichier 2. »

C est une solution qui ne peux fonctionner que si il y a une grande rigueur dans l écriture des libellé à la casse et espaces à l intérieur ou en bout près
Je doute fortement que cela soit le cas au regard de la description que tu me fais
Je pense que la solution des 2 colonnes dans l outil pour établir les correspondances de celles-ci source et cible est plus prudente pour une résultat pérenne sans faille
Dans l exemple que tu donnes « brand_name » première colonne il faudrait mettre D deuxième colonne À ainsi le traitement recopierai toutes les données du fichier 1 colonne D vers le fichier 2 colonne A

1 « J'aime »

Je crois comprendre votre solution et cela me semble assez facilement réalisable. Enfin si j’ai bien compris…
Outil copie.xlsm (22,3 Ko)

Je vous joins votre fichier Outil avec dedans ce que j’ai compris de votre post.
Si j’ai bien compris, il simplement me manquer une formule Excel pour matcher les colonnes quand les fichiers seront vraiment différents l’un de l’autre.
Bonne soirée à vous.

Bonjour

Je te propose 2 outils avec pour chacun une approche différente

Le premier outil : « Outil copie intitulés.xlsm »
Sur la base du premier fichier cherche sur la ligne 3 du deuxième fichier l’intitulé de la colonne traitée
Si celui-ci est trouvé (attention à sa structure il doit être à l’identique à la casse prés avec les même espaces si il y en a y compris aux extrémités) dans l’outil l’intitulé est recopié en colonne A la colonne source traitée en colonne B la colonne cible du fichier cible en colonne C
Les données sources de la colonne traitée sont recopiées en colonne cible déterminée

Tu constateras comme je l’avais souligné dans une de mes réponses que le temps de traitement est considérablement rallongé (de l’instantané avec le premier outil à 30 secondes environ et ce pour 24 lignes)
C’est la contrainte à accepter pour bénéficier de cette approche avec en plus la rigueur indispensable nécessaire pour un résultat correct concernant l’écriture des intitulés

Le deuxième outil : « Outil copie colonnes.xlsm »
Une liste est constituée colonne A/B/C dans celui-ci des intitulés colonne A avec leur lettre de colonne source en colonne B cible en colonne C (seules les données des colonnes B et C interviennent dans le code celles de la colonne A ne sont qu’informatif)

Cette liste peut être établit manuellement où par l’intermédiaire d’un traitement déclenché par le bouton « Correspondance colonnes »
A son déclenchement 2 saisies à réaliser concernant les numéros des fichiers sources et cibles puis une recherche est effectuée sur la base des intitulés ligne 3 du premier sur la ligne 3 du deuxième
avec toujours cette nécessité d’une grande rigueur de ceux-ci au risque de ne pas être détectés en cible

une fois la liste confectionnées elle peut être corrigée à la main

La liste ainsi établit le bouton traitement s’appuiera dessus pour recopier toutes les données d’une colonne source dans la colonne cible correspondante indiquée dans celle-ci

Le temps de traitement est comparable au précédent aucune amélioration à ce niveau
Le plus non des moindre est le verrouillage des correspondances entre colonnes source et cible puisque établit et vérifié avant l’exécution

Tu as ces 2 manières de procéder pour l’enrichissement de tes fichiers

Testes et à toi d’opter pour celui qui te convient le mieux

Fais moi un retour

Outil copie intitullés.xlsm (29,7 Ko)

Outil copie colonnes.xlsm (32,4 Ko)

1 « J'aime »

Bonsoir,

Désolé de ce retour tardif. Je n’ai malheureusement pas pu encore tester les outils car j’ai dû gérer une urgence ces derniers jours. Je vous tiens au courant demain ou au pire jeudi.
Une nouvelle fois, merci de votre aide.

Bonjour,

Je viens de tester l’option 2 et cela marche nickel. C’est exactement ce que je cherchais. En deux clics, c’est plié. Je ne sais pas comment vous remercier pour votre aide. Franchement merci, merci beaucoup.

Bonjour
Déjà le grand sourire exprimé dans ta réponse est le meilleur des remerciements !!!

Rajoutes la validation de ma réponse et je serais comblé

Au plaisir de t’aider à nouveau

1 « J'aime »

Ce sujet a été automatiquement fermé après 30 jours. Aucune réponse n’est permise dorénavant.