Importer 1078 fichiers csv en un seul fichier Excel

enviromtl

XLDnaute Nouveau
Salut à tous :)

D'abord J'aimerais souligner ma grande appréciation que j'ai pour ce forum.
À ce jour j'ai réussi à répondre à pas mal de mes questions. Continuer ce beau travail :cool:

Aujourd'hui, je fais face à une problématique un peu particulière. J'aimerais importer le contenu de 1078 fichier csv dans un seul fichier excel.
D'une manière plus spécifique, j'aimerais copier le contenu des cellules (A2:Q25) 1078 fois (voir exemple de fichier en pièce jointe, les autres suivent la même logique 24 heures et sont classé par date).

Je vous remercie d'avance pour vos aides et j'ai bien hate de lire de vos réponses :cool:

Ben
 

Pièces jointes

  • 20060119DAM_energy_rep.zip
    3.1 KB · Affichages: 158

Victor21

XLDnaute Barbatruc
Re : Importer 1078 fichiers csv en un seul fichier Excel

Bonsoir, enviromtl

Je n'ai pas tout compris ...
Copier ou convertir ?
Il y a 53 données par ligne, ce qui nous emmène à la colonne bA, et non pas Q.
S'il s'agit de convertir, sélectionne la colonne A, puis Données, Convertir, Type délimité, séparateur virgule.
 

enviromtl

XLDnaute Nouveau
Re : Importer 1078 fichiers csv en un seul fichier Excel

Bonsoir Victor21 :),

Tu as vu juste. Effectivement, il ya 53 donnés par ligne ce qui nous amène à la colonne ba. Pour l'instant, je suis juste intéressé par les 15 premières données (ce qui nous amène à la colonne Q) mais ce n'ai pas grave dans le cas contraire.

Le plus important, c'est convertir les lignes (2 à 25 (avant dernière ligne)) des 1078 csv vers un seule xlsx.

l'option que tu propose m'amène à tous faire manuellemement 1078 fois ce qui risque d'etre long et surtout faire des erreurs. DOnc je ne sais s'il ya une procédure plus rapide voir du VBA

Je ne sais pas si j'ai bien reussi à répondre à tes questions

Merci d'avances :cool:

Ben
 

JNP

XLDnaute Barbatruc
Re : Importer 1078 fichiers csv en un seul fichier Excel

Bonjour le fil, bienvenue Enviromtl :),
1078 fichiers de 25 lignes ne font que 26 950 lignes donc pas de soucis, tu es en 2010, 2003 : plus de 35 000 lignes, 2010 : plus de 1 000 000 lignes :p...
Trop de colonnes, pas de soucis, il suffira d'éliminer les colonnes après importation (plus rapide à mon avis que de s'arranger pour n'importer que les colonnes qui nous intéresse :rolleyes:).
Là où commence les problèmes :
1078 fichiers, certes, soit en principe du 19/01/2006 au 01/01/2009, mais est-ce que tous les fichiers CSV sont de la forme "aaaammjjDAM_energy_rep.csv" entre ces 2 dates, est-ce qu'il en manque :rolleyes: ?
Les dates du CSV sont à l'anglaise avec horaire, l'import ne les reconnait pas, dans quel format faut-il les remettre ?
Les chiffres sont en anglais avec ".", il faudra les remplacer en "," (ça, pas trop de problème)...
Bref, en VBA, pas de soucis, mais avec beaucoup plus de renseignement...
Bon courage :cool:
 

enviromtl

XLDnaute Nouveau
Re : Importer 1078 fichiers csv en un seul fichier Excel

Salut JNP

1-Le dernier fichier est 20081231DAM_energy_rep
2-Tout les fichiers CSV sont de la forme "aaaammjjDAM_energy_rep.csv" avec 0 manques entre ces 2 dates
3-Oui effectivement, les dates du CSV sont à l'anglaise avec horaire, le format importe peut. Par contre c'est très important de ne pas perdre l'info date et heure
4- Yep, Les chiffres sont en anglais avec ".", pas forcément nécesaire de les remplacer en ","format mais ce n,est pas grave si c'est le cas.

