Fusionner les données de fichiers csv dans une feuille Excel

Bonjour à tous!

Je vous expose ma problématique sachant que j'ai déjà regardé du côté d'une macro déjà proposée.

J'ai donc 10 fichiers CSV (pour être plus précis CSV Microsoft Excel, tel que cela apparaît à l'écran quand je suis dans le répertoire des fichiers CSV).

Chacun des fichiers possède des données (texte, et nombre) sur plusieurs colonnes et plusieurs lignes.

Et cela peut être différent d'un fichier à un autre au niveau du nombre de lignes.

Par contre les données sont toujours présentes pour les colonnes "de A à P".

Sachant que le tri que je voudrais faire (une fois les "données CSV" fusionnées) se fera sur les colonnes A ou E (qui contiennent les dates).

J'ai utilisé la macro suivante en test:

Sub importDonnees()

Dim principal As ThisWorkbook

Dim repertoire As String, fichier$

Application.ScreenUpdating = False

Set principal = ThisWorkbook

repertoire = "O:\Donnees\2013\resultats\fichiers csv\test"

fichier = Dir(repertoire & "*.csv")

Do While fichier <> ""

Workbooks.Open (repertoire & fichier)

ActiveSheet.UsedRange.Copy Destination:=principal.Sheets(1).Range("a" & Rows.Count).End(xlUp).Offset(1)

ActiveWorkbook.Close

fichier = Dir

Loop

End Sub

Et ceci avec seulement des données dans la colonne A.

Mais quand j'active la macro (dans Excel 2010), cela ne fonctionne pas?

Et là, je bloque.

Et je suppose que pour prendre en compte les données de toutes les colonnes (jusqu'à la colonne P), il faudra aussi

que je modifie cette macro.

Merci d'avance pour votre aide précieuse!

Bien à vous,

Eric

PS: je suis un newbie!

Bonsoir,

Merci de joindre ton fichier testé (Excel ) + 2/3 csv

Cdt,

Bonsoir!

Voilà donc d'abord les fichiers CSV:

1706542578.csv (189.00 Octets)
836542578-1.csv (302.00 Octets)
816542578-2.csv (107.00 Octets)
996542578-3.csv (797.00 Octets)

Et maintenant le fichier Excel contenant la macro pour fusionner les données des fichiers CSV

- mais là a priori, les données, compte tenu du code, (si cela fonctionnait) seraient uniquement "rapatriées" dans la colonne A? -

281fichierunique.xlsm (19.54 Ko)

Merci d'avance pour l'aide!! et en espérant que ces fichiers aideront à identifier le problème ou les problèmes!

Bien cordialement,

Eric

Bonjour

A tester

Bonjour Banzaï64!

Tout d'abord un grannnnd merci pour cette réponse que l'on peut dire résolvant le problème!!!!

J'apporte juste les élément suivants pour que tout soit parfait:

Il y avait juste une "coquille" dans la colonne E du fichier 6542578-3 à la ligne 8. La cellule contenait une virgule.

En laissant cette virgule, l'import shuntait toutes les données de la ligne 8 à partir de la colonne E jusqu'à la dernière colonne P.

En supprimant la virgule, les données manquantes ont "réapparu"!

Mais là, je ne vois pas pourquoi cette virgule "bloquait" l'import des données??

Je pourrais maintenant dire que c'est résolu maiiiiiiiis j'aurais une dernière requête. Un peu comme la cerise sur le gâteau!

Serait ce possible d'insérer une colonne - tout à gauche - qui deviendrait donc la colonne A où serait mentionné le nom du fichier CSV pour chacune des lignes contenant des données. Et aussi, si je peux me permettre d'insérer une première ligne où seront mentionnés les intitulés de chaque colonne.

Les noms des colonnes étant (in extenso) les suivants:

Fichier_terminal / date_opération / terminal / référence pdt / entrepôt / date_stockage / heure_stockage / coût_stockage / devise / code_vérification / contrôle / rayon / ligne_pdt / valeur_m² / actif / volumétrie rotation

Bien sûr je regarde aussi de mon côté, mais bon là, je pense que c'est encore plus ardu!!!

Encore merci (d'avance!) pour votre aide précieuse!

Eric

ps: c'est fou ce que l'on peut faire avec les macros....

Bonjour

A tester

Juste pour info : Tu avais oublié une séparation entre les deux derniers noms des entêtes

ericc a écrit :

...... ligne_pdt / valeur_m² / actif / volumétrie/ rotation

Bonjour.

Il y avait juste une "coquille" dans la colonne E du fichier 6542578-3 à la ligne 8. La cellule contenait une virgule.

En laissant cette virgule, l'import shuntait toutes les données de la ligne 8 à partir de la colonne E jusqu'à la dernière colonne P.

En supprimant la virgule, les données manquantes ont "réapparu"!

Mais là, je ne vois pas pourquoi cette virgule "bloquait" l'import des données??

Il faut spécifier les paramètres de la commande Workbooks.Open pour ne pas avoir de résultats imprévisibles.

 'virgule = 2: point_Virgule = 4
  Workbooks.Open repertoire & fichier, , , 4, , , True, , , , , , False, local:=True, corruptload:=xlNormalLoad
  

Cordialement

Docmarti

Bonsoir à tous!

Je viens de tester avec 15 fichiers. Et cela fonctionne impeccable. Merci à Banzai64! et Docmarti as well!

Il y a par contre juste "un dernier réglage" qui serait à faire au niveau des noms de fichier csv listés dans le tableau récapitulatif.

En effet, voir l'image ci dessous, c'est le fichier 6542578-15 qui apparait en premier - ligne 2 colonne A - alors qu'il devrait être

en ligne 28 colonne A.

Pourquoi vient il se coller juste avant le fichier 6542578.csv???

Merci encore pour ce "dernier réglage" car franchement c'est top! 8)

Bien cordialement,

Eric

ps: cette macro va permettre de gagner un temps fou !!!! 8) 8)

