Fusion de 85 tableaux Excel identiques
Bonjour,
j' ai au départ dans un dossier 85 fichiers EXCEL dont la structure est parfaitement identique.
Il faudrait que j' agrège ces 85 fichiers en un seul autrement dit que viennent s'ajouter les lignes de chaque tableau les unes après les autres.
Ayant un niveau plus que basique dans EXCEL la seule solution que je connaisse est le "copier-coller" mais qui est totalement inapplicable vu le nombre de fichiers.
Existe t il une procédure automatisée qui me permette d' obtenir ce résultat ?
Merci d' avance pour votre aide.
Cordialement.
Salut Papewa,
Voici une proposition à tester.
Dans le code en place, tu dois modifier la ligne
MonRepertoire = "C:\Users\Lacy\Documents\Papewa\"par le chemin de ton répertoire sur ton ordinateur, sans oublier le dernier \ avant le guillemet.
De manière à pouvoir faire ceci, lorsque tu as ouvert le fichier Excel ci-joint, tape Alt + F11, tu cliques sur "Module 1", la ligne à modifier est l'avant-dernière visible dans l'image ci-dessous
En lançant la macro par le bouton "Report" en place, ça copiera les données de toutes les feuilles de tous les fichiers placés dans le répertoire défini dans la ligne de code ci-dessus (j'ai fait mes tests en plaçant tous les fichiers à copier dans le répertoire que j'ai nommé "Papewa").
Condition : Il doit y avoir une valeur dans la cellule A1 des feuilles à traiter (solution trouvée, sans connaitre tes fichiers, afin que mon code ignore les feuilles vides). Si ça crée des problèmes, il faudra voir comment corriger.
A te relire
NB : En ouvrant mon fichier par l'intermédiaire du Forum, il se peut que son nom soit modifié. Enregistre alors absolument ce fichier au nom "Résumé", et avec l'extention .xls autrement mon code va bloquer !!!!
Merci pour ton aide mais malheureusement il bloque sur la ligne en bleu avec le message : erreur d' exécution 1004 La méthode 'Open'de l' objet 'Workbooks' a echoue.
Set fso = CreateObject("Scripting.FileSystemObject")
MonRepertoire = "C:\Documents and Settings\Patrice\Bureau\CONCATENATION XLS\"
For Each f In fso.GetFolder(MonRepertoire).Files ' on passe en revue tous les fichiers de ce dossiers
Workbooks.Open MonRepertoire & f.Name
Fichier_traité = ActiveWorkbook.Name
For k = 1 To Sheets.Count ' on passe en revue chaque feuille du fichier traité
Sheets(k).Activate
DerLig_feuille_traitée = ActiveSheet.Range("A65536").End(xlUp).Row
If Range("A1") = "" Then
GoTo Etiquette
Else
Range("A1:IV" & DerLig_feuille_traitée).Copy Destination:=Workbooks("Résumé").Sheets("Résumé").Range("A" & Workbooks("Résumé").Sheets("Résumé").Range("A65536").End(xlUp).Row + 1)
End If
D' autre part chaque fois que je lance resume.xls et que je clique ensuite sur report j' ai le message suivant : resume.xls est deja ouvert. Si vous l' ouvrez à nouveau toutes vos modifications seront perdues. Voulez vous rouvrir resume.xls.
Si je réponds oui il boucle quand je clique sur report.
Si je réponds non il plante dans la macro.
Encore merci.
Re,
Lorsque tu démarres la macro, il faut que tous les fichiers du dossier "visité" soient fermés. Est-ce bien le cas ? A bien contrôler, spécialement si tu as fait un essai inachevé et qu'un fichier qui ne le devrait pas est resté ouvert.
Afin que ce soit plus facile, au début essaie éventuellement de ne placer que deux ou trois fichiers test dans le dossier "visité".
Je vois que ton dossier "visité" s'appelle "CONCATENATION XLS". Il s'agit bien d'un dossier et non pas d'un fichier ?
A titre d'exemple, voici comment j'avais mis en place les fichiers test chez moi : 1) Dossier visité = Papewa 2) Fichiers test Classeur1 et Classeur2 3) Emplacement = chemin sur mon ordinateur, à remplacer afin que ça fonctionne correctement chez toi, sans oublier le \ à la fin (pour y arriver, clic droit sur le fichier puis choisir "Propriété")
Essaie tout ça. Si jamais ça ne passe toujours pas, il peut éventuellement s'agir d'un problème de version Excel et là je ne sais pas si je pourrai encore t'aider.
Précise-moi encore si, lorsque ça bloque, l'un des fichiers placé dans le dossier visité aurait été ouvert sans avoir été refermé et si certaines données sont déjà transférées ou non.
A te relire.
EDIT DE 20:40 : Autrement essaie encore avec le nouveau fichier ci-joint. A nouveau, il faut l'enregistrer chez toi sous le nom précis "Résumé_V1" et modifier le chemin à la ligne
Const chemin = "C:\Users\Lacy\Documents\Papewa\"par ton propre chemin
Bonsoir,
je suis vraiment désolé pour une réponse aussi tardive mais je n' ai pas été là pendant quelques jours.
Je viens de tester à nouveau et ta solution répond parfaitement à ma demande et je t'en remercie encore.
Bonne soirée.
Bonjour,
Et Merci pour LA macro que je cherchais !
J'ai un souci cependant, tout se passe bien lorsque la macro est lancée mais le fichier d'arrivée est "bizarre".
En fait mon fichier de départ a 5 colonnes environ.
Dans le fichier d'arrivée concaténé, chaque ligne est fusionnée cad que les 5 colonnes de départ sont contenues dans une seule case la 1ère et les différentes informations sont alors séparées par des points virgules.
Merci pour votre aide
Salut et bienvenue sur le Forum,
Il aurait mieux valu ouvrir un nouveau fil et faire référence à cet ancien fil, mais bon, tant pis, on va continuer sur celui-ci
Peux-tu me fournir un fichier-source exemple et ton fichier-cible - avec ma macro, transformée ou non - avec si possible le résultat actuel non désiré ?
A te relire.
Afin de joindre un fichier .........
Bonjour,
Désolée j'ai commencé par chercher sur ce qui avait déjà été posté !
Alors,
Voici la macro que j'ai utilisé :
Sub Report()
Dim MonRepertoire As String, fso As Object, DerLig_feuille_traitée As Long, f As Object, Fichier_traité As String, k As Integer
Application.ScreenUpdating = False
Range("A2:IV65000").ClearContents
Set fso = CreateObject("Scripting.FileSystemObject")
MonRepertoire = "C:\Users\marion\Desktop\novembre 2013\pread-hosp\"
For Each f In fso.GetFolder(MonRepertoire).Files '
Workbooks.Open MonRepertoire & f.Name
Fichier_traité = ActiveWorkbook.Name
Sheets(1).Activate
DerLig_feuille_traitée = ActiveSheet.Range("A65536").End(xlUp).Row
If Range("A1") = "" Then
GoTo Etiquette
Else
Range("A1:IV" & DerLig_feuille_traitée).Copy Destination:=Workbooks("Résumé").Sheets("Résumé").Range("A" & Workbooks("Résumé").Sheets("Résumé").Range("A65536").End(xlUp).Row + 1)
End If
Etiquette:
Workbooks(Fichier_traité).Activate
Workbooks(Fichier_traité).Close SaveChanges:=False
Next f ' prochain fichier
End Sub
Le fichier initial a 5 colonnes : Nom, Prénom, Jour, XXX, YYY
et Tout se retrouve sur une seule case exemple : DUPONT;ALAIN ;15061984;XXX;YYY
Ce qui est bizarre ce sont que les différentes infos sont bien divisées avec des points virgules mais que comme dans l'exemple ci-dessous j'ai en plus des espaces. Je pensais utiliser un système de re-séparation je sais que ça existe car j'avais vu un de mes profs à la fac le faire sur une base de données mais je pense que je me suis plantée dans la macro originale et je sais pas trop où.
Merci beaucoup pour votre aide,
Yvouille a écrit :Peux-tu me fournir un fichier-source exemple et ton fichier-cible - avec ma macro, transformée ou non - avec si possible le résultat actuel non désiré ?
Amicalement.
Ah mais vous avez été trop rapide, je n'ai pas eu le temps de faire un fichier copie de mon fichier initial qui est très très volumineux (30 tableurs excel à l'origine ) !
Merci
Normalement on joint les fichiers nécessaires au message et tout arrive en même temps, raison pour laquelle je pensais que tu ne voulais pas joindre tes fichiers originaux.
Maintenant tu me fournis apparemment le fichier-cible, mais pas de fichier-source (ou le contraire ?). Dans tous les cas je constate que seule la colonne A comporte des données (regarde l’image de la colonne A agrandie ci-dessous) et je présume que les fichiers-source n’ont tous qu’une seule colonne.
On pourrait alors éventuellement ajouter des instructions à la macro afin que ces données soient distribuées dans différentes colonnes selon tes désirs avant ou après leur transfert dans le fichier-cible.
Tu comprends que j’aimerais avoir un fichier-source comme exemple ainsi qu’un fichier-cible avec le résultat actuel ?
A te relire.
Bonjour
Oui tout à fait ! Mais je vous ai envoyé un MP vous expliquant pourquoi cela me prend un peu de temps pour faire des exemples de fichiers source et cible
Je joins une copie de ce à quoi ressemble les différents fichiers originaux. En fait on a environ 30 fichiers originaux (un par jour) avec à chaque fois dans les 600 à 700 lignes qui ressemblent à la concaténation du fichier résumé mais où les infos sont, elles, bien sur plusieurs colonnes contrairement au fichier résumé qui me copie les infos mais enlève les colonnes.
Je débute en VBA !
Bonsoir,
Me revoilà !
Donc les fichiers source ont bien 5 colonnes mais pas le fichier cible une fois la VBA lancée comme le montre l'exemple.
Je sais pas où elle plante j'ai essayé de re-redistribuer les différentes infos dans les colonnes appropriées mais j'y suis pas arrivée.
Dur dur du coup !
Merci pour votre aide
Salut,
Je crois que la réalisation de tes souhaits est sur bonne voie, mais comme je manque un peu de temps actuellement, je ne te livre qu’une partie de la solution.
Tes fichiers source au format .csv sont ouverts par la macro à leur forme d’origine - c’est-à-dire avec toutes les données concentrées dans une seule colonne et séparées par des points-virgules - et le transfert se fait donc également ainsi. Tu peux le constater si tu fais défiler ta macro au pas à pas.
La solution serait alors de transférer toutes les données telles quelles et de les séparer à nouveau en une seule fois juste avant la fin de la macro, dans le fichier cible.
Mais avant de me lancer là-dedans, deux questions :
- Est-ce que tes fichiers sources sont tous placés dans le même dossier que ton fichier cible ? Ceci n’est pas obligatoire mais permettrait de simplifier la macro.
- Et surtout, est-ce que tes fichiers source ont bien tous une première ligne toujours identique de titres sur la ligne 1 et des données spéciales dès la ligne 2 ?
Après tes réponses, laisse-moi quand même un à deux jours pour te fournir la mienne
A te relire.
Bonjour,
Pas de soucis je suis patiente !
Je sais que c'est possible avec excel de re-séparer les infos surtout si le fichier cible les sépare bien avec des points-virgule.
Pour cela il suffit de faire "données" puis "convertir".
Par contre comme je suis vraiment intéressée par progresser en macro excel, je me demandais si mon souci ne venait pas du fait que j'ai changé une des variables de la fonction initiale car mes fichiers source n'ayant qu'une seule feuille j'ai enlevé la ligne demandant d'aller chercher toutes les pages du fichier initial.
Peut-être que cela vient de ma manip parce que mes fichiers source ne sont pas sur la même forme que mon fichier cible, dans mon fichier source, les infos ne sont pas séparées par des points virgules mais sont bien dans des colonnes différentes (5 colonnes).
Sinon pour les questions,
- mes fichiers source sont bien placés dans un même dossier (un par mois).
- mes fichiers source ont bien toujours la même première ligne identique car ils sont issus de requêtes préalable sur une base de données.
Merci encore pour ce site super et toutes les infos, pendant ce temps je continue à faire les leçons une à une en attendant de pouvoir contribuer un jour
Re-bonjour,
Tu dis être patiente alors que je te voyais plutôt directrice d’hôpital
Ma macro de départ n’était pas spécialement prévue pour ouvrir des fichiers .csv, donc je ne pense pas que quoi que ce soit que tu aurais pu y enlever pourrait avoir une influence sur la manière dont ces fichiers sont ouverts par elle (ma macro).
Je pense plutôt que ces fichiers .csv ont un format de base (toutes les informations dans une seule colonne, séparées par des points-virgules) et que tu peux les enregistrer à un autre format « de consultation », avec les données séparées. D’ailleurs, si tu veux enregistrer ces fichiers sous un autre nom, tu reçois un message te demandant avec quelles options tu désires les enregistrer et tu reçois une mise en garde qu’à certaines conditions, certaines données sont perdues.
Je te répète donc que je pense que ma macro ouvre ces fichiers sous leur format de base, quel que soit le format « de consultation » sous lequel tu les as enregistrés et sous lequel tu peux les consulter en les ouvrant toi (au lieu de ma macro). A nouveau, en faisant défiler cette macro au pas à pas, on voit bien que les fichiers source sont ouverts à un format différent que celui sous lequel on peut les consulter.
Tu m’as bien répondu que tous tes fichiers journaliers étaient dans un seul et même dossier, par contre tu n’as pas vraiment répondu à ma demande quant à savoir si tous ces fichiers source sont dans le même dossier que le fichier cible ?
Cordialement.
Bonjour,
J'ai bien regardé et je pense que tu as raison à savoir que le fichier excel .CSV de base me montre 5 colonnes mais qu'il ne doit s'agir ici que d'un affichage.
Par contre, crois-tu que la formule peut amener à de la perte de données avant concaténation cad à non recopie de l'ensemble ? Si oui, il faudrait que je vérifie et que je prenne le nombre de lignes de chacun des fichiers (un par jour) puis que je compte si le fichier résumé les as ?
Pour ce qui est de ta question je pense que oui parce que j'avais créé un fichier spécial regroupant ceux que je voulais rassembler en un seul. Par contre le fichier cible est sur mon bureau car j'ai essayé depuis de faire d'autres choses avec tcd etc. donc il est légèrement modifié.
Salut,
J’ai un petit peu insisté afin de savoir si tu pouvais placer ton fichier cible dans le même dossier que tes fichiers source car ça aurait simplifié la macro en ce sens qu’il n’y aurait pas eu besoin de modifier à chaque fois le chemin selon que l’on essaie ce fichier chez toi ou chez moi. On aurait pu utiliser l’instruction MonRepertoire = ThisWorkbook.Path et le tour aurait été joué, mais il aurait alors fallu modifier le reste du code de manière à ce que le fichier cible lui-même ne soit pas « visité », donc finalement ça aurait été tout autant compliqué. Alors oublie mon idée. Par contre, avec le code en place dans le fichier ci-joint, il faut absolument que tes fichiers sources soient seuls dans un dossier au bout du chemin précisé dans la macro.
Ma macro ci-jointe fait encore ceci en plus : elle efface tout d’abord les données en place en dessous des titres sur la feuille «Résumé» du fichier cible, elle reporte les données de chaque fichier source depuis la ligne 2 seulement (sans la ligne de titre) à la suite les uns des autres et – juste avant la fin – elle transforme les données regroupées dans la colonne A et les inscrits d’une manière séparée sur 5 colonnes.
Si tous tes fichiers source comportent des données, le passage If Range("A1") = "" Then est inutile, je l’avais placé pour une autre utilisation.
A te relire.