Merci d'avance JNP

Ben :)
 

job75

XLDnaute Barbatruc
Re : Importer 1078 fichiers csv en un seul fichier Excel

Bonsoir enviromtl , Victor21, Jean-Noël,

Dans le fichier Excel de restitution lancez cette macro :

Code:
Sub CopierFichiersCSV()
Dim F As Worksheet, deb&, fin&, chemin$, i&, fichier$
Set F = ActiveSheet 'feuille de restitution
deb = CLng(CDate("19/01/2006")) 'pour le 1er fichier
fin = CLng(CDate("31/12/2008")) 'pour le dernier fichier
chemin = ThisWorkbook.Path & "\" 'à adapter
Application.ScreenUpdating = False 'fige l'écran
Application.DisplayAlerts = False 'si des fichiers sont déjà ouverts
On Error Resume Next 'si des fichiers n'existent pas
F.Cells.ClearContents 'vide la feuille
For i = deb To fin
Err = 0
fichier = Format(i, "yyyymmdd") & "DAM_energy_rep.csv"
Workbooks.Open chemin & fichier
If Err = 0 Then 'si le fichier a bien été ouvert
  Range(IIf(i = deb, 1, 2) & ":25").Copy F.[A65536].End(xlUp)(2)
  ActiveWorkbook.Close 'fermeture du fichier
End If
Next
F.Rows(1).Delete 'en effet la ligne 1 est vide
Columns(1).AutoFit 'ajustement facultatif
Columns("R:IV").Delete 'facultatif
End Sub
On remarque que l'ouverture sous Excel et le Copier/Coller font tout :

- conversion en colonnes

- format correct des dates

- nombres avec le séparateur décimal adéquat.

A+
 
Dernière édition:

JNP

XLDnaute Barbatruc
Re : Importer 1078 fichiers csv en un seul fichier Excel

Re :),
Ok, je me suis trompé d'un jour entre 01/01/2009 et 31/12/2008 :p...
Bon, si tu fait un import avec l'enregistreur de macro :
Code:
With ActiveSheet.QueryTables.Add(Connection:= _
    "TEXT;C:\Users\JNP\Desktop\20060119DAM_energy_rep.csv", Destination:=Range( _
    "$A$1"))
    .Name = "20060119DAM_energy_rep"
    .FieldNames = True
    .RowNumbers = False
    .FillAdjacentFormulas = False
    .PreserveFormatting = True
    .RefreshOnFileOpen = False
    .RefreshStyle = xlInsertDeleteCells
    .SavePassword = False
    .SaveData = True
    .AdjustColumnWidth = True
    .RefreshPeriod = 0
    .TextFilePromptOnRefresh = False
    .TextFilePlatform = 850
    .TextFileStartRow = 1
    .TextFileParseType = xlDelimited
    .TextFileTextQualifier = xlTextQualifierDoubleQuote
    .TextFileConsecutiveDelimiter = False
    .TextFileTabDelimiter = False
    .TextFileSemicolonDelimiter = False
    .TextFileCommaDelimiter = True
    .TextFileSpaceDelimiter = False
    .TextFileColumnDataTypes = Array(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, _
    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1)
    .TextFileTrailingMinusNumbers = True
    .Refresh BackgroundQuery:=False