Bonjour

ericc a écrit :

Pourquoi vient il se coller juste avant le fichier 6542578.csv???

Sans doute la fonction Dir les trouve dans cet ordre

Rajoutes la ligne

    Fichier = Dir
  Loop
  Ws.Range("A2:B" & Ligne - 1).Sort key1:=Ws.Range("A2"), order1:=xlAscending, dataoption1:=xlSortNormal, Header:=xlNo
  Ws.Range("B2:B" & Ligne - 1).TextToColumns DataType:=xlDelimited, Tab:=False, Semicolon:=True, Comma:=False, Space:=False, Other:=False, _
                                FieldInfo:=Array(Array(1, xlDMYFormat), Array(5, xlDMYFormat))
End Sub

Bonsoir

ericc a écrit :

Il y a par contre juste "un dernier réglage" qui serait à faire au niveau des noms de fichier csv listés dans le tableau récapitulatif.

En effet, voir l'image ci dessous, c'est le fichier 6542578-15 qui apparait en premier - ligne 2 colonne A - alors qu'il devrait être

en ligne 28 colonne A.

Voici pour compléter ce que je suggérais.

Et si tous les fichiers sont du format "6542578-15", la routine "ListDesFichiers" devrait faire un tri en ne placant pas "6542578-15" avant "6542578-2".

Cordialement

Docmarti

Bonjour à vous!

En fait, le nom des fichiers provient d'une incrémentation effectuée par l'application ATTACHMENT EXTRACTOR dans THUNDERBIRD.

Ce qui me permet en amont d'extraire toutes les pièces jointes (tous les fichiers CSV) dans un seul répertoire. Ici, cela accélère le travail. Car on est pas obligé à chaque email reçu d'ouvrir le courrier puis d'effectuer un "enregistrer sous". De facto, pour bien différencier chaque fichier CSV, le plus simple a été de paramétrer le nom du fichier avec le numéro du terminal et une incrémentation.

