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

Acrun

Nouveau membre
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 :

[strike]1, Ca ne marche qu'avec 129718.csv[/strike]
[strike]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.[/strike]
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 :(

Code:
Sub macro()

    Dim i As Long
    
    
    For i = 119 To 497
    
    
    NomFic = Application.GetOpenFilename(, , "programmes Presses")
        If NomFic <> False Then
            Workbooks.OpenText Filename:=NomFic, DataType:=1, Semicolon:=True, local:=True
        End If
        
  
            Workbooks("Statistik.xls").Sheets("Tabelle1").Cells(i, 1).Value = Range("B6").Value
            Workbooks("Statistik.xls").Sheets("Tabelle1").Cells(i, 2).Value = Range("C133").Value
            Workbooks("Statistik.xls").Sheets("Tabelle1").Cells(i, 3).Value = Range("C137").Value
            Workbooks("Statistik.xls").Sheets("Tabelle1").Cells(i, 4).Value = Range("C141").Value
            Workbooks("Statistik.xls").Sheets("Tabelle1").Cells(i, 5).Value = Range("C156").Value
            Workbooks("Statistik.xls").Sheets("Tabelle1").Cells(i, 6).Value = Range("C160").Value
            Workbooks("Statistik.xls").Sheets("Tabelle1").Cells(i, 7).Value = Range("C164").Value
            Workbooks("Statistik.xls").Sheets("Tabelle1").Cells(i, 8).Value = Range("C179").Value
            Workbooks("Statistik.xls").Sheets("Tabelle1").Cells(i, 9).Value = Range("C183").Value
            Workbooks("Statistik.xls").Sheets("Tabelle1").Cells(i, 10).Value = Range("C187").Value
            Workbooks("Statistik.xls").Sheets("Tabelle1").Cells(i, 11).Value = Range("C202").Value
            Workbooks("Statistik.xls").Sheets("Tabelle1").Cells(i, 12).Value = Range("C206").Value
            Workbooks("Statistik.xls").Sheets("Tabelle1").Cells(i, 13).Value = Range("C210").Value
            Workbooks("Statistik.xls").Sheets("Tabelle1").Cells(i, 14).Value = Range("C225").Value
            Workbooks("Statistik.xls").Sheets("Tabelle1").Cells(i, 15).Value = Range("C229").Value
            Workbooks("Statistik.xls").Sheets("Tabelle1").Cells(i, 16).Value = Range("C233").Value
    
    
    ActiveWorkbook.Saved = True
    ActiveWorkbook.Close
 
    
    Next i


End Sub



Merci d'avance pour votre aide
 

zeb

Modérateur
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 :

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

Code:
Dim i            As Long
Dim wb_statistik As Workbook
Dim ws_statistik As Worksheet
Dim wb_csv       As Workbook
Dim NomFic       As String

Set wb_statistik = ActiveWorkbook
Set ws_statistik = wb_statistik.Sheets("Tabelle1" )

For i = 119 To 497

	NomFic = Application.GetOpenFilename(, , "programmes Presses" )
	If Not NomFic Then Exit Sub '// Ben quoi, si on veut pas l'ouvrir, on s'arrête !
	
	Workbooks.OpenText Filename:=NomFic, DataType:=1, Semicolon:=True, local:=True
	Set wb_csv = ActiveWorkbook
			
    ws_statistik.Cells(i,  1).Value = wb_csv.Worksheets(1).Range("B6"   ).Value
    ws_statistik.Cells(i,  2).Value = wb_csv.Worksheets(1).Range("C133" ).Value
    ws_statistik.Cells(i,  3).Value = wb_csv.Worksheets(1).Range("C137" ).Value
    ws_statistik.Cells(i,  4).Value = wb_csv.Worksheets(1).Range("C141" ).Value
    ws_statistik.Cells(i,  5).Value = wb_csv.Worksheets(1).Range("C156" ).Value
    ws_statistik.Cells(i,  6).Value = wb_csv.Worksheets(1).Range("C160" ).Value
    ws_statistik.Cells(i,  7).Value = wb_csv.Worksheets(1).Range("C164" ).Value
    ws_statistik.Cells(i,  8).Value = wb_csv.Worksheets(1).Range("C179" ).Value
    ws_statistik.Cells(i,  9).Value = wb_csv.Worksheets(1).Range("C183" ).Value
    ws_statistik.Cells(i, 10).Value = wb_csv.Worksheets(1).Range("C187" ).Value
    ws_statistik.Cells(i, 11).Value = wb_csv.Worksheets(1).Range("C202" ).Value
    ws_statistik.Cells(i, 12).Value = wb_csv.Worksheets(1).Range("C206" ).Value
    ws_statistik.Cells(i, 13).Value = wb_csv.Worksheets(1).Range("C210" ).Value
    ws_statistik.Cells(i, 14).Value = wb_csv.Worksheets(1).Range("C225" ).Value
    ws_statistik.Cells(i, 15).Value = wb_csv.Worksheets(1).Range("C229" ).Value
    ws_statistik.Cells(i, 16).Value = wb_csv.Worksheets(1).Range("C233" ).Value

	wb_csv.Close SaveChanges=False
Next '// Hey, pas de variable de rappel. On n'est plus en 1985!

wb_statistik.Save

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

Code:
Dim cel_statistik As Range '// La cellule dans laquelle on va écrire
Dim addr          As String

Set cel_statistik = ws_statistik.Cells(119,  1)

For i = 119 To 497
	NomFic = Application.GetOpenFilename(, , "programmes Presses" )
	If Not NomFic Then Exit Sub '// Ben quoi, si on veut pas l'ouvrir, on s'arrête !
	
	Workbooks.OpenText Filename:=NomFic, DataType:=1, Semicolon:=True, local:=True
	Set wb_csv = ActiveWorkbook

	For Each addr In ("B6", "C133", "C137", "C141", "C156", "C160", "C164", "C179", "C183", "C187", "C202", "C206", "C210", "C225", "C229", "C233")
		cel_statistik.Value = wb_csv.Worksheets(1).Range(addr).Value
		Set cel_statistik = cel_statistik.Offset(0, 1)
	Next
	Set cel_statistik = cel_statistik.EntireRow.Cells(1,1).Offset(1, 0) '// Retour chariot, à la ligne

	wb_csv.Close SaveChanges=False
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...
;)
 