End With
Il te suffit de rajouter une boucle de 38736 à 39813 (respectivement 19/01/2006 et 31/12/2008), de modifier ton chemin avec par exemple, si I est ta boucle
Code:
"TEXT;C:\Users\JNP\Desktop\20060119DAM_energy_rep.csv"
devient
Code:
"TEXT;C:\Users\JNP\Desktop\" & Format(I, "yyyymmjj") & "DAM_energy_rep.csv"
avec ton propre chemin à la place du mien.
Tu peux voir pour supprimer la première et la dernière ligne avec
Code:
Rows(J).Delete
Rows(J + 25).Delete
en partant de J = 1 et en écrivant
Code:
J = J + 24
avant la fin de la boucle.
Code:
Destination:=Range( _
"$A$1"))
peut être écrit
Code:
Destination:=Range( _
"$A$" & J))
pour que la ligne d'import suive.
La connexion
Code:
.Name = "20060119DAM_energy_rep"
doit changer de nom, donc
Code:
.Name = I & "_energy_rep"
devrait fonctionner.
Il y a peut-être des ajustement entre mes 24 ou 25 à faire, mais bon :rolleyes:...
Voilà, je crois que tu as toutes les cartes en main pour écrire ton code :p !
Bon courage :cool:
 

job75

XLDnaute Barbatruc
Re : Importer 1078 fichiers csv en un seul fichier Excel

Re,

J'avoue Jean-Noël que je ne comprends pas bien.

Pourquoi ne pas ouvrir les fichiers csv sous Excel avec Workbooks.Open ?

C'est en tout cas ce que ma macro fait, et ça marche très bien :confused:

A+
 

enviromtl

XLDnaute Nouveau
Re : Importer 1078 fichiers csv en un seul fichier Excel

Pour l'instant j'ai utilisé ta méthode vu que tu étais le premier à proposer un code...:cool:
Par contre, je compte essayer la méthode de Jean-Noel pour qu'il ait pas fait tout ce travail pour rien :)

Bonne soirée

Ben
 

JNP

XLDnaute Barbatruc
Re : Importer 1078 fichiers csv en un seul fichier Excel

Re :),
Pourquoi ne pas ouvrir les fichiers csv sous Excel avec Workbooks.Open ?
Pour plusieurs raisons ;) :

1) Le CSV fourni est un CSV anglais, avec séparateur ",", sous 2003, il semblerait que ce soit reconnu, mais sous 2010, je récupère tout en 1ère colonne vu que le séparateur français du CSV est le ";" (c'est bizare d'ailleurs car le demandeur est en 2010 aussi, peut-être version anglaise, ou il y a peut-être une préférence à règler quelque part, mais je ne la connais pas :eek:). Donc il faudrait que je passe par un .TextToColumns ensuite...

2) Le CSV n'est pas un format Excel, mais un format TXT avec séparateur. Il parait plus logique de l'importer que de l'ouvrir. Nous avions d'ailleurs suivi la démarche inverse (écriture ligne par ligne) pour exporter un CSV en format anglais car Excel n'accepte de faire du CSV qu'avec le séparateur ";" (en tout cas chez moi :rolleyes:), mais c'est un autre post.

3) L'importation permet tout un jeu de paramétrage que ne permets pas l'ouverture. Ici, la colonne A contient des dates + des heures et ça ne marche pas, mais s'il y avait uniquement des dates, on pourrait paramétrer le fait qu'elles soient en anglais ou en français.

4) Logiquement, l'ouverture d'un fichier CSV, c'est la création d'un nouveau fichier Excel dans lequel on importe le contenu du CSV, donc au niveau performance (il y a quand même 1078 fichiers en jeu ;)), on a d'un côté un import avec suppression de 2 lignes, de l'autre la création d'un objet WorkBook, l'import, un copier/coller (on y gagnerait à écrire une égalité de tableau, je pense :p), la destruction de l'objet. En complétant le type de macro que je proposais avec une désactivation de l'affichage comme dans ta macro, je pense qu'on doit obtenir des temps de réponse assez différent (mais je n'ai pas 1078 fichiers CSV sous la main pour tester :p).

Tout ceci n'enlève rien à la qualité de ta macro, et l'essentiel est que Enviromtl soit content :D.


