[VBA] Ouverture et copie informations à partir d'un répertoire

Ouverture et copie informations à partir d'un répertoire [VBA] - VB/VBA/VBS - Programmation

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

Code :
  1. sub ()
  2. For i = 1 To 20
  3. Workbooks.OpenText Filename:= _
  4.         "C:\Users\John\Documents\Analyse\lala.asc", _
  5.         Origin:=xxx, StartRow:=x, DataType:=xlDelimited, TextQualifier:= _
  6.         xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=True, Semicolon:=False, _
  7.         Comma:=False, Space:=False, Other:=False, FieldInfo:=Array(x, x), _
  8.         TrailingMinusNumbers:=True
  9.     ActiveWindow.SmallScroll Down:=xx
  10.     Range("A75:B450" ).Select
  11.     Selection.Copy
  12.     Windows("Blabla.xlsm" ).Activate
  13.     Range("A:B" ).Select
  14.     ActiveSheet.Paste
  15. Windows("lala.asc" ).Activate
  16.     ActiveWindow.Close
  17.    
  18. Next
  19. end sub

 
 
 
Merci de votre aide! Je m'active à fond de mon côté également ...
Si vous avez des idées n'hésitez pas :)

Reply

Marsh Posté le 07-06-2013 à 11:42:11   

Reply

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


Message édité par Marc L le 07-06-2013 à 12:55:04
Reply

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 :
  1. Sub Test()
  2. ChDir "C:\Users\John\Documents\Analyse"
  3. monfichier = Dir("*.*" )
  4. While monfichier <> ""
  5. Workbooks.Open monfichier
  6. monfichier = Dir()
  7. Wend
  8. End Sub


 
 
Cependant lorsque je lance la macro, tous les fichiers se lancent :ouch:  ....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 :
  1. Application.ScreenUpdating = False


 
 
Je m'attaque à l'étude de vos points 2 et 3 et en tenant compte du point 4 :) ! Merci !!

Reply

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 ...

Reply

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.
 

Reply

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 :
  1. Sub Analyse()
  2. Application.ScreenUpdating = False
  3. ChDir "C:\Users\John\Documents\Analyse"
  4. For i = 1 To 2
  5. monfichier = Dir("*.asc" )
  6. While monfichier <> ""
  7. Workbooks.Open monfichier
  8.     Workbooks.OpenText Filename:= _
  9.         "C:\Users\John\Documents\Analyse\*.asc", Origin:= _
  10.         932, StartRow:=1, DataType:=xlDelimited, TextQualifier:=xlDoubleQuote, _
  11.         ConsecutiveDelimiter:=False, Tab:=True, Semicolon:=False, Comma:=False _
  12.         , Space:=False, Other:=False, FieldInfo:=Array(Array(1, 1), Array(2, 1)), _
  13.         TrailingMinusNumbers:=True
  14.     ActiveWindow.SmallScroll Down:=69
  15.    
  16.     Range("A75:B86" ).Copy
  17.     Windows("Analyse" ).Activate
  18. Cells(1,2*i).Select
  19.    ActiveSheet.Paste
  20.  
  21.     Windows("*.asc" ).Activate
  22.    ActiveWindow.Close
  23.    
  24.    
  25. monfichier = Dir()
  26. Wend
  27. Application.ScreenUpdating = True
  28.    
  29. Next
  30. End Sub


 
 
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 ...


Message édité par macrosoucis le 07-06-2013 à 15:32:41
Reply

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  :ouch:
                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 !


Message édité par Marc L le 07-06-2013 à 16:26:18
Reply

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 :
  1. Sub Analyse()
  2. Application.ScreenUpdating = False
  3. i = 1
  4. ChDir "C:\Users\John\Documents\Analyse"
  5. monfichier = Dir("*.asc" )
  6. While monfichier <> ""
  7. Workbooks.Open monfichier
  8.     Workbooks.OpenText Filename:= _
  9.         "C:\Users\John\Documents\Analyse\*.asc"
  10.    
  11. Range("A75:B86" ).Copy
  12.     Windows("Analyse" ).Activate
  13.    
  14. If Not IsEmpty(Cells(1, i)) Then i = i + 2 And Cells(1, i).Select
  15.    ActiveSheet.Paste
  16.     Windows("*.asc" ).Activate
  17.    ActiveWindow.Close
  18.  
  19.  
  20.    
  21. monfichier = Dir()
  22. Wend
  23. Application.ScreenUpdating = True
  24.    
  25. End Sub


 