Acrun

Nouveau membre
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 :

Code:
Sub macro()

    Dim i As Long
    Dim nomfichier As String
    
    Application.ScreenUpdating = False

    For i = 1000 To 9999
    
    nomfichier = "M:\Blabla\000000" & i & ".csv"

    Workbooks.OpenText Filename:=nomfichier, DataType:=1, Semicolon:=True, local:=True

  
            Workbooks("Statistik.xls").Sheets("Tabelle1").Cells(i, 1).Value = Range("B6").Value
            Workbooks("Statistik.xls").Sheets("Tabelle1").Cells(i, 2).Value = Range("C131").Value
            Workbooks("Statistik.xls").Sheets("Tabelle1").Cells(i, 3).Value = Range("C133").Value
            Workbooks("Statistik.xls").Sheets("Tabelle1").Cells(i, 4).Value = Range("C137").Value
            Workbooks("Statistik.xls").Sheets("Tabelle1").Cells(i , 5).Value = Range("C141").Value
            Workbooks("Statistik.xls").Sheets("Tabelle1").Cells(i , 6).Value = Range("C154").Value
            Workbooks("Statistik.xls").Sheets("Tabelle1").Cells(i , 7).Value = Range("C156").Value
            Workbooks("Statistik.xls").Sheets("Tabelle1").Cells(i , 8).Value = Range("C160").Value
            Workbooks("Statistik.xls").Sheets("Tabelle1").Cells(i , 9).Value = Range("C164").Value
            Workbooks("Statistik.xls").Sheets("Tabelle1").Cells(i , 10).Value = Range("C177").Value
            Workbooks("Statistik.xls").Sheets("Tabelle1").Cells(i , 11).Value = Range("C179").Value
            Workbooks("Statistik.xls").Sheets("Tabelle1").Cells(i , 12).Value = Range("C183").Value
            Workbooks("Statistik.xls").Sheets("Tabelle1").Cells(i , 13).Value = Range("C187").Value
            Workbooks("Statistik.xls").Sheets("Tabelle1").Cells(i , 14).Value = Range("C200").Value
            Workbooks("Statistik.xls").Sheets("Tabelle1").Cells(i , 15).Value = Range("C202").Value
            Workbooks("Statistik.xls").Sheets("Tabelle1").Cells(i , 16).Value = Range("C206").Value
            Workbooks("Statistik.xls").Sheets("Tabelle1").Cells(i , 17).Value = Range("C210").Value
            Workbooks("Statistik.xls").Sheets("Tabelle1").Cells(i , 18).Value = Range("C223").Value
            Workbooks("Statistik.xls").Sheets("Tabelle1").Cells(i , 19).Value = Range("C225").Value
            Workbooks("Statistik.xls").Sheets("Tabelle1").Cells(i , 20).Value = Range("C229").Value
            Workbooks("Statistik.xls").Sheets("Tabelle1").Cells(i , 21).Value = Range("C233").Value
    
    
    ActiveWorkbook.Saved = True
    ActiveWorkbook.Close
        
    Next i

    Application.ScreenUpdating = False
    
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 !
 

Thore

Grand Maître
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+
 

zeb

Modérateur
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 ;)
 

Acrun

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

Code:
        Dim cel_statistik As Range 
        Dim addr          As String
        Dim nomfichier As String

        Set cel_statistik = ws_statistik.Cells(119,  1) // Je comprends ce que fait cette ligne, ça prend le fichier Statistik.xls en mémoire ?

        For i = 1000 To 9999

        nomfichier = "M:\Blabla\000000" & i & ".csv"*

        If Not nomfichier Then Exit Sub  // C'est quoi l'intérêt de cette ligne ?
        Workbooks.OpenText Filename:=nomfichier, DataType:=1, Semicolon:=True, local:=True


        Set wb_csv = ActiveWorkbook //Même question que pour statistik

        For Each addr In ("B6", "C133", "C137", "C141", "C156", "C160", "C164", "C179", "C183", "C187", "C202", "C206", "C210", "C225", "C229", "C233" )
            cel_statistik.Value = wb_csv.Worksheets(1).Range(addr).Value
            Set cel_statistik = cel_statistik.Offset(0, 1) //Là j'ai compris mais ça à l'air de bugger 

        Next

        Set cel_statistik = cel_statistik.EntireRow.Cells(1,1).Offset(1, 0) 
        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.
 

zeb

Modérateur
Salut,

Code:
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 - sont tes amis [:patch]
 

Thore

Grand Maître
une idée comme ça !

si tu crée 2 sous-dossier l'un pour ceux qui sont à traiter et le second pour ceux qui sont fait ;-)
 
Vous devez vous inscrire ou vous connecter pour répondre ici.
Derniers messages publiés
Statistiques globales
Discussions
730 136
Messages
6 718 117
Membres
1 586 397
Dernier membre
Chachabidou
Partager cette page
Haut