Se connecter avec
S'enregistrer | Connectez-vous

[Excel/VBA]Macro copier/coller à partir d'un CSV

Dernière réponse : dans Programmation
Partagez

Bonjour,

Je souhaite faire la chose suivante :

1, Ouvrir tous les fichiers CSV d'un dossier (ce sont des nombres qui s'incrémente)
2, Copier certaines cellules (à chaque fois les mêmes dans le CSV)
3, Coller le contenu dans une ligne d'un classeur XLS (où seront stockées toutes les infos), chaque ligne correspond à un CSV.
4, Fermer les CSV

L'idéal étant d'automatiser cette opération, en changeant de ligne automatiquement à chaque fois.

Les problèmes :

1, Ca ne marche qu'avec 129718.csv
2, Une fois 1, réglé si je souhaite prendre un autre csv les données seront écrasés, il faudrait qu'avec chaque nouveau csv ouvert je descende d'une ligne automatiquement.
3, Peut on ouvrir "n" csv dans un même dossier pour automatiser le traitement ?
4, A la fin le fichier Statistik se ferme sans enregistrer :( 

  1. Sub macro()
  2.  
  3. Dim i As Long
  4.  
  5.  
  6. For i = 119 To 497
  7.  
  8.  
  9. NomFic = Application.GetOpenFilename(, , "programmes Presses")
  10. If NomFic <> False Then
  11. Workbooks.OpenText Filename:=NomFic, DataType:=1, Semicolon:=True, local:=True
  12. End If
  13.  
  14.  
  15. Workbooks("Statistik.xls").Sheets("Tabelle1").Cells(i, 1).Value = Range("B6").Value
  16. Workbooks("Statistik.xls").Sheets("Tabelle1").Cells(i, 2).Value = Range("C133").Value
  17. Workbooks("Statistik.xls").Sheets("Tabelle1").Cells(i, 3).Value = Range("C137").Value
  18. Workbooks("Statistik.xls").Sheets("Tabelle1").Cells(i, 4).Value = Range("C141").Value
  19. Workbooks("Statistik.xls").Sheets("Tabelle1").Cells(i, 5).Value = Range("C156").Value
  20. Workbooks("Statistik.xls").Sheets("Tabelle1").Cells(i, 6).Value = Range("C160").Value
  21. Workbooks("Statistik.xls").Sheets("Tabelle1").Cells(i, 7).Value = Range("C164").Value
  22. Workbooks("Statistik.xls").Sheets("Tabelle1").Cells(i, 8).Value = Range("C179").Value
  23. Workbooks("Statistik.xls").Sheets("Tabelle1").Cells(i, 9).Value = Range("C183").Value
  24. Workbooks("Statistik.xls").Sheets("Tabelle1").Cells(i, 10).Value = Range("C187").Value
  25. Workbooks("Statistik.xls").Sheets("Tabelle1").Cells(i, 11).Value = Range("C202").Value
  26. Workbooks("Statistik.xls").Sheets("Tabelle1").Cells(i, 12).Value = Range("C206").Value
  27. Workbooks("Statistik.xls").Sheets("Tabelle1").Cells(i, 13).Value = Range("C210").Value
  28. Workbooks("Statistik.xls").Sheets("Tabelle1").Cells(i, 14).Value = Range("C225").Value
  29. Workbooks("Statistik.xls").Sheets("Tabelle1").Cells(i, 15).Value = Range("C229").Value
  30. Workbooks("Statistik.xls").Sheets("Tabelle1").Cells(i, 16).Value = Range("C233").Value
  31.  
  32.  
  33. ActiveWorkbook.Saved = True
  34. ActiveWorkbook.Close
  35.  
  36.  
  37. Next i
  38.  
  39.  
  40. End Sub




Merci d'avance pour votre aide

Salut,

Tu jongles avec plusieurs classeurs et bien sûr, tu te prends une quille sur le pied :lol: 

.
.
.
Bon, j'arrête de faire le clown et je t'explique.

Excel décide tout seul de ce qui est actif ou pas, de ce qui est sélectionner ou pas. Aussi, ne faut-il pas trop s'y fier.
Je mène ici un combat contre ça. Juges-en par toi-même : http://www.google.fr/search?q=zeb+activetruc+site%3Apre...

Donc avant de commencer à ouvrir les CSV, on va retenir le classeur Statistik !
Et tant qu'à faire, on va aussi le faire pour un CSV, ce sera plus facile pour travailler sur un autre sans tout changer ;) .

  1. Dim i As Long
  2. Dim wb_statistik As Workbook
  3. Dim ws_statistik As Worksheet
  4. Dim wb_csv As Workbook
  5. Dim NomFic As String
  6.  
  7. Set wb_statistik = ActiveWorkbook
  8. Set ws_statistik = wb_statistik.Sheets("Tabelle1" )
  9.  
  10. For i = 119 To 497
  11.  
  12. NomFic = Application.GetOpenFilename(, , "programmes Presses" )
  13. If Not NomFic Then Exit Sub '// Ben quoi, si on veut pas l'ouvrir, on s'arrête !
  14.  
  15. Workbooks.OpenText Filename:=NomFic, DataType:=1, Semicolon:=True, local:=True
  16. Set wb_csv = ActiveWorkbook
  17.  
  18. ws_statistik.Cells(i, 1).Value = wb_csv.Worksheets(1).Range("B6" ).Value
  19. ws_statistik.Cells(i, 2).Value = wb_csv.Worksheets(1).Range("C133" ).Value
  20. ws_statistik.Cells(i, 3).Value = wb_csv.Worksheets(1).Range("C137" ).Value
  21. ws_statistik.Cells(i, 4).Value = wb_csv.Worksheets(1).Range("C141" ).Value
  22. ws_statistik.Cells(i, 5).Value = wb_csv.Worksheets(1).Range("C156" ).Value
  23. ws_statistik.Cells(i, 6).Value = wb_csv.Worksheets(1).Range("C160" ).Value
  24. ws_statistik.Cells(i, 7).Value = wb_csv.Worksheets(1).Range("C164" ).Value
  25. ws_statistik.Cells(i, 8).Value = wb_csv.Worksheets(1).Range("C179" ).Value
  26. ws_statistik.Cells(i, 9).Value = wb_csv.Worksheets(1).Range("C183" ).Value
  27. ws_statistik.Cells(i, 10).Value = wb_csv.Worksheets(1).Range("C187" ).Value
  28. ws_statistik.Cells(i, 11).Value = wb_csv.Worksheets(1).Range("C202" ).Value
  29. ws_statistik.Cells(i, 12).Value = wb_csv.Worksheets(1).Range("C206" ).Value
  30. ws_statistik.Cells(i, 13).Value = wb_csv.Worksheets(1).Range("C210" ).Value
  31. ws_statistik.Cells(i, 14).Value = wb_csv.Worksheets(1).Range("C225" ).Value
  32. ws_statistik.Cells(i, 15).Value = wb_csv.Worksheets(1).Range("C229" ).Value
  33. ws_statistik.Cells(i, 16).Value = wb_csv.Worksheets(1).Range("C233" ).Value
  34.  
  35. wb_csv.Close SaveChanges=False
  36. Next '// Hey, pas de variable de rappel. On n'est plus en 1985!
  37.  
  38. wb_statistik.Save


Bon, ce code est trop long. Il y a 16 fois la même ligne !

  1. Dim cel_statistik As Range '// La cellule dans laquelle on va écrire
  2. Dim addr As String
  3.  
  4. Set cel_statistik = ws_statistik.Cells(119, 1)
  5.  
  6. For i = 119 To 497
  7. NomFic = Application.GetOpenFilename(, , "programmes Presses" )
  8. If Not NomFic Then Exit Sub '// Ben quoi, si on veut pas l'ouvrir, on s'arrête !
  9.  
  10. Workbooks.OpenText Filename:=NomFic, DataType:=1, Semicolon:=True, local:=True
  11. Set wb_csv = ActiveWorkbook
  12.  
  13. For Each addr In ("B6", "C133", "C137", "C141", "C156", "C160", "C164", "C179", "C183", "C187", "C202", "C206", "C210", "C225", "C229", "C233")
  14. cel_statistik.Value = wb_csv.Worksheets(1).Range(addr).Value
  15. Set cel_statistik = cel_statistik.Offset(0, 1)
  16. Next
  17. Set cel_statistik = cel_statistik.EntireRow.Cells(1,1).Offset(1, 0) '// Retour chariot, à la ligne
  18.  
  19. wb_csv.Close SaveChanges=False
  20. Next


Bon, digère déjà un peu tout ça.
Ensuite, je te parlerai de la bibliothèque FileSystemObject, et de ses objets Folder et File.
Je te laisse même l'occasion de faire toi-même quelques recherches...
;) 

