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
A voir également:
Importer un fichier csv dans une feuille excel
Importer un fichier csv dans une feuille excel vba - Meilleures réponses
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.
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
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.
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
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
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
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
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.
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
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
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?
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
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.
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.
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.
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.
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,...)
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
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.
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
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é.