Par contre, je compte essayer la méthode de Jean-Noel pour qu'il ait pas fait tout ce travail pour rien :)
Merci. Si ton problème est "One Shot" (et je pense que c'est le cas :rolleyes:), la différence de performance ne t'affectera pas, mais toute connaissance est bonne à prendre, et comparer les 2 méthodes proposées (il y en a d'autres, comme la lecture du fichier en TXT ligne par ligne qui peux être très intéressante quand tu veux filtrer le résultat au passage :rolleyes:) ne peux que t'enrichir.

Si tu vas jusqu'au bout, les temps de traitements obtenus avec les 2 méthodes peuvent être interressants à poster, j'ai déjà eu des surprises avec des codes que j'aurais pensé optimisés et qui était finalement plus lents que d'autres :eek:...

Bonne journée :cool:
 

job75

XLDnaute Barbatruc
Re : Importer 1078 fichiers csv en un seul fichier Excel

Bonjour le fil, le forum,

Un grand merci Jean-Noël pour ces explications.

J'ai testé les 2 méthodes (1078 boucles sur 1 seul fichier csv) :

1) macro job75 => 145 s

Ouverture/fermeture du fichier prennent 140 s, la copie seulement 5 s...

2) méthode JNP => 58 s, mais il reste à faire les opérations suivantes :

- supprimer à chaque boucle les 2 lignes titres et Total

- convertir la colonne A en dates au bon format (ça prendra du temps)

- utiliser le bon séparateur décimal.

Edit : tests faits sur mon vieil ordi avec Excel 2003.

A+
 

JNP

XLDnaute Barbatruc
Re : Importer 1078 fichiers csv en un seul fichier Excel

Re :),
J'ai testé les 2 méthodes (1078 boucles sur 1 seul fichier csv) :

1) macro job75 => 145 s

Ouverture/fermeture du fichier prennent 140 s, la copie seulement 5 s...

2) méthode JNP => 58 s, mais il reste à faire les opérations suivantes :

- supprimer à chaque boucle les 2 lignes titres et Total

- convertir la colonne A en dates au bon format (ça prendra du temps)

- utiliser le bon séparateur décimal.
C'est bien ce que je disais, il y a parfois des surprises sur le timing :p...
La troisième méthode serait peut-être plus rapide, mais bon, si j'ai le temps, je proposerai le code pour que Job puisse le tester ;)...
Un autre facteur qui devrait jouer, c'est le nombre de lignes du CSV (ici 25), je pense que les résultats seraient encore très différents avec des fichiers de 1000 lignes :rolleyes:...
Par contre, chez moi, comme précisé, l'ouverture ne fonctionne pas bien, donc les opérations de retraitement seraient aussi indispensables à l'ouverture :eek:.
A + :cool:
 

kiki29

XLDnaute Barbatruc
Re : Importer 1078 fichiers csv en un seul fichier Excel

Salut, infos sur format CSV et option Local:=True/False ,si cela peut être utile
Depuis XL 2002, l'export en CSV via VBA prend par défaut pour séparateur une ","
sauf si on le fait à la main : Fichier Enregistrer sous CSV (séparateur point-virgule)

L'aide en ligne sur SaveAs :
Local Argument de type Variant facultatif. La valeur True enregistre les fichiers en fonction de la langue de Microsoft Excel (y compris les paramètres du Panneau de configuration). La valeur False (valeur par défaut) enregistre les fichiers en fonction de la langue de Visual Basic pour Applications (VBA) (qui est généralement l'anglais des États-Unis, sauf si le projet VBA où Workbooks.Open est exécuté est un ancien projet VBA XL5/95 de niveau international).

de même pour OpenText sur option Local :
Spécifiez True si les paramètres régionaux de l'ordinateur doivent être utilisés pour la mise en forme des séparateurs, des nombres et des données.
 

Discussions similaires

Statistiques des forums

Discussions
312 215
Messages
2 086 325
Membres
103 179
dernier inscrit
BERSEB50