Salut Zeb,

Tout d'abord merci pour ton aide. En fait en ne voyant pas de réponse arriver j'ai essayé d'améliorer mon code qui est le suivant :

  1. Sub macro()
  2.  
  3. Dim i As Long
  4. Dim nomfichier As String
  5.  
  6. Application.ScreenUpdating = False
  7.  
  8. For i = 1000 To 9999
  9.  
  10. nomfichier = "M:\Blabla\000000" & i & ".csv"
  11.  
  12. Workbooks.OpenText Filename:=nomfichier, DataType:=1, Semicolon:=True, local:=True
  13.  
  14.  
  15. Workbooks("Statistik.xls").Sheets("Tabelle1").Cells(i, 1).Value = Range("B6").Value
  16. Workbooks("Statistik.xls").Sheets("Tabelle1").Cells(i, 2).Value = Range("C131").Value
  17. Workbooks("Statistik.xls").Sheets("Tabelle1").Cells(i, 3).Value = Range("C133").Value
  18. Workbooks("Statistik.xls").Sheets("Tabelle1").Cells(i, 4).Value = Range("C137").Value
  19. Workbooks("Statistik.xls").Sheets("Tabelle1").Cells(i , 5).Value = Range("C141").Value
  20. Workbooks("Statistik.xls").Sheets("Tabelle1").Cells(i , 6).Value = Range("C154").Value
  21. Workbooks("Statistik.xls").Sheets("Tabelle1").Cells(i , 7).Value = Range("C156").Value
  22. Workbooks("Statistik.xls").Sheets("Tabelle1").Cells(i , 8).Value = Range("C160").Value
  23. Workbooks("Statistik.xls").Sheets("Tabelle1").Cells(i , 9).Value = Range("C164").Value
  24. Workbooks("Statistik.xls").Sheets("Tabelle1").Cells(i , 10).Value = Range("C177").Value
  25. Workbooks("Statistik.xls").Sheets("Tabelle1").Cells(i , 11).Value = Range("C179").Value
  26. Workbooks("Statistik.xls").Sheets("Tabelle1").Cells(i , 12).Value = Range("C183").Value
  27. Workbooks("Statistik.xls").Sheets("Tabelle1").Cells(i , 13).Value = Range("C187").Value
  28. Workbooks("Statistik.xls").Sheets("Tabelle1").Cells(i , 14).Value = Range("C200").Value
  29. Workbooks("Statistik.xls").Sheets("Tabelle1").Cells(i , 15).Value = Range("C202").Value
  30. Workbooks("Statistik.xls").Sheets("Tabelle1").Cells(i , 16).Value = Range("C206").Value
  31. Workbooks("Statistik.xls").Sheets("Tabelle1").Cells(i , 17).Value = Range("C210").Value
  32. Workbooks("Statistik.xls").Sheets("Tabelle1").Cells(i , 18).Value = Range("C223").Value
  33. Workbooks("Statistik.xls").Sheets("Tabelle1").Cells(i , 19).Value = Range("C225").Value
  34. Workbooks("Statistik.xls").Sheets("Tabelle1").Cells(i , 20).Value = Range("C229").Value
  35. Workbooks("Statistik.xls").Sheets("Tabelle1").Cells(i , 21).Value = Range("C233").Value
  36.  
  37.  
  38. ActiveWorkbook.Saved = True
  39. ActiveWorkbook.Close
  40.  
  41. Next i
  42.  
  43. Application.ScreenUpdating = False
  44.  
  45. End Sub



