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:
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? -
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 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
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 SubBonsoir
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!!!
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