De plus ma macro beug à l'étape colorée en rouge...je ne comprends pas pourquoi sachant qu'elle fonctionnait hier  :??:


Message édité par macrosoucis le 10-06-2013 à 10:32:22
Reply

Marsh Posté le 10-06-2013 à 11:01:14    

J'ai remplacé cette ligne:

Code :
  1. Windows("*.asc" ).Activate


 
par celle-ci:

Code :
  1. Windows(mon fichier).Activate


 
 
La macro se lance bien et pas de beug mais les soucis :
 

  • sur mes 2 fichiers ( j'en ais séléctionné que 2 pour que ce soit simple), juste la plage de données d'un seul fichier est copié et collé ...et elle est collé n'importe où sur mon fichier excel :ouch: ( une fois ligne 5 , colonne 7, puis je relance la macro et ça change d'endroit bref)
  • je semble voir que les 2 fichiers s'ouvrent mais un des 2 fichiers ne se ferment pas ...


Reply

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 ! :pt1cable:  
 
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 ! :ouch: 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....

Reply

Marsh Posté le 10-06-2013 à 15:10:24   

Reply

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 :
  1. Sub Analyse()
  2.     Dossier$ = "C:\Users\John\Documents\Analyse\"
  3.     Fichier$ = Dir(Dossier & "*.asc" )
  4.    
  5.     If Fichier > "" Then
  6.         Colonne% = -1
  7.         Cells.ClearContents
  8.         Application.ScreenUpdating = False
  9.     End If
  10.    
  11.     While Fichier > ""
  12.         Workbooks.OpenText Dossier & Fichier, 932, 1, xlDelimited, Tab:=True, _
  13.                   FieldInfo:=Array(Array(1, 1), Array(2, 1)), TrailingMinusNumbers:=True
  14.    
  15.         Colonne = Colonne + 2
  16.         ActiveWorkbook.ActiveSheet.[A75:B86].Copy ThisWorkbook.ActiveSheet.Cells(1, Colonne)
  17.         ActiveWorkbook.Close
  18.         Fichier = Dir
  19.     Wend
  20.    
  21.     Application.ScreenUpdating = True
  22. End Sub

 

Reply

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

Reply

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 …

Reply

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  :ouch: 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 ...


Message édité par macrosoucis le 10-06-2013 à 19:16:03
Reply

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) …
 

Reply

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 :
  1. Sub Analyse()
  2.     Dossier= "C:\Users\John\Documents\Analyse\"
  3.     Fichier = Dir(Dossier & "*.asc" )
  4.  
  5.     If Fichier <> "" Then
  6.         Colonne = 1
  7.         Cells.ClearContents
  8.         Application.ScreenUpdating = False
  9.     End If
  10.  
  11.     While Fichier <> ""
  12.         Workbooks.OpenText Dossier & Fichier, 932, 1, xlDelimited, Tab:=True, _
  13.                   FieldInfo:=Array(Array(1, 1), Array(2, 1)), TrailingMinusNumbers:=True
  14.    
  15.         Colonne = Colonne + 2
  16.         ActiveWorkbook.ActiveSheet.[A75:B86].Copy ThisWorkbook.ActiveSheet.Cells(1, Colonne)
  17.         ActiveWorkbook.Close
  18.         Fichier = Dir
  19.     Wend
  20.  
  21.     Application.ScreenUpdating = True
  22. End Sub


Message édité par macrosoucis le 10-06-2013 à 19:35:32
Reply

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 :
  1. Sub Analyse()
  2.     Dossier$ = "C:\Users\John\Documents\Analyse\"
  3.     Fichier$ = Dir(Dossier & "*.asc" )
  4.    
  5.     If Fichier > "" Then
  6.         Colonne% = -1
  7.         Set Dest = ActiveSheet
  8.         Dest.UsedRange.ClearContents
  9.         Application.ScreenUpdating = False
  10.    
  11.     Else
  12.         M$ = "Pas de fichier .asc dans le dossier " & Dossier & " !!"
  13.     End If
  14.    
  15.     While Fichier > ""
  16.         Workbooks.OpenText Dossier & Fichier, 932, 1, xlDelimited, Tab:=True, _
  17.                   FieldInfo:=Array(Array(1, 1), Array(2, 1)), TrailingMinusNumbers:=True
  18.    
  19.         If Application.CountA("A75:B86" ) Then
  20.             Colonne = Colonne + 2
  21.             [A75:B86].Copy Dest.Cells(1, Colonne)
  22.    
  23.         Else
  24.             M = M & vbLf & Fichier
  25.         End If
  26.    
  27.         ActiveWorkbook.Close
  28.         Fichier = Dir
  29.     Wend
  30.                       Set Dest = Nothing
  31.     Application.ScreenUpdating = True
  32.    
  33.     If M > "" Then
  34.         Beep
  35.         If Colonne Then M = "Rien à copier dans" & M
  36.         MsgBox M, , "   Analyse"
  37.     End If
  38. End Sub

           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 …
 

Reply

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 ! :D

Reply

Marsh Posté le 11-06-2013 à 11:21:42    

 
           De mon côté, les deux versions fonctionnent …
 

Reply

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 :
  1. Set objShell = CreateObject("Shell.Application" )
  2. Set objFolder = objShell.BrowseForFolder(&H0&, "Choisir un répertoire", &H1& )
  3. If objFolder Is Nothing Then
  4.     MsgBox "Abandon opérateur", vbCritical, "Annulation"
  5. Else
  6.  
  7.     Dossier = objFolder.ParentFolder.ParseName(objFolder.Title).Path & "\"
  8.     Fichier = Dir(Dossier & "*.asc" )
  9.     End If


 
Ce code précède le votre, et tout marche niquel ! Vous m'avez enlever une belle épine du pied !

Reply

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 ! …
 

Reply

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 :
  1. Dim XX As Byte
  2. Dim value As Byte
  3. Dim initial As Byte
  4. value = InputBox("Nombre de colonne à considérer", "Titre", XX)
  5. MsgBox value & "  colonnes considérées"
  6. initial = 1
  7.  
  8.     For i = 1 To 98
  9.    
  10.     Sheets("analyse" ).Range("A" & i).FormulaR1C1 = "=SUM(données!RC[" & initial & "]:RC[" & value & "])"
  11.     Sheets("analyse" ).Range("B" & i).FormulaR1C1 = "=MEDIAN(données!RC[" & initial - 1 & "]:RC[" & value - 1 & "])"
  12.     Sheets("analyse" ).Range("C" & i).FormulaR1C1 = "=AVERAGE(données!RC[" & initial - 2 & "]:RC[" & value - 2 & "])"
  13.     Sheets("analyse" ).Range("C" & i).NumberFormat = "0.0"
  14.     Next


 
tout marche niquel !

Reply

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 :
  1. Sub Analyse()
  2. 'Ouverture de l'arborescence
  3. Set objShell = CreateObject("Shell.Application" )
  4. Set objFolder = objShell.BrowseForFolder(&H0&, "Choisir un répertoire", &H1& )
  5. If objFolder Is Nothing Then
  6.     MsgBox "Abandon opérateur", vbCritical, "Annulation"
  7. Else
  8.     Dossier = objFolder.ParentFolder.ParseName(objFolder.Title).Path & "\"
  9.     fichier = Dir(Dossier & "*.csv" )
  10.     End If
  11.    
  12.     If fichier > "" Then
  13.         Colonne% = -1
  14.         Sheets.Add
  15.         Set Dest = ActiveSheet
  16.         Dest.UsedRange.ClearContents
  17.         Application.ScreenUpdating = False
  18.  
  19.     Else
  20.         M$ = "Pas de fichier .csv dans le dossier " & Dossier & " !!"
  21.     End If
  22. 'Copie des informations contenu dans les fichiers du dossier dans le classeur
  23.     While fichier > ""
  24.         Workbooks.OpenText Dossier & fichier, 932, 1, xlDelimited, Tab:=True, _
  25.                   FieldInfo:=Array(Array(1, 1), Array(2, 1)), TrailingMinusNumbers:=True
  26. 'apparition dans la feuille des données
  27.         If Application.CountA("A75:B86" ) Then
  28.             Colonne = Colonne + 2
  29.             [A75:B86].Copy Dest.Cells(1, Colonne)
  30.  
  31.         Else
  32.             M = M & vbLf & fichier
  33.         End If
  34.  
  35.      
  36.      fichier = Dir
  37.      
  38.     Wend
  39.                      Set Dest = Nothing
  40.     Application.ScreenUpdating = True
  41.  
  42.     If M > "" Then
  43.         Beep
  44.         If Colonne Then M = "Rien à copier dans" & M
  45.         MsgBox M, , "   Analyse"
  46.     End If
  47. End Sub

Reply

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
 

Reply

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 ! :)

Reply

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 …
 

Reply

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 !

Reply

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 …
 

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed