Ajouter des données fichiers csv dans un fichier excel [Résolu/Fermé]

Signaler
Messages postés
210
Date d'inscription
jeudi 23 novembre 2000
Statut
Membre
Dernière intervention
8 septembre 2014
-
Messages postés
210
Date d'inscription
jeudi 23 novembre 2000
Statut
Membre
Dernière intervention
8 septembre 2014
-
bonjour à tous,
je vous pose ma problematique
je recois tous les jours un fichier csv (toujours le même format) que je dois intégrer dans un fichier excel (toujours le même format mais differrent du fichier à ajouter)
je m explique un peu plus on retrouve les même colonnes (même titre) dans le deux fichiers mais dans un ordre different .
je voudrait automatiser les actions pour eviter des copier/coller longs et repetitifs
(peut etre une macro ou vb)
En esperant avoir que mes explications etaient assez claire
par avance merci de vos reponces et conseils

21 réponses

Messages postés
2200
Date d'inscription
lundi 6 mai 2013
Statut
Membre
Dernière intervention
3 mars 2021
318
Bonjour

Le principe: puisque les titres de colonnes sont identiques, on relève toutes les titres des entêtes de colonnes de la feuille .CSV
on relève les données
puis, sur le fichier de destination excel , on recherche l'emplacement de chaque colonne et on y recopie les données correspondantes.