Donc je peux avoir selon le mois (et l'activité) un nombre de fichiers différents, avec une pointe à 80 à ce jour.

Ceci étant précisé, je reprends vos "réglages techniques" et je reviens asap pour vous communiquer les résultats!

Merci encore!!

Bien cordialement,

Eric

@Docmarti:

Je viens de tester mais là j'ai (de mon côté) une fenêtre "bloquante" qui s'ouvre tout de suite après avoir cliqué sur le bouton "importer".

J'ai regardé dans le code et je n'ai pas vu de "With End With"?

Là, je suis plutôt "bloqué et pas "end bloqué"!


@BANZAI64

Alors voilà, je viens d'ajouter la modification comme tu l'as mentionnée.

Tous les fichiers CSV supérieurs à 9 (du 6542578-10 au 6542578-15) s'insèrent entre le 6542578-1 et le 6542578-2.

Est ce qu'il ne faudrait pas alors que je revoie la numérotation incrémentielle avec l'application d'extraction (voir post précédent)

de Thunderbird. Démarrer avec un 6542578-00 qui devrait logiquement être suivi par un 6542578-01 etc. Mais là il faut que je vois

si c'est faisable avec l'appli Attachment Extractor.

A moins que côté VBA il y ait un code possible?

Sinon voir dans la feuille Excel, en utilisant une fonction qui extrait les "x" premiers caractères (gauche ou droite) d'une cellule et ensuite faire un tri.

A voir.

Merci d'avance pour vos "correctifs" et commentaires.

Bien cordialement,

Eric

ericc a écrit :

@Docmarti:

Je viens de tester mais là j'ai (de mon côté) une fenêtre "bloquante" qui s'ouvre tout de suite après avoir cliqué sur le bouton "importer". Ci-après une capture-écran.

C'est une erreur qui se produit quand aucun fichier n'a été trouvé dans le répertoire.

As-tu modifié le chemin du répertoire pour l'adapter à ton propre besoin?

repertoire = "C:\Test2\Eric\"

Docmarti

Bonjour

Vérifies si c'est possible avec l'importation des fichiers

ericc a écrit :

A moins que côté VBA il y ait un code possible?

Bien sur voir le code de Docmarti

A toi de voir

Docmarti a écrit :
ericc a écrit :

@Docmarti:

Je viens de tester mais là j'ai (de mon côté) une fenêtre "bloquante" qui s'ouvre tout de suite après avoir cliqué sur le bouton "importer". Ci-après une capture-écran.

C'est une erreur qui se produit quand aucun fichier n'a été trouvé dans le répertoire.

As-tu modifié le chemin du répertoire pour l'adapter à ton propre besoin?

repertoire = "C:\Test2\Eric\"

Docmarti

J'avais tout simplement oublié l'antislash juste avant le dernier guillemet!

Et ça marche!

Maintenant il faut que je vois où intégrer le code de Banzai64 qui permet d'insérer les noms de colonne.

 Ws.Columns("A:Q").ClearContents
  Chemin = ThisWorkbook.Path & Application.PathSeparator
  Ligne = 2
Range("A1:Q1") = Array("Fichier_terminal", "date_opération", "terminal", "référence pdt", "entrepôt", "date_stockage", "heure_stockage", _
                         "coût_stockage", "devise", "code_vérification", "contrôle", "rayon", "ligne_pdt", "valeur_m²", "actif", _
                         "volumétrie", "rotation")
  Fichier = Dir(Chemin & "*.csv")
  Do While Fichier <> ""

Cela m'a l'air plus ardu que ce que je croyais!

Where?

Où donc? Où donc?

Merci encore pour ces derniers réglagles!

Eric

Bonsoir

Tu peux rajouter ici

    Set principal = ThisWorkbook
    With Sheets("Feuil")
      .Columns("A:Q").ClearContents
      .Range("A1:Q1") = Array("Fichier_terminal", "date_opération", "terminal", "référence pdt", _
                              "entrepôt", "date_stockage", "heure_stockage", "coût_stockage", _
                              "devise", "code_vérification", "contrôle", "rayon", "ligne_pdt", _
                              "valeur_m²", "actif", "volumétrie", "rotation")
   End With
    Set ListDir = Sheets.Add(After:=Sheets(Sheets.Count))
    repertoire = "C:\Test2\Eric\"

Re!

J'ai oublié d'évoquer le cas ci après qui me semblera être le dernier à élucider à savoir...

dans la colonne I j'ai les coûts de stockage qui sont "illlisibles" par excel pour faire des sommes par exemple.

Cela est dû certainement au format des cellules où les montants contiennent des "points" et non des virgules.

J'ai isolé la colonne I dans une autre feuille pour faire un "rechercher / remplacer" (passer donc du "point" à la "virgule"

et ensuite je copie toutes les sommes (en euros) et devenues "lisibles" par excel dans la feuille d'origine où ont été fusionnées toutes les données.

Hum, la manip' me semble un peu longue.

Est ce qu'un code VBA pourrait "transformer" les points en virgules lors de la fusion des fichiers csv? Ou faut il voir la problématique sur une autre macro?

Merci encore!

Eric


Banzai64 a écrit :

Bonsoir

Tu peux rajouter ici

    Set principal = ThisWorkbook
    With Sheets("Feuil")
      .Columns("A:Q").ClearContents
      .Range("A1:Q1") = Array("Fichier_terminal", "date_opération", "terminal", "référence pdt", _
                              "entrepôt", "date_stockage", "heure_stockage", "coût_stockage", _
                              "devise", "code_vérification", "contrôle", "rayon", "ligne_pdt", _
                              "valeur_m²", "actif", "volumétrie", "rotation")
   End With
    Set ListDir = Sheets.Add(After:=Sheets(Sheets.Count))
    repertoire = "C:\Test2\Eric\"

C'est super, ça marche! Du caviar tout ça! 8) 8) 8)

Si en plus, on peut rendre la colonne I "lisible" (voir ma question plus haut) en intégrant la soluce dans le même code,

ce sera forcément du Béluga!

A demain! Je dois couper.

Bonne fin de soirée à vous,

Eric

ps: ce forum est pro de chez pro, bravo!

ericc a écrit :

dans la colonne I j'ai les coûts de stockage qui sont "illlisibles" par excel pour faire des sommes par exemple.

Cela est dû certainement au format des cellules où les montants contiennent des "points" et non des virgules.

Pour remplacer le "." utilisé comme séparateur décimal, on peut utiliser la fonction VAL.

Après cette ligne

dest.Range(dest.Cells(lignedebut, 1), dest.Cells(ligneFin, 1)).Value = ActiveWorkbook.Name

Ajoute ces 5 lignes de code :

Dim j

For j = lignedebut To ligneFin

If InStr(dest.Cells(j, "I").Value, ".") > 0 Then

dest.Cells(j, "I").Value = Val(dest.Cells(j, "I").Value)

End If

Next

Cordialement

Docmarti

Cher Banzai64!

Cher Docmarti!

N'ayons pas peur des mots! C'est un résultat TOTALEMENT CONCLUANT!!! 8)

Chapeau bas aux artistes de l'Excel-VBA!

Là, je suis en train de créer mes autres répertoires (mois par mois) pour extraire tous les fichiers CSV avec Attachment Extractor.

Ensuite viendra l'import de toutes les données extraites des CSV. Et ce, grâce à votre MACRO.

Super beau boulot.

Big up!

Merci!

Eric

Rechercher des sujets similaires à "fusionner donnees fichiers csv feuille"