Copie de plusieurs classeurs vers un classeur unique
Bonjour à tous,
Tout d'abord je tiens à m'excuser, je pense que des topics similaires ont déjà du être traités.
Je suis totalement néophyte en VBA, puisque cette demande est ma première tentative sur le sujet.
J'ai parcouru le forum, mais pour l'instant, je dois avouer ne pas comprendre grand chose.... C'est pourquoi je me permets de vous demander votre aide
Mon problème est le suivant:
Je suis désormais l'heureuse propriétaire d'un ensemble de répertoire dont la nomenclature est la suivante:
C:\MOI\Lot\Numéros_de_semaine (nous sommes actuellement en semaine 39 donc par exemple: c:\Moi\LOT\S39)
à la racine de ce répertoire se trouve 1, 2 ou 3 fichiers excel (ce sont les lots acceptés pour la semaine donnée).
A la racine de ce même répertoire se situe aussi généralement un répertoire nommé old (c:\Moi\LOT\S39\old dans mon exemple) qui lui intègre les lots rejetés.
Chaque fichier excel comporte 5 onglets nommés de manière identique. Chaque onglet a une première ligne de titre, mais le volume de ligne entre chaque onglet et fichier est totalement différent.
Par ailleurs, il y a de temps en temps un formule qui se glisse dans certain fichier.
Ce que je souhaiterais (si cela est possible) serait de "concatener" tout les fichiers (uniquement les valeurs) en un un seul (avec 5 onglets aussi) avec une colonne supplémentaire qui indiquerait le fichier de copie source.
Voila je ne sais pas si je suis très claire. Mais en tout cas merci par avance d'avoir pris le temps de me lire
Ci-dessous des fichiers modèles
Salut et bienvenue sur le Forum,
Effectivement que des demandes similaires à la tienne ont déjà été traitée sur le Forum, mais je dirais moins de 3'000 fois quand même
J’ai compris que le fichier présenté est l’un des fichiers dans lequel sont listés les lots acceptés pour la semaine donnée (fichiers à ‘visiter’) et que tu voudrais récapituler ces différents fichiers dans un autre fichier à créer de toutes pièces.
Il faudrait alors avoir quelques précisions de plus.
Tout d’abord tu devrais nous fournir 2 fichiers exemples des fichiers à visiter afin que l’on voie entre autre comment ils sont nommés exatement (je présume qu’ils ne s’appellent pas tous ‘Lots’). Afin de ne pas compliquer trop la chose, place seulement 2 à 5 lignes par onglets, ça suffit amplement.
Ensuite tu devrais nous fournir un exemple manuel de la manière dont devrait se présenter ton fichier récapitulatif (tu comprends maintenant pourquoi peu de lignes suffisent) à la fin de la macro à créer – c’est-à-dire à la fin du récapitulatif - avec toutes les données à reporter. Indique nous également immédiatement comment devrait se nommer ce fichier récapitulatif.
J’ai également compris qu’on ne s’occupait pas de ce fichier ‘old’ ou bien ?
A te relire.
Bonjour à tous, et bonjour Yvouille,
Voila 2 fichiers sources type et un fichier type cible.
Comme vous pouvez le voir... eh bien il n'y a pas de norme de nommage
Par ailleurs, ma demande concerne les fichiers validés ainsi que les fichiers old
Mille merci
Re,
A voir tes fichiers, je pense que ce sera un jeu d’enfant de transférer les données d’un fichier à l’autre ……….. lorsque l’on se sera compris sur la configuration de ton arborescence.
Pour l’instant j’imagine un fichier que l’on pourrait nommer « Base Récapitulation ». Dans ce fichier se trouveraient toutes les macros nécessaires au bon déroulement de l’affaire. Il faudrait placer ce fichier dans un dossier quelconque, je te propose que l’on parle du dossier « Dossier Récapitulation », à moins que tu préférerais placer ce fichier dans le dossier de base déjà existant « LOT » ou un autre dossier que tu m’indiquerais. Le début du chemin (C:\Moi\ ???) n’a pas trop d’importance, puisqu’une macro peut lire ça toute seule. Je n’ai pas compris si dans ce dossier de base tu as des sous-dossiers qu’il faudrait visiter ou non.
Je n’ai pas compris non plus si, lorsque tu veux faire ta récapitulation hebdomadaire, si tu as toutes sortes de fichiers dans le dossier que j’ai appelé « Dossier Récapitulation » (ou sous-dossiers ?) ou seulement ceux de la semaine à traiter.
A) Si tu as toutes sortes de fichiers mais uniquement dans un seul dossier, tu ouvrirais alors le fichier « Base Récapitulation », tu lancerais les macros en place qui te demanderaient quelle est la semaine que tu veux traiter et le code irait visiter tous les fichiers source. Il faudrait alors que l’on puisse trouver le moyen de déterminer quels sont les fichiers de la semaine ou non, soit en le précisant dans le nom des fichiers, soit en allant rechercher une information à ce sujet dans tous les fichiers présents (mais ça risque d’être long). Pour l’instant, je n’ai pas vu dans le nom de tes deux fichiers source, ni dans leur feuilles, la possibilité de déterminer de quelle semaine il s’agissait.
B) Si tu n’as que les fichiers de la semaine dans ce seul dossier, on pourrait lancer le code sans demander quels est la semaine à traiter et visiter tous les fichiers.
C) Si tu as des dossiers et des sous-dossiers, il faut que tu me précise tout ça, mais plutôt en partant du dossier de base dans lequel serait placé le nouveau fichier « Base Récapitulation » et non pas en partant de C:\.........
Dans tous les cas, ce fichier « Base Récapitulation » exécuterait son travail, créerait un nouveau fichier qu’il nommerait par exemple
« Récapitulation Semaine xx » et qu’il archiverait à l’endroit de ton arborescence que tu me préciserais puis se refermerait sans être modifié, prêt pour une prochaine utilisation.
Alors, tu m’expliques un peu mieux ton arborescence ?
A te relire.
Merci Yvouille de ton implication
Donc mon arborescence est la suivante:
C:\Moi\Lot
Dans le répertoire Lot, se trouve 52 répertoires (S01 à S52 (un répertoire pour chaque semaine de l'année)) et aucun fichier Excel
Dans chacun de ces 52 répertoires (sauf exception) se trouve:
- un répertoire old contenant 1 à 9 classeurs xls (les fichiers rejetés)
- un à trois classeurs xls (les fichiers acceptés)
Tous ces répertoires sont à visiter et tous les classeurs sont a concaténer (rejetés et acceptés)
Ce que je souhaite faire est une récapitulation annuelle.
Pour la solution A que tu proposes: c'est le répertoire qui porte le nom de la semaine
Pour l'emplacement du fichier cible, je pensais à C:\Moi\Lot\Dossier Récapitulation\Base Récapitulation
J'espère que ma réponse correspond à tes questions
Au plaisir de lire ta réponse
Salut,
Je te présente ici un fichier « premier jet ».
Afin de ne pas compliquer trop la macro, il vaudrait mieux placer ce fichier dans ton dossier LOT. Si ça ne te convient vraiment pas, on pourra voir par la suite pour modifier ce qui est nécessaire. A moins que tu déplaces ce fichier dans le dossier LOT lorsque tu en as besoin (une fois par année ?).
Ce fichier crée automatiquement de nouveaux fichiers nommés « Récapitulatif xxxxxxx » et les place dans le dossier LOT également. Si nécessaire, il pourrait les placer à une autre adresse dans ton arborescence.
Lorsque tu ouvres le fichier « Base Récapitulation » ci-joint et que tu cliques sur le bouton en place, la macro va visiter tous les fichiers Excel du dossier LOT et de ses sous-dossiers et sous-sous-dossiers – à l’exception des fichiers dont le nom commence par
« Récapitulatif » - et en reporter les données inscrites sur les feuilles nommées « Glob ». Si cette partie du travail te convient, on verra par la suite pour les autres feuilles.
Comme déjà dit, lorsque le report de toutes les feuilles « Glob » est fini, le fichier de base se referme sans modification et le fichier nouvellement créé est visible à l’écran. Dans ce nouveau fichier, la feuille « Base » a été effacée, donc tu ne trouves plus de bouton non plus. Pour l’instant ces nouveaux fichiers portent un nom incluant l’heure précise de manière à ce que l’on puisse effectuer autant d’essais que l’on veut sans qu’une fenêtre s’ouvre afin de dire : « Le fichier xxxx existe déjà, voulez-vous le remplacer ? ». A toi de me dire par la suite comment doivent s’appeler ces nouveaux fichiers.
Dans la récapitulation, j’ai préféré séparé les noms des fichiers et les chemins auxquels ils ont été trouvés. De plus je n’ai indiqué que le chemin en raccourci pour une meilleure lisibilité. Si quoi que ce soit ne te convient pas, on peut pratiquement tout modifier. De même que la mise en forme finale.
J’ai simulé une arborescence avec une dizaine de fichiers à visiter et m’a macro dure moins de 10 secondes. Selon le nombre de fichier à visiter chez toi, ça peut aller bien plus longtemps. Tout à la fin de la macro, tu devrais recevoir un message « C’est fait ! ».
Tu indiques que tu as parmi tes fichiers des exceptions ?? Pour l’instant, tant que ceux-ci ne comportent pas de feuille « Glob », ils sont simplement ignorés. S’ils comportent des feuilles « Glob », ça peut créer des interférences.
Pour la suite, arrives-tu à me dire comment l’on peut les identifier, ces exceptions ? Par exemple est-ce que tous ces fichiers à ignorer commencent ou finissent avec le même mot ? Ou ont-ils tous des feuilles nommées bien définissables ? Ou comportent-ils tous une cellule bien identifiable ? Ou n’ont-ils aucun des feuilles nommées comme les fichiers dans lesquels il faut récupérer des données ? Etc.
A te relire.
Bonjour Yvouille,
C'est tout simplement génialissime.
L'emplacement du fichier Base Récapitulation_V1 est parfait (idem pour le fichier qui en résulte)
Concernant les exceptions: il se peut dans certains répertoires, qu'il n'y ait pas de fichier ou de répertoire Old
Normalement, la structure des onglets de tous les fichiers est identique. Le titre des colonnes est similaires par contre, il peut arrivé que mon fournisseur modifie l'ordonnancement de celle-ci (rare mais c'est déjà arrivé)
Il reste 3 petites choses:
- Au moment de l'enregistrement du fichier final (Récapitulation le date h m.xls), j'ai l'erreur suivante :
Erreur d'exécution '1004': Microsoft Excel ne peut accéder au fichier "C:\Moi\Lot\Recapitulation le 26\09\. Plusieurs raisons sont possibles...
Lorsque je clique sur débogage, Excel me renvoie vers :
ActiveWorkbook.SaveAs Filename:=Chemin & "\Récapitulation le " & Date & " à " & Hour(Now) & "h" & Minute(Now) & "m" & Second(Now) & "s.xls", FileFormat:=xlExcel8
Si j'efface: " & Date & " à " & Hour(Now) & "h" & Minute(Now) & "m" & Second(Now) & "s et que je remplace par un chiffre, je peux finir l'exécution de la macro.
Dois je changer le format de date?
- Quand je consulte le fichier créé, les colonne Fichier source (G) et Chemin (H) ne sont pas remplies.
L'information se trouve sur la première ligne de la copie du fichier source, mais pas sur les suivantes.
Sais tu comment faire?
- Durant l'exécution de la macro, j'ai a plusieurs reprise le message:
Ce classeur comporte des liaisons avec un autre classeur.
Si vous mettez les liaisons à jour, Excel tente de récupérer les dernieres données.
Si vous ne les mettez pas à jour, Excel utilise les informations précédentes.
Je clique sur : ne pas mettre à jour (je souhaite les valeurs telles quelles sont dans le fichier)
Comme dit plus haut, ton fichier est absolument superbe.
Merci de ton aide.
Salut,
En Suisse nous utilisons le point comme séparateur dans le format de date, par exemple 22.05.2013. Ainsi, lorsque j’utilise l’instruction ‘Date’ dans mon code, le nom du fichier créé ainsi porterait - lors de mes précédents essais - un signe (le point) accepté dans le nom d’un fichier.
Dans certains pays plus exotiques
Dans le fichier ci-joint j’ai forcé un format de date avec point et tout devrait rentrer dans l’ordre.
J’ai également placé une instruction complémentaire qui permet d’ouvrir les fichiers visités sans effectuer les liaisons.
Lors de tes essais précédents, à cause vraisemblablement des deux problèmes mentionnés ci-dessus, ma macro n’a probablement jamais été jusqu’à la fin et il est normal que tu obtiennes des résultats bizarres. Par exemple mon code place des données provisoires dans la colonne D de la feuille Base et si la partie du code qui les effaces n’est pas appliquée car la macro a été interrompue prématurément, c’est normal que tu puisses les voir. Mais normalement, avec les corrections apportées, tu ne devrais plus avoir de problème.
Si l’un des sous-dossiers visités ne comporte pas de fichier Excel, ce n’est pas un problème ; le code continue comme si de rien n’était.
Par contre mon code – lorsqu’il visite pour l’instant une feuille « Glob » - ne se préoccupe pas du titre des colonnes. Il prend les données de la colonne A du fichier source afin de la placer dans la colonne A du fichier cible, la colonne D dans la colonne B, la colonne F dans la colonne C, etc. Si les colonnes du fichier source peuvent varier de place, c’est important de me le faire savoir. Mais alors il faudrait à chaque fois au préalable, avant de copier-coller les données d’un fichier à l’autre, rechercher la bonne colonne et ça risque de ralentir considérablement le code. Mais bon, comme tu sembles devoir faire cela relativement peu souvent, même si la procédure complète dure plusieurs minutes, ça ne devrait pas être trop dérangeant, non ?
En l’état actuel, si tu arrives à exécuter ce travail jusqu’au bout avec le fichier fourni, je serais déjà intéressé à savoir combien de temps ça prend.
A te relire.
bonjour Yvouille,
Ca marche nickel. Plus de messages liés aux liaisons, l'enregistrement au format date JJ.MM.AAAA se fait bien.
Le temps d'exécution est de 40 secondes pour 134 fichiers traités.
Il ne reste plus que le "souci" des colonnes G et H qui ne sont remplies qu'une fois par fichier et non pour chaque ligne.
En fait je récupère le travail de quelqu'un d'autre, qui n'a malheureusement pas pensé rassembler l'ensemble des fichiers. Je pense faire se travail de manière hebdomadaire afin de pouvoir faire des statistiques.
Au vu du temps que cela me fait gagner, même si l'exécution de la macro mettait 10 min , je serais heureuse.
Mille mercis Yvouille, tu merite largement tes 5 étoiles
Salut,
Désolé, j’ai loupé ce passage. Dans le fichier ci-joint, c’est corrigé.MimizbomB a écrit :- Quand je consulte le fichier créé, les colonne Fichier source (G) et Chemin (H) ne sont pas remplies.
L'information se trouve sur la première ligne de la copie du fichier source, mais pas sur les suivantes.
Sais tu comment faire?
Dois-je comprendre que tu te débrouilles pour la suite et que mon boulot s’arrête là ?MimizbomB a écrit :Il ne reste plus que le "souci" des colonnes G et H qui ne sont remplies qu'une fois par fichier et non pour chaque ligne.
Moi j’avais compris qu’il restait encore le problème des autres feuilles à transférer et le problème des fichiers visités dont l’ordre des colonnes n’était pas identiques aux modèles que tu m’avais remis !
A te relire.
Bonjour Yvouille
Tu as raison, il reste encore bien des choses à faire.
C'est simplement une erreur de langage.
Je te remercie e ton engagement
Ok, on continuera à avancer sur ce projet.
Mais les nouveautés du dernier fichier fourni donnent-elles déjà satisfaction ?
Amicalement.
Bonjour Yvouille,
C'est génial.
Toutes les colonnes sont incrémentées.
Au plaisir de te relire.
Salut,
Désolé pour le temps de réponse, mais j’étais assez occupé au travail et en privé et ton problème n’est quand même pas simple.
Avec le fichier ci-joint, tu devrais avoir la solution à ton problème. La macro ouvre tous les fichiers à visiter comme précédemment, passe en revue toutes les feuilles de chacun d’eux, repère les titres des colonnes et transfert les données correspondantes dans le fichier cible. Attention, les titres de colonnes doivent être exactement les mêmes que dans le fichier de base ; pas d’espace et normalement casse semblable. Si tu rencontres un problème au niveau de la casse, il y aurait une solution assez simple, pour les espaces, ce serait un peu plus compliqué.
Mon ancienne macro durait environ 10 secondes. Celle-ci – pour le même nombre de fichiers visités –environ 30 secondes. Si chez toi ça triple également le temps, ça devrait durer environ 120 secondes pour tes 134 fichiers.
A te relire.
Bonjour Yvouille,
Petit bilan:
Effectivement, cela prend environ 1m30 et franchement c'est super bien.
Reste juste deux petits problèmes:
- Dans les onglet SMS, info adm user et matériels j'ai parfois 1000 lignes vierges entre 2 exctractions de fichier. Pourtant (et j'ai vérifié ligne par ligne...) il n'y a pas d'espace ou autre dans ces cellules.
- A priori sur certains onglets, il y a des formules. a la copie, ce sont les formules qui sont copiés et non les valeurs.
Sinon ca tourne nickel
Merci Yvouille
Salut,
Il faut absolument que tu me fournisses deux des fichiers créant problème ; 1 fois celui des lignes vides, une fois celui des formules.
Si tu peux être un peu plus précise dans tes explications, tant mieux (par exemple, dans quelles cellules de quelles feuilles de quel fichier trouve-t-on des formules qui sont reprises à la place des valeurs).
Si tu peux éventuellement également me fournir une fichier cible dans lequel se trouvent ces lignes vierges, ce serait aussi bien.
A te relire.