Si vous ne connaissez pas le VBA, mettez en pièce jointe un échantillon de vos fichiers (il suffit que l'on voit les titres de colonnes) et on vous fera ça.

cdlt
Messages postés
210
Date d'inscription
jeudi 23 novembre 2000
Statut
Membre
Dernière intervention
8 septembre 2014
24
bonjour,
je connais un peu la programmation mais le VBA je connais le principe c est tout.

dans le fichier excel

Titre	Référence	Etat	Constat émis par	Sce-Section 	Date du constat	Description du constat	Action immédiate réalisée	Processus	Catégorie PAC	Sce-Section propriétaire	Date RRC	Commentaires RRC : actions	Échéance	Pour RMPAC 


dans le fichier csv

Titre	Référence	Créateur	Date de création	Suivi des étapes	Constat émis par	Service-Section émétteur	Source du constat	Date du constat	Découvert à l'occasion de	Famille d'activité réalisée	Description du constat	Action immédiate réalisée	Tranche	Etat de tranche	Local	Système élémentaire	Repère fonctionnel	Numéro de DI	OI Source	Commentaire ou proposition émetteur	Avis hiérarchique demandé	Information conduite en quart	Commentaire hiérarchique	Ligne de défense	Catégorie	Processus	Service-Section concerné	Nature du constat	Avis commentaires actions immédiates de la conduite	Catégorie PAC	Type d'analyse	Service-Section propriétaire	Code événement	Code déclaratif	Numéro fiche Saphir	Commentaires RRC	Constat à reprendre ou à compléter	Pour validation RMPAC	Pour RMPAC du	Commentaires RMPAC	Caractérisation validée en RMPAC	Date de validation RMPAC	Url du document

desole je n'arrive pas à mettre des fichiers exemples
Messages postés
2200
Date d'inscription
lundi 6 mai 2013
Statut
Membre
Dernière intervention
3 mars 2021
318
Bonjour

mettre une pièce jointe sur https://www.cjoint.com/ (suivre la procédure)

a+
Messages postés
210
Date d'inscription
jeudi 23 novembre 2000
Statut
Membre
Dernière intervention
8 septembre 2014
24
merci de prendre du temps pour moi

voici le fichier excel

https://www.cjoint.com/?CGbnjnAx1X6

et le fichier csv que je recois tous les matins

https://www.cjoint.com/?CGbnltFKgiz
Messages postés
2200
Date d'inscription
lundi 6 mai 2013
Statut
Membre
Dernière intervention
3 mars 2021
318
Bonjour

Ci-joint le fichier de récup des données

https://www.cjoint.com/?CGbryhPyAzP

j'aurai voulu que le fichier.csv s'ouvre à partir du fichier global, mais j'ai quelques petits soucis pour séparer les colonnes. Peut-être que quelqu'un sur ce forum viendra le résoudre, mais, en attendant, voici la procédure.

dans un premier temps ouvre le fichier Excel joint: GlobalCSV
puis à partir du même excel, ouvre ton fichier CSV avec le point virgule comme séparateur. (cette opération sera à faire tous les matins en attendant d'avoir la solution pour l'ouvrir automatiquement)

dans un deuxième temps, recopie les titres de colonne du fichier CSV et colle-les dans le fichier GlobalCSV , pour être sûrs qu'ils soient identiques des 2 côtés. (cette opération n'est à faire qu'une seule fois)

à partir de là, tu cliques sur le bouton "Import des données".

Je te propose donc d'essayer ceci en attendant l'automatisation d'ouverture du fichier CSV. si je trouve, je le mettrai ici.

fait des essais, si tu rencontres des problèmes, il s'agira sûrement des noms de colonnes différents entre les 2 fichiers.

bonne réception

cdlt
Messages postés
2200
Date d'inscription
lundi 6 mai 2013
Statut
Membre
Dernière intervention
3 mars 2021
318
j'ai oublié de te dire que ne connaissant pas le nom de ton fichier CSV, je l'ai baptisé "FichierCSV.csv" dans le code à 2 endroits, remplace par le nom de ton fichier
Messages postés
24016
Date d'inscription
mardi 11 septembre 2007
Statut
Contributeur
Dernière intervention
18 avril 2021
6 735
Bonjour,

Un code pour sélectionner le fichier CSV (ou les fichiers, sélection multiple possible) à partir d'une boite de dialogue.
J'ai ajouté la conversion avec le format date JMA pour les colonnes qui paraissaient en être.
Private Sub ouvreFichiers()
    Dim NomFichier As Variant, Filtre As String, cmpt As Long, fich() As String
    Filtre = "Tous les fichiers(*.CSV),*.CSV"
    NomFichier = Application.GetOpenFilename(Filtre, 1, "Ouvrir", , True)
    If IsArray(NomFichier) Then
        For cmpt = LBound(NomFichier) To UBound(NomFichier)
            Application.Workbooks.Open NomFichier(cmpt)
            Columns("A:A").TextToColumns Destination:=Range("A1"), DataType:=xlDelimited, _
               TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=False, _
               Semicolon:=True, Comma:=False, Space:=False, Other:=False, FieldInfo _
               :=Array(Array(1, 1), Array(2, 1), Array(3, 1), Array(4, 4), Array(5, 1), Array(6, 1), _
               Array(7, 1), Array(8, 1), Array(9, 4), Array(10, 1), Array(11, 1), Array(12, 1), Array(13, 1 _
               ), Array(14, 1), Array(15, 1), Array(16, 1), Array(17, 1), Array(18, 1), Array(19, 1), Array _
               (20, 1), Array(21, 1), Array(22, 1), Array(23, 1), Array(24, 1), Array(25, 1), Array(26, 1), _
               Array(27, 1), Array(28, 1), Array(29, 1), Array(30, 1), Array(31, 1), Array(32, 1), Array( _
               33, 1), Array(34, 1), Array(35, 1), Array(36, 1), Array(37, 1), Array(38, 1), Array(39, 1), _
               Array(40, 1), Array(41, 1), Array(42, 1), Array(43, 4), Array(44, 1)), _
               TrailingMinusNumbers:=True
        Next cmpt
    End If
End Sub

Si tu veux t'en servir pour ton fichier.

eric
Messages postés
2200
Date d'inscription
lundi 6 mai 2013
Statut
Membre
Dernière intervention
3 mars 2021
318
Bonsoir Eriiic

Merci infiniment pour ce coup de main, je l'intègre de ce pas dans le nouveau fichier

annule et remplace le précédent envoi
https://www.cjoint.com/?CGbuoaTzHjw

pour Tobas, je répète, avant de lancer l'application, ouvre les 2 fichiers dans le même excel, et corrige les titres de telle manière qu''ils soient identiques

merci encore Eriiic
bonne soirée à tous les deux

cordialement
Messages postés
210
Date d'inscription
jeudi 23 novembre 2000
Statut
Membre
Dernière intervention
8 septembre 2014
24
bonsoir à tous ,
je viens de tester le fichier avec le choix du fichier csv j ai du changer le nom du fichier dans le code mais tu m avais prevenu lol.
je sais que je suis embetent mais le premier fichier je ne peux pas modifier les titres (le fichier est utiliser pour integer les données dans un programme),donc je voulais si possible que la macro compare les titres et si identique elle recopie la colonne sinon elle passe à la suivant . si vous avez remarquer dans le fichiers import je ne prend pas toutes les infos, je ne recupere que les colonnes identiques a mon fichier final.
je vous renvoi le fichier final avec des données et les donnees csv a rajouter à la suite
https://www.cjoint.com/?0Gbv2BA2drL =>fichier final

https://www.cjoint.com/?0Gbv3JZoJHq =>fichiers donnée

merci pour le temps que vous consacré
cordialement
Messages postés
2200
Date d'inscription
lundi 6 mai 2013
Statut
Membre
Dernière intervention
3 mars 2021
318
Bonjour

Fichier modifié
Pour contourner le problème des noms de titre différents, j'ai créer une feuille supplémentaire "Emplacement" avec les titres de chaque fichiers et leurs colonnes respectives. En colonne F et G, les listes complètes, en A et C les champs retenus avec leurs emplacements. vérifie si je ne me suis pas trompé, en A14 je n'ai pas trouvé l'équivalent de la date RRC, à toi de compléter avant de lancer le programme de récup.

https://www.cjoint.com/?CGcfSGB0Ky5

je serai absent de la journée, on reverra tout ça à mon retour si il y a problème.

bonne journée

cdlt
Messages postés
210
Date d'inscription
jeudi 23 novembre 2000
Statut
Membre
Dernière intervention
8 septembre 2014
24
bonjour,
je reviens apres plusieur essai .j ai fait les modifications et completer les listes pour les champs=> tout marche bien.
mais au bout du deuxieme fichier l'ouverture du fichier donne n'importe quoi (il ne respecte plus les ";" et coupe un peut n importe comment(soit un espace soit une virgule) j ai lu dans different forum qu'il fallait soit mettre en place la variable "Local:=True" dans l'ouverture du fichier mais je ne sais pas ou la placer dans le code soit utiliser la fonction "split" ou tu dois definer le caractere separateur mais la c'est un peu du chinois donc si tu peut encore m aider je te remercie
bonne soirée
cdlt
Messages postés
24016
Date d'inscription
mardi 11 septembre 2007
Statut
Contributeur
Dernière intervention
18 avril 2021
6 735
Re,

je ne sais pas si c'est à moi que tu t'adresses mais dans le dernier fichier mis je plante à :
ColCSV(i) = Cells(i + 2, 2)
à cause du #N/A! en B14
Et si tu appelles bien OuvreFichiers tu ne récupères pas le nom du fichier. Tu continues à t'adresser à FichierCSV.csv.
Après ouverture le nom du classeur actif est ActiveWorkbook.Name

eric
Messages postés
2200
Date d'inscription
lundi 6 mai 2013
Statut
Membre
Dernière intervention
3 mars 2021
318
Bonsoir Tobas, Bonsoir Eriiic

Oui notre ami Tobas à bien rectifier le nom du fichier et mis la valeur manquante en A14 (valeur que je ne trouvais pas dans sa liste), puisque ça à fonctionner au moins une fois. ce qui est curieux, c'est que ça ne fonctionne plus à l'ouverture d'un 2ème fichier.csv.
Question: est-ce qu'en fermant et ouvrant de nouveau le fichier et en faisant l'import, cela marche correctement?

Tobas si tu pouvais faire la manip et nous le confirmer, histoire d'y voir plus clair

en attente de ta réponse

Eriiic, connais-tu cette variable local qu'il faut mettre à true dont nous parle Tobas?
Messages postés
210
Date d'inscription
jeudi 23 novembre 2000
Statut
Membre
Dernière intervention
8 septembre 2014
24
bonjour à tous,
je comfirme Frenchie83 que j ai bien rectifier le fichier.
Mais je pense que le probleme vient des commentaires du fichier csv qui contiennent des espaces et des virgules, c'est pourquoi j ai parlé des infos que j ai recuperer dans mes recherches.
je vous mets les bout de code don cje parle pour que vous regarder
Sub import()
Dim myFso As Object, csvFile As Object
Dim csvLine As String, csvDelimiter As String, csvFileName As String, tabStr() As String
Dim i As Integer, iLigne As Integer, iColonne As Integer


'fichier texte à traiter
csvFileName = "C:\Users\JB0793DN\Documents\import\export CS VDOC.csv"
'délimiteur csv
csvDelimiter = ";"

'ouvrir le fichier CSV
Set myFso = CreateObject("Scripting.FileSystemObject")
Set csvFile = myFso.OpenTextFile(csvFileName)

'tant qu'on est pas à la fin du fichier CSV (boucle sur chaque ligne)
While Not csvFile.AtEndOfStream
    iLigne = iLigne + 1
    iColonne = 0
   'lire la ligne suivante
    csvLine = csvFile.ReadLine
    '"spliter" la ligne
    tabStr = Split(csvLine, csvDelimiter)
    'boucler sur chaque élément de la ligne
    For i = LBound(tabStr) To UBound(tabStr)
        iColonne = iColonne + 1
        Debug.Print "Ligne " & iLigne & ", Colonne " & iColonne & " --> " & tabStr(i)
        Next i
Wend

' fermer le fichier
csvFile.Close
Set csvFile = Nothing: Set myFso = Nothing
End Sub


et pour la variable Local
Workbooks.OpenText Filename:=NomFic, DataType:=1, Semicolon:=True, local:=True
Messages postés
24016
Date d'inscription
mardi 11 septembre 2007
Statut
Contributeur
Dernière intervention
18 avril 2021
6 735
Bonjour,

Mais je pense que le probleme vient des commentaires du fichier csv qui contiennent des espaces et des virgules
Si le csv que tu as mis en exemple ne correspond pas à ceux que tu as c'est sûr que ça va moins bien marcher...
Frenchie a sûrement bossé pour rien.

eric
Messages postés
210
Date d'inscription
jeudi 23 novembre 2000
Statut
Membre
Dernière intervention
8 septembre 2014
24
bonjour eric,
je ne comprend pas pourquoi tu dis que "Frenchie a sûrement bossé pour rien. "
dans le fichier exmple que je vous ai transmis il y a bien des colonnes avec description (avec espace et virgules dedans).
le code fonctionne avec le le premier fichier donc jolie travail de frenchie mais je rencontre un soucis lors de l ouverture d'un autre fichier avec plus d'ecriture dans les colonnes.
Je n ai pas la meme chose quand je l ouvre directement dans excel (excel coupe au niveau des ";") et quand je passe par l 'ouverture via la macro.
je comprend la dificultée des macros et je ne veux surtout pas faire perdre du temps à des personnes qui s'investissent dans le forum.

cdlt
Messages postés
24016
Date d'inscription
mardi 11 septembre 2007
Statut
Contributeur
Dernière intervention
18 avril 2021
6 735
La question qui se pose c'est : est-ce que c'est correct si tu ouvres ce fichier en premier ou pas ?
Savoir si c'est son format ou le fait d'être ouvert en second qui joue, car tu émets les 2 hypothèses.
Et déposer un extrait de fichier mal traité en précisant à partir de quelle ligne-colonne ce n'est pas bon.

eric
Messages postés
2200
Date d'inscription
lundi 6 mai 2013
Statut
Membre
Dernière intervention
3 mars 2021
318
Bonjour Tobas, Bonjour Eriiic

Tobas: Pour que l'on puisse y voir plus clair, pourrais-tu remettre un échantillon du fichier.csv qui plante, afin que l'on puisse comparer les différences avec le précédent envoi.

merci

A+
Messages postés
210
Date d'inscription
jeudi 23 novembre 2000
Statut
Membre
Dernière intervention
8 septembre 2014
24
Bonjour je vous envoi des imprimes ecran de ce que je vois
et les fichiers

https://www.cjoint.com/?CGdlL1xvoGD =>imprime ecran fichier via la macro

https://www.cjoint.com/?CGdlNydRkFl =>imprime ecran fichier direct excel

https://www.cjoint.com/?CGdlOXoXRZk =>fichier de frenchie83 modifié (nom du fichier et colonne)

https://www.cjoint.com/?CGdlQbudd6I =>le fichier de données

https://www.cjoint.com/?CGdlUvMrbVd => le fichier que j ai fait au debut avec l enregistrement macro (le code est moche )

j espere que tout cela va vous aider

encore merci
cdlt
Messages postés
210
Date d'inscription
jeudi 23 novembre 2000
Statut
Membre
Dernière intervention
8 septembre 2014
24
bonjour,
j ai trouvé où je devait metrre ma variable Local


Application.Workbooks.Open NomFichier(cmpt), Local:=True


ce qui oblige excel a prendre en compte le separateur ";"

je vous mets le fichier modifier et fonctionnel avec des commentaires sur les lignes pour expliquer la fonction

https://www.cjoint.com/?CGdo1JpBhWa

vous pourrez me dire si j ai bon dans mes commentaires


si je peux encore vous embeter encore un peu mais c'est du superflus
est que l'on peut lors de la copie des données reprendre le format de la cellule (police,orentation,...)

MERCI
cdlt
Messages postés
2200
Date d'inscription
lundi 6 mai 2013
Statut
Membre
Dernière intervention
3 mars 2021
318
Re

Et est-ce qu'avec la variable local=true cela marche mieux?

De mon côté, je bataille avec ton fichier csv, du fait qu'on ne le reçoit pas de la façon que toi tu dois le recevoir. (certaines données sont écrites sur des lignes différentes alors qu'elles font partie d'une même cellule)

Si ça marche avec la petite modif tant mieux

pour ce qui est de la mise en forme, j'ai utilisé l'enregistreur de macro et l'ai rajouté en fin de macro

https://www.cjoint.com/?CGdphMkm89a

A+
Messages postés
210
Date d'inscription
jeudi 23 novembre 2000
Statut
Membre
Dernière intervention
8 septembre 2014
24
Re,
frenchie83 ne bataille pas trop ,la variable fonctionne bien sur mes fichiers.
petit question tu as regarder les commentaires dans mon code ils sont correct ou tu as des choses à ajouter pour eclairer les fonctions ?
je te remercie encore une fois ainsi qu'Eriic pour le temps passer à regarder mon probleme et à le resoudre.

Merci
A+
Messages postés
2200
Date d'inscription
lundi 6 mai 2013
Statut
Membre
Dernière intervention
3 mars 2021
318
Bonjour Tobas

merci d'avoir répondu,
Tes commentaires sont impeccables et facilitent la lisibilité du code.

puisque çà marche bien ainsi, je te souhaite donc, une bonne continuation et une très bonne journée.

Je remercie également Eriiic pour ses compétences et son aide très précieuse.

A la prochaine
cordialement
Messages postés
210
Date d'inscription
jeudi 23 novembre 2000
Statut
Membre
Dernière intervention
8 septembre 2014
24
bonjour,
je suis désolé mais je reviens vers vous pour rajouter une pierre dans ma problematique.
je viens de remarquer que dans l'importation,on ne gerer pas les doublons.
je m 'explique.
lors de l'importation ,on doit verifier si la reference existe si elle existe on l'a met à jour (on copie les donnees de la ligne entiere) sinon on l'ajoute.
j ai deja modifier la macro d'importation pour envoyer sur un feuille differente (temp) et creer une macro de comparaison (qui ne marche pas comme je veut)
je vous mette le fichier excel avec un fichier exemple

https://www.cjoint.com/?0GklakwBG7Q fichier excel avec la macro

https://www.cjoint.com/?0GklbnoZat6 fichier export

merci de prendre un peu de temps pour regarder

cordialement
Messages postés
2200
Date d'inscription
lundi 6 mai 2013
Statut
Membre
Dernière intervention
3 mars 2021
318
Bonjour

Voici la modif

https://www.cjoint.com/?CGldiRZChpH

je récapitule; si la référence existe déjà, on écrase les anciennes données , sinon on rajoute les nouvelles donnes à la suite

en espérant que j'ai bien compris et que cela réponde à tes attentes.

bonne journée

cdlt
Messages postés
2200
Date d'inscription
lundi 6 mai 2013
Statut
Membre
Dernière intervention
3 mars 2021
318
Re

il me vient une idée, mais comme je dois partir à mon boulot, je t'invite à le faire toi-même, et vu ce que tu sais faire, je me fais pas de soucis.
le but:
dans la feuil1, ajoute une colonne baptisée ordre chronologique.
on ne passe pas par la feuille "temp" , on copie les données dans la feuil1 à la suite sans ce soucier si il y a des doublons. (ce qu'on faisait avant)
puis au bout de chaque nouvelle ligne, dans la colonne "ordre chronologique", on rajoute un numéro composé de" l'année en cours, numéro du jour de l'année" ce qui donnerai une valeur de la forme 2013,156
Partant de là, il n'y a plus qu'à faire un tri, par référence et par ordre chronologique
les références étant maintenant accolées, il suffit de comparer la référence de la ligne en cours avec celle de la ligne en dessous. si elles sont différentes, on passe à la suivante, sinon on supprime la ligne active, et on continu.
bien sûr, comme les lignes déjà existante non pas de numéros d'ordre, il suffit d'en rajouter un, identique pour toutes les lignes, et inférieur au numéro du jour

avec ce procédé, tu te passes de la feuille temp, d'où gain en rapidité.

A+
Messages postés
210
Date d'inscription
jeudi 23 novembre 2000
Statut
Membre
Dernière intervention
8 septembre 2014
24
merci encore
je vais faire des tests et je te tiens au courant

petite question personnel tu dors quand ???????
Messages postés
2200
Date d'inscription
lundi 6 mai 2013
Statut
Membre
Dernière intervention
3 mars 2021
318
très peu, trop peu