J'ai changé l'ouverture du fichier pour que ca soit automatiaque grâce à l'incrément. Seulement le problème c'est que si excel ne trouve pas le fichier (il en manque des fois) il s'arrête et j'aimerais bien qu'il continue.

Je vais voir avec ton code si je peux alléger le mien.

Merci !

Question peut-être bête mais bon je là pause :

Les fichiers CVS dont tu parle ils ont quel type d'information et te servent a quoi ?
un exemple de contenue serais bien !

a+
Contenus similaires

M'enfin Thore, ne serais-tu pas un peu voyeur ?

------

Dis-donc Acrun, spa parce que tu as amélioré ton code que tu dois ne pas lire ce que je te propose.

En cas de problème, Excel s'arrête. En fait, tu veux dire qu'il pose une question : débogage ou fin ?
C'est bien ça ?

Si oui, il faut gérer les erreurs. Regarde dans l'aide du côté de On Error....
Si tu as des questions, je reste dispo ;) 

Salut,

Je suis désolé mais les informations ne peuvent pas être publiées ce sont des tests effectués, donc toujours les mêmes c'est pour ça que je suis obligé de faire une macro car il y a un trop grand nombre de CSV à traiter.

  1. Dim cel_statistik As Range
  2. Dim addr As String
  3. Dim nomfichier As String
  4.  
  5. Set cel_statistik = ws_statistik.Cells(119, 1) // Je comprends ce que fait cette ligne, ça prend le fichier Statistik.xls en mémoire ?
  6.  
  7. For i = 1000 To 9999
  8.  
  9. nomfichier = "M:\Blabla\000000" & i & ".csv"*
  10.  
  11. If Not nomfichier Then Exit Sub // C'est quoi l'intérêt de cette ligne ?
  12. Workbooks.OpenText Filename:=nomfichier, DataType:=1, Semicolon:=True, local:=True
  13.  
  14.  
  15. Set wb_csv = ActiveWorkbook //Même question que pour statistik
  16.  
  17. For Each addr In ("B6", "C133", "C137", "C141", "C156", "C160", "C164", "C179", "C183", "C187", "C202", "C206", "C210", "C225", "C229", "C233" )
  18. cel_statistik.Value = wb_csv.Worksheets(1).Range(addr).Value
  19. Set cel_statistik = cel_statistik.Offset(0, 1) //Là j'ai compris mais ça à l'air de bugger
  20.  
  21. Next
  22.  
  23. Set cel_statistik = cel_statistik.EntireRow.Cells(1,1).Offset(1, 0)
  24. wb_csv.Close SaveChanges=False



Excel s'arrête et me dit d'arrêter ou de débugger, je fais arrêter et il me met le numéro du fichier ex: 000004089.csv alors au niveau du "i" je change le 1000 par 4090 et je relance, donc à chaque fois qu'il trouve pas un fichier il me fait ça et je dois entrer manuellement la nouvelle valeur dans la macro.

Salut,

  1. If Not nomfichier Then Exit Sub // C'est quoi l'intérêt de cette ligne ?
Eh, cette ligne est en relation avec le GetOpenFilename de mon exemple.
En effet, je gère l'erreur (abandon par l'utilisateur)

Si tu n'as pas de GetOpenFilename, il va quand même falloir gérer les erreurs. Mais ça, je te l'ai déjà dit. Regarde donc On Error...
Une autre manière est de faire des vérifications. Par exemple, vérifier si le fichier existe.

La fonction FileExists() n'existe pas directement en VB. Mais si tu cherches bien tu devrais en trouver une - Google et Zeb sont tes amis [:patch]
Posez votre question