Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1137 connectés 

  FORUM HardWare.fr
  Programmation
  VB/VBA/VBS

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°2193280
macrosouci​s
Posté le 07-06-2013 à 11:42:11  profilanswer
 

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

mood
Publicité
Posté le 07-06-2013 à 11:42:11  profilanswer
 

n°2193287
Marc L
Posté le 07-06-2013 à 12:45:36  profilanswer
 

 
           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
n°2193288
macrosouci​s
Posté le 07-06-2013 à 13:08:26  profilanswer
 

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

n°2193304
macrosouci​s
Posté le 07-06-2013 à 13:59:13  profilanswer
 

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

n°2193319
Marc L
Posté le 07-06-2013 à 14:47:04  profilanswer
 

 
           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.
 

n°2193325
macrosouci​s
Posté le 07-06-2013 à 15:19:15  profilanswer
 

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
n°2193331
Marc L
Posté le 07-06-2013 à 15:59:47  profilanswer
 

 
           ►  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
n°2193482
macrosouci​s
Posté le 10-06-2013 à 10:29:05  profilanswer
 

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
n°2193490
macrosouci​s
Posté le 10-06-2013 à 11:01:14  profilanswer
 

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


n°2193543
macrosouci​s
Posté le 10-06-2013 à 15:10:24  profilanswer
 

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

mood
Publicité
Posté le 10-06-2013 à 15:10:24  profilanswer
 

n°2193573
Marc L
Posté le 10-06-2013 à 16:52:31  profilanswer
 

 
           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

 

n°2193592
macrosouci​s
Posté le 10-06-2013 à 19:05:53  profilanswer
 

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

n°2193596
Marc L
Posté le 10-06-2013 à 19:11:42  profilanswer
 

 
           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 …

n°2193598
macrosouci​s
Posté le 10-06-2013 à 19:13:09  profilanswer
 

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
n°2193602
Marc L
Posté le 10-06-2013 à 19:20:20  profilanswer
 

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

n°2193619
macrosouci​s
Posté le 10-06-2013 à 19:32:57  profilanswer
 

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
n°2193636
Marc L
Posté le 10-06-2013 à 20:12:26  profilanswer
 


            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 …
 

n°2193694
macrosouci​s
Posté le 11-06-2013 à 09:01:52  profilanswer
 

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

n°2193730
Marc L
Posté le 11-06-2013 à 11:21:42  profilanswer
 

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

n°2193756
macrosouci​s
Posté le 11-06-2013 à 13:15:31  profilanswer
 

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 !

n°2193782
Marc L
Posté le 11-06-2013 à 14:27:45  profilanswer
 

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

n°2193793
macrosouci​s
Posté le 11-06-2013 à 14:54:48  profilanswer
 

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 !

n°2223145
macropanic
Posté le 26-03-2014 à 08:19:35  profilanswer
 

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

n°2223177
Marc L
Posté le 26-03-2014 à 11:50:23  profilanswer
 

 
           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
 

n°2223186
macropanic
Posté le 26-03-2014 à 13:00:11  profilanswer
 

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

n°2223194
Marc L
Posté le 26-03-2014 à 14:15:36  profilanswer
 

 
           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 …
 

n°2223235
macropanic
Posté le 26-03-2014 à 15:56:16  profilanswer
 

Je pense que c'est effectivement ce que j'ai de mieux à faire...
merci quand même !

n°2223240
Marc L
Posté le 26-03-2014 à 16:02:58  profilanswer
 

 
           Avec de plus amples explications et le code généré par l'Enregistreur de macros, on pourra envisager une optimisation …
 

mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  VB/VBA/VBS

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

 

Sujets relatifs
[VBA Excel 2002] Formater le résultat d'une fonction perso[Vba Excel 2010] Génération d'un pdf avec envoi d'email
[VBA] Incrémentation[VBA] Macros feuilles differentes excel
[VBA]Colorier 2 cellules de la même couleurExercice VBA Excel sur le NOM PRENOM
[HTML/CSS/Javascript] Lien et script à partir de l'attribut altStyle TCD en VBA
Sortir des infos d'une base MySQL à partir d'un fichier txt ou csv 
Plus de sujets relatifs à : [VBA] Ouverture et copie informations à partir d'un répertoire


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR