Ouverture et copie informations à partir d'un répertoire [VBA] - VB/VBA/VBS - Programmation
Marsh Posté le 07-06-2013 à 12:45:36
Bonjour,
► consulter l'aide et son exemple de la fonction Dir permettant de parcourir les fichiers d'un dossier.
Exemple concret dans le récent sujet Archiver tous les fichiers différents d'un fichier précis …
► La colonne peut se gérer via la combinaison d'une variable compteur et de la propriété Cells …
► Consulter aussi l'aide et l'exemple de la méthode Copy appliquée à un Range
car en utilisant son argument Destination une seule ligne suffit pour copier une plage d'une feuille à une autre !
► Le code peut (doit !) être écrit quasiment sans Activate & Select étant d'affreux ralentisseurs !
► Toujours pour la rapidité, consulter l'aide de la propriété ScreenUpdating …
Marsh Posté le 07-06-2013 à 13:08:26
Je vous ais suivis pour la fonction Dir qui correspond à ce que je recherche, c'est à dire sélectionner tous les fichiers d'un répertoire donnée .
Mon code est le suivant et il fonctionne:
Code :
|
Cependant lorsque je lance la macro, tous les fichiers se lancent ....je que je souhaiterais c'est que lorsque "un" fichier s'ouvre, la page de données soit copiées puis collées, le fichier se referme, et un seconde ficher s'ouvre et la même action est exercée ainsi de suite...Je ne vois pas trop là actuellement comment agir sur la macro...je vais y réfléchir !
Mais déjà merci de m'avoir mis sur cette piste qui me parait très juste !
Pour votre point 5 j'utiliserai le code :
Code :
|
Je m'attaque à l'étude de vos points 2 et 3 et en tenant compte du point 4 ! Merci !!
Marsh Posté le 07-06-2013 à 13:59:13
Je sèche un peu je dois vous l'avouez ...je ne sais pas comment faire pour ouvrir juste "un" fichier, faire le traitement (=copié/collé de plages de cellules), le refermer, en ouvrir un autre etc...
La fonction Dir ouvre tout d'un coup ...
Marsh Posté le 07-06-2013 à 14:47:04
Faut rester logique !
Il faut insérer entre les lignes n° 7 & 8 du second code le bloc des lignes n°3 à 16 - en gros - du premier code.
Synopsis : un fichier est ouvert - il est traité - il est fermé - le fichier suivant est ouvert …
Si ce sont uniquement les fichiers .asc devant être traités, alors pourquoi en ligne n°4 du second code
la recherche se fait-elle sur tous les fichiers au lieu d'uniquement ces fichiers (*.asc) ?!
La fonction Dir renvoie un seul nom de fichier à la fois …
Désactiver le rafraîchissement de l'écran en début de code puis le réactiver en fin de procédure.
Marsh Posté le 07-06-2013 à 15:19:15
Merci de ma guider Marc L je dois vous avouer que vous m'êtes d'une aide remarquable !
Voici mon nouveau code :
Code :
|
Les parties que j'ai colorées en rouge concerne mes doutes....
En effet, ce que je voudrais comme vous résumez parfaitement dans votre synopsis c'est: Ouvrir, traiter, fermer, ouvrir fichier suivant, traiter etc
J'insiste peut-être sur ma boucle i car je pensais attribuer cette boucle au nombre de fichier ...lorsque i=1 c'est le fichier 1 (peut importe l'ordre du fichier) qui s'ouvre, lorsque i = 2 c'est le fichier 2 etc...
La boucle me permettra aussi d'espacer les collages de plage de données ...car la plage de données du fichier 1 sera collé dans les colonnes B et C, pour le fichier 2 dans les colonnes D et E etc...
Je pensais utiliser Cells(1,2*i)...lorsque i=1 on est en cells(1,2) , lorsque i=2 en cells (1,4) etc... à la place de Range("A:B" ).Select de mon premier code ...
Marsh Posté le 07-06-2013 à 15:59:47
► La boucle de la ligne n°7 ne sert à rien sauf à relire autant de fois les mêmes fichiers et à les traiter encore
car les fichiers sont gérés au sein de la boucle While …
Il ne s'agit pas de faire du copier / coller - l'apanage sur le net, hélàs ! - mais de traduire une pensée logique,
un langage courant en somme, en langage informatique, juste une question de traduction sémantique !
Donc à l'inverse, en relisant un code puis en le traduisant en langage courant,
les lacunes vis à vis de la logique d'origine doivent donc être évidentes …
► Le compteur peut être défini à 1 en début de procédure puis à chaque nouveau Dir incrémenté de 2 …
Sinon il n'est pas obligatoire car il peut être remplacé via la propriété End …
► J'insiste : utiliser les Activate & Select est d'une totale hérésie, Vade Retro Satanas ‼
L'enregistreur de macros, c'est bien pour se donner une idée du code mais nettoyer ce dernier, c'est bien mieux !
Exemple : à quoi peut donc bien servir la ligne n°19 ? Totalement inutile ‼
La copie peut s'effectuer en une seule ligne comme dans l'exemple de l'aide de la méthode Copy appliquée à un Range …
Du coup la ligne n°26 (alors là le terme hérésie n'est pas assez fort même si je viens enfin de la comprendre dans votre logique)
est totalement inutile !
Marsh Posté le 10-06-2013 à 10:29:05
Bonjour,
J'ai essayé de réfléchir logiquement, pour copier la plage de données issu du fichier .asc et la copier sur mon fichier excel, tout en décalant de 2 les colonnes dans lesquelles sont copiées les données pour chaque fichier ( par exemple, pour le fichier 1, les données sont copiées et collées dans les colonnes B et C, D et E pour le fichier 2 etc...)
J'ai introduit une condition If...
Je n'ais pas réussi à simplifier le Activate et Select, j'ai essayé diverses formules farfelues et aucune ne fonctionnent...
Voici mon code:
Code :
|
De plus ma macro beug à l'étape colorée en rouge...je ne comprends pas pourquoi sachant qu'elle fonctionnait hier
Marsh Posté le 10-06-2013 à 11:01:14
J'ai remplacé cette ligne:
Code :
|
par celle-ci:
Code :
|
La macro se lance bien et pas de beug mais les soucis :
Marsh Posté le 10-06-2013 à 15:10:24
Je sèche vraiment là...
J'ai tout essayé et rien ne va.
Déjà je ne comprends pas pourquoi la macro ne copie que la plage de données d'un seul fichier et pas des autres...il y en a d'autres pourtant et bien non, elle se contente de copier la même !
Je n'arrive pas à mettre en place le compteur pour décaler de 2 les colonnes dans lesquelles les données vont être collées ...
Et sur mes 2 fichiers, lorsque la macro se termine, un fichier reste tout de même ouvert ! Alors que dans la macro je veux le fermer après traitement ! Et comme par hasard c'est ce fichier là dont la plage de données est copiée ....
Elle va me rendre dingue cette macro....
Marsh Posté le 10-06-2013 à 16:52:31
En fait la macro se trompe rarement, elle se contente d'appliquer la sémantique écrite …
Toujours problème de logique, pouquoi y-a-t-il deux Open ?
De plus, que ce soit un fichier ou une fenêtre, on ne peut y accéder qu'avec leur nom exact,
qu'est-ce donc ces étoiles des lignes n° 13 & 24 ?‼
Autre délire ligne n°19, le And faisant partie de la condition, doit donc se trouver avant le Then !
Rien qu'en consultant l'aide …
Pour conclure, d'improbables Activate, Select et voir même Windows sont le pire en VBA ‼
Voici un exemple (par précaution prévoir une sauvegarde du classeur original au préalable) après nettoyage afin de coller
les données dans la feuille active du classeur contenant le code et ce, sans aucun Select ni autres affreux :
Code :
|
Marsh Posté le 10-06-2013 à 19:05:53
Merci beaucoup Marc L pour l'effort que vous portez à mon problème !
Oui je me doutais bien que c'était moi qui commettait des erreurs et non la macro en elle même
Marsh Posté le 10-06-2013 à 19:11:42
A part la méthode d'ouverture des fichiers .asc certainement pondue par l'Enregistreur de macros,
tout le reste, je n'ai rien inventé, les infos viennent de l'aide intégrée du VBA …
Marsh Posté le 10-06-2013 à 19:13:09
Merci beaucoup Marc L pour l'effort que vous portez à mon problème !
Oui je me doutais bien que c'était moi qui commettait des erreurs et non la macro en elle même
Merci déjà pour vos formules simplificatrices sur les Activate & Select & windows ! Je ne savais pas comment m'en débarrasser !
Oui ma condition n'était pas bonne et trop farfelue ...et ne fonctionnait pas vraiment au vu des critiques que j'ai émis sur ma macro lors de mes messages précédents .
J'ai essayé le code "nettoyé" que vous proposez mais il ne se passe strictement rien C'set à dire que je lance la macro et rien ne se passe...
Essayez par vous même avec d'autres types de fichiers, aucun fichier ne se charge, ne de copie ont lieu....
Je sais pas si il faut le compléter car il m'a l'air de reprendre tous les informations que j'utilisais dans ma macro ( sauf ma boucle if remplacé par votre compteur)...le reste est globalement identique et pourtant rien ne ce fait ?
Je reprendrais cela ce soir car je suis exténué par cette journée .
Merci beaucoup en tout cas déjà Marc L, bonne soirée !
ps: pardon pour le message précédent incomplet, ça a posté tout seul j'ai l'impression ...
Marsh Posté le 10-06-2013 à 19:20:20
Cela veut certainement dire qu'il n'y a pas de fichier .asc dans le répertoire spécifié,
suivre la progression du code et de ses variables en mode pas à pas (F8) …
Marsh Posté le 10-06-2013 à 19:32:57
Si j'ai bien vérifié, les fichiers sont bien en format .asc dans le répertoire spécifié ...
J'ai rentré ce code là précisément mais je me demandais si les lignes 12 et 13 dans le code était correct ? Car ce résultat a été obtenu avec l'enregistrement de macro pour UN fichier donné...c'est pour cela que je me demande si cela ne vient pas d'ici ?
J'ai suivi étape par étape et rien n'y fait, la macro est OK c'est sûr mais elle n'agit pas ...
Code :
|
Marsh Posté le 10-06-2013 à 20:12:26
Une autre méthode pour coller dans la feuille active lors de l'exécution de la procédure,
qui là n'est pas forcément celle du classeur contenant le code (voir les lignes n°7, 8, 21 & 30) :
Code :
|
Ligne 21 : si ce code se trouve dans un module normal, il n'est pas nécessaire de préciser le classeur actif
ainsi que la feuille active du Range à copier.
Je l'avais précisé dans mon code précédent car il n'était pas dans un module normal mais dans un module de classe …
Autre méthode, au lieu d'utiliser une variable pour la feuille de destination, un peu comme dans mon code précédent,
préciser nommément le classeur via la propriété Workbooks …
Si cela ne fonctionne toujours pas, remettre alors l'ouverture des fichiers .asc avec le code de l'Enregistreur de macros
dans le cas où j'aurais par trop nettoyé …
Et si cela persiste encore, c'est évidemment la procédure d'ouverture qui est à revoir …
Marsh Posté le 11-06-2013 à 09:01:52
Merci beaucoup Marc L !!! Cela fonctionne parfaitement avec votre deuxième code ! Je ne comprends pas du coup cela ne fonctionnait pas avec le premier mais bon le principal est que cela fonctionne !
J'ai encore une fois beaucoup appris grâce à vous. Il y a encore 1 mois, je ne maîtrisais rien et là petit à petit les choses se mettent en place...
Après je ne comprends pas encore tout de votre macro mais je vais la décortiquer car j'ai besoin de la comprendre pour progresser et aider un jour, si j'en ais les capacités, une autre personne !
C'est vachement pratique tout de même les macros !
Marsh Posté le 11-06-2013 à 13:15:31
Effectivement les 2 fonctionnent !! J'ai du très probablement faire une erreur hier soir alors...( fatigue ? )
J'ai complété votre code afin de ne pas "imposer" le répertoire mais de le chercher librement :
Code :
|
Ce code précède le votre, et tout marche niquel ! Vous m'avez enlever une belle épine du pied !
Marsh Posté le 11-06-2013 à 14:27:45
Félicitations !
Sinon il n'y a pas de secret, bien définir ses besoins, dérouler au mieux la sémantique, et cela roule tout seul ! …
Marsh Posté le 11-06-2013 à 14:54:48
Je ne peux que vous me remercier ! C'est grâce à vous en grande partie !
Je commence vraiment à comprendre oui, j'ai poursuivi la macro en sommant pour chaque ligne les cellules des "x" colonnes ( x étant une variable).
Je n'utilise plus les select, activate ou autres ! ( grâce à vous) J'essaye d’étoffer un maximum ma macro pour la rendre la plus efficace possible
Code :
|
tout marche niquel !
Marsh Posté le 26-03-2014 à 08:19:35
Bonjour !
Je suis une complète débutante en programmation VBA et ce post m'a été très utile et m'a permis de comprendre plein de choses, merci !
J'aimerais adapter le programme que vous avez proposé pour pouvoir ouvrir plusieurs fichiers (de type csv), d'un même dossier dans les différentes feuilles d'un même classeur.
J'ai un peu "bidouillé" et j'obtiens que les différents fichiers s'ouvrent chacun dans des classeurs différents. Et j'avoue que là je bloque un peu...
Pourriez_vous m'aider ?
Merci d'avance !!
Code :
|
Marsh Posté le 26-03-2014 à 11:50:23
Bonjour, bonjour,
là j'avoue être dans le flou total car pas de problématique précise exposée ‼
Quel est donc le souci ? Car sans explication claire et exhaustive …
Dans l'hypothèse où Excel est en version française, le fichier csv de type délimité point-virgule
et la virgule comme séparateur décimal, voici deux méthodes pour l'ouvrir :
• Workbooks.Open Fichier, Local:=True
• Workbooks.OpenText Fichier, xlWindows, , xlDelimited, Semicolon:=True, Local:=True
Marsh Posté le 26-03-2014 à 13:00:11
Oui, c'est vrai, je ne suis pas très claire, mes excuses !
Je voudrais que mon programme récupère les fichiers .csv de mon dossier et les extrait dans des feuilles séparées d'un même classeur.
En fait je voudrais un espèce d'équivalent de la méthode Workbooks.OpenText pour ouvrir une nouvelle feuille dans le même classeur (dans laquelle se trouverais les données d'un fichier csv ) plutôt qu'une nouvelle feuille dans un nouveau classeur..
J'espère que j'ai réussi à être plus explicite !
En tout cas merci beaucoup !
Marsh Posté le 26-03-2014 à 14:15:36
Sans avoir plus d'information, le plus simple pour un novice en VBA est d'utiliser l'Enregistreur de macros
et d'effectuer les opérations manuellement pour obtenir une base de code …
Donc après l'ouverture du fichier .csv dans un classeur temporaire, via le clic droit sur le nom de l'onglet
contenant les données, déplacer la feuille dans le classeur désiré préalablement ouvert,
cela devrait fermer dans la foulée le classeur temporaire …
Marsh Posté le 26-03-2014 à 15:56:16
Je pense que c'est effectivement ce que j'ai de mieux à faire...
merci quand même !
Marsh Posté le 26-03-2014 à 16:02:58
Avec de plus amples explications et le code généré par l'Enregistreur de macros, on pourra envisager une optimisation …
Marsh Posté le 07-06-2013 à 11:42:11
Bonjour à tous,
Je me trouve encore une fois dans une situation délicate...
Je souhaite créer une macro gérée par une boucle qui va sélectionner automatiquement tour à tour XX fichiers (en format .asc) contenu dans un répertoire donné, les ouvrir un par un, puis copier ensuite une plage de données. Celle-ci est ensuite copiée dans le fichier excel initale dans la colonne A par exemple pour le fichier 1, puis dans la colonne 2 pour le fichier 2 etc...
Chaque fichier excel ouvert pour la copie est refermé dès la copie effectuée..
J'ai élaboré un début de macro qui fonctionne pour un fichier donné ! Le problème est qu'il faut que le code agisse automatiquement sur tous les fichiers tour à tour ( d'où la boucle)
Ma question : Comment mettre en place une boucle qui puisse traité successivement tous les fichiers d'un même répertoire, en décalant bien sûr la colonne dans laquelle la plage de cellules copiées, va être collée (pour le fichier excel)?
Voici mon code qui fonctionne pour un fichier ...j'ai mis la boucle en place car ya 20 fichiers mais comment la faire fonctionnée
Merci de votre aide! Je m'active à fond de mon côté également ...
Si vous avez des idées n'hésitez pas