Macro pour ouvrir un fichier csv via le bloc note

Bonjour à tous et avant toutes choses je vous souhaite une belle nouvelle année pleine de formules et de vba

j'ai un petit soucis: j'aimerais via une macro, ouvrir avec le bloc note windows un fichier csv qui se trouve dans un dossier pour ensuite remplacer les "," (virgule) par des "." (points) et ensuite fermer ce fichier en enregistrants cette modification. Je ne trouve pas grand chose à ce sujet.

Merci de votre aide

Bonjour,

Le bloc-notes n'est pas absolument indispensable : tu peux l'ouvrir en Excel, tu auras une seule colonne ! ensuite remplacer par SUBSTITUTE les , par ; en refermer en enregistrant les modifications.

Bonjour,

merci pour votre réponse mais justement la procédure normale de conversion via excel ne fonctionne pas correctement, beaucoup de données disparaissent lors de cette manip. Le fichier csv provient de l'extraction d'une base de donnée d'un autre logiciel (sur lequel je ne peux pas intervenir) et pour remédier à ce problème il faut passer par un éditeur de texte et remplacer toutes les virgules par des points. On peut ensuite faire une conversion sous excel normalement.

Bonjour

Joins ton fichier csv original et on cherchera une solution...

Bye !

Bonjour,

Merci de joindre un fichier exemple que l'on puisse vérifier tes propos.

Cdlt.

Re-

Proposition et ... curiosité !

Si s'ouvre directement le fichier csv avec comme séparateur des virgules, la répartition des colonnes ne se fait pas.

Mais si je l'ouvre via une macro, c'est OK !!

Sub ouvrir_csv()

Nom_Fichier = Application.GetOpenFilename("Fichiers csv, *.csv")
If Nom_Fichier <> False Then
    Workbooks.Open Filename:=Nom_Fichier
End If

End Sub
159ouvrir-csv.xlsm (13.56 Ko)

Merci pour toutes vos réponses Je n'ai pas le fichier sous la main, je le récup demain.

J'ai déjà une macro de mise à jour qui va ouvrir ce fichier (csv), le converti (données=>convertir=>délimité=>point virgule) et l'enregistre ensuite dans la feuille d'un autre classeur.

Au moment de la conversion on se rend compte que des données ont déjà disparues, je me suis tourné vers le service info (qui gère les extractions de l'autre logiciel) et ce sont eux qui m'on donné cette solution de remplacer les virgules par des points avec un éditeur de texte, et après cette manip la macro de conversion fonctionne correctement.

Autre bizzarerie: si je fais un copier/coller manuellement des données du fichier csv en question dans ma feuille alors pas de problème, tout est là par contre si je fais exactement la même manip via une macro j'ai des données qui disparraissent

Je vous joint le fichier en question dès que je l'ai récupéré.

Merci à tous

Steelson votre code m'interpelle, je fais un essai dès demain avec

Bonjour à tous,

j'ai récupéré le fameux fichier

voici ce que j'obtient quand je copie ce fichier dans un autre classeur (via macro)

avantconversion

Pas de conversion à ce stade donc normal.

et voici après conversion (données=>convertir=>délimité=>point virgule)

apresconversion

Et voilà le problème, des données ont disparues, quasiment plus une seule donnée à partir de la colonne I

Voici le fichier en question (du moins les 100 premères lignes)

73pblmconversion.csv (10.21 Ko)

Merci

Mystère, car moi-même je vois des données au-delà de l'image ci-dessus !! voir fichier joint.

Le problème, enfin la cause, est "simple" : l'origine vient des nombres décimaux, Excel n'arrive plus à interpréter ensuite. Du reste, la première image le montre bien, seule la première colonne est interprétée jusqu'à la virgule de la décimale je suppose.

Que se passe-t-il si maintenant tu ouvres toi même le fichier csv avec Excel ?

Donne nous le fichier original si celui que nous a posté a déjà été modifié.

60data.xlsx (17.36 Ko)

Quand j'ouvre le fichier csv avec excel, pas de souci, toutes les données sont là, le problème comme expliqué plus haut c'est que dès que je copie ce fichier dans un autre classeur je me retrouve avec ce qu'on voit dans la 1ere image et après conversion des données ont disparues.

je sais qu'il y a trop de séparateurs mais je ne peux pas intervenir sur cette extraction, je dois trouver une solution avec ce fichier.

Merci de prendre le temps pou mon pblm

Comment effectue tu la copie ?

Je fais ceci et cela fonctionne :

  • je lance le fichier csv qui s'ouvre avec Excel
  • je clique en haut à gauche des cellules pour tout sélectionner
  • je fais Ctrl C
  • je recopie par Ctrl V dans le fichier Excel de destination

Si tu passes par le bloc notes cela ne fonctionne pas.

comardud a écrit :

j'ai un petit soucis: j'aimerais via une macro, ouvrir avec le bloc note windows un fichier csv qui se trouve dans un dossier pour ensuite remplacer les "," (virgule) par des "." (points) et ensuite fermer ce fichier en enregistrants cette modification.

Quel est réellement le besoin sans parler de solution ?

Est- ce qu'il s'agit de lire un fichier csv et l'intégrer à un fichier Excel existant dans un onglet particulier ?

Si oui, on a vu que le lancement direct prend en compte le point-virgule comme séparateur et la macro prend la virgule !! Dans ce cas, il faut lire ligne à ligne le fichier csv par macro comme un simple fichier texte, splitter chaque ligne sur le point-virgule et répartir les données sur la ligne.

Confirme le besoin sans trop évoquer de solution, on verra ce qu'il est possible de faire pour t'aider.

A tester (perfectible)

Sub lecture()

    Fichier = Application.GetOpenFilename("Fichiers csv, *.csv")
    If Fichier = False Then Exit Sub

    N = FreeFile
    Open Fichier For Input As #N

    i = 0
    Do While Not EOF(1)
        Line Input #N, Contenu
        i = i + 1

        Table = Split(Contenu, ";")
        For j = 0 To UBound(Table)
            Cells(i, j + 1).Value = Replace(Table(j), ",", ".")
        Next j

    Loop

    Close #N

End Sub
42lecture-csv.xlsm (15.11 Ko)

Bonjour à tous et bonjour Steelson.

Désolé de ne pas répondre plus vite je ne suis pas dispo la journée.

Effectivement, pour répondre à ton 1er post de ce jour, pour l'instant je fais un copier / coller manuel exactement comme tu le décris et ça fonctionne parfaitement, ce que je souhaite c'est faire ce même copier/coller via une macro (afin que n'importe qui puisse faire une mise à jour) sauf que c'est justement cette macro qui me pose problème puisque la conversion ne se fait pas correctement.

Je reprend tes questions:

Quel est réellement le besoin sans parler de solution ?

Besoin des données que contient ce fichier (données qui sont mises à jour automatiquement chaque nuit).

Est- ce qu'il s'agit de lire un fichier csv et l'intégrer à un fichier Excel existant dans un onglet particulier ?

oui c'est ça, ce fichier csv est une extraction d'un autre logiciel et sert de base de donnée à beaucoup d'autres feuille de calcul excel.Il est donc intégré dans diverses feuilles excel.

Ton code fonctionne sur la feuille que j'ai mis en exemple mais plante sur le fichier original (qui contient + de 4000 lignes),

le code bloque après je ne sais combien de lignes lues (au final seule la ligne d'entête apparait): Cells(i, j + 1).Value = Replace(Table(j), ",", ".")

Merci du coup de main

comardud a écrit :

Ton code fonctionne sur la feuille que j'ai mis en exemple mais plante sur le fichier original (qui contient + de 4000 lignes),

le code bloque après je ne sais combien de lignes lues (au final seule la ligne d'entête apparait): Cells(i, j + 1).Value = Replace(Table(j), ",", ".")

Bon, on n'est donc pas loin !

Si le code fonctionne ce n'est pas un problème de version d'Excel.

Est- ce que la ligne d'en-tête apparaît avec le code ou bien était-elle déjà présente avant de lancer ?

Le code doit bloquer dès la première ligne.

Le code (très sommaire) est-il intégré à une macro plus complète ? y a t-il un problème de nom de variable ? change le nom Table qui n'était pas approprié. Ensuite si besoin, déclare toutes les variables par dim, et change même les noms si c'est intégré à un ensemble plus large :

Option Explicit
Sub lecture()

Dim Fichiercsv, icsv, jcsv, Contenucsv, Tablecsv, Ncsv

    Fichiercsv = Application.GetOpenFilename("Fichiers csv, *.csv")
    If Fichiercsv = False Then Exit Sub

    Ncsv = FreeFile
    Open Fichiercsv For Input As #Ncsv

    icsv = 0
    Do While Not EOF(1)
        Line Input #Ncsv, Contenucsv
        icsv = icsv + 1

        Tablecsv = Split(Contenucsv, ";")
        For jcsv = 0 To UBound(Tablecsv)
            Cells(icsv, jcsv + 1).Value = Replace(Tablecsv(jcsv), ",", ".")
        Next jcsv

    Loop

    Close #Ncsv

End Sub

Au besoin, si ce n'est confidentiel, envoie le fichier. Ou alors on continue en MP et mail et on affichera la réponse finale ici pour retour d'expérience et en faire profiter la communauté.

Amicalement

Merci à toi Steelson, je viens de t'envoyer un mp

pour info, la ligne d'entête apparait avec le code et n'était pas présente avant de le lancer. J'ai testé le code seul sans l'intégrer à une autre macro.

Voilà, le plus dur est fait : ouvrir par macro le fichier csv avec comme délimiteur le ;

Et comme indiqué en MP, le problème venait aussi de ce que chaque ligne dans le fichier directement issu du système était séparée par un truc bizarre qui ne permettrait pas de traiter ligne par ligne avec LINE INPUT.

Et au global c'est plus propre que de toucher aux caractères . et ,

Sub ouvrir_csv()

Nom_Fichier = Application.GetOpenFilename("Fichiers csv, *.csv")
If Nom_Fichier <> False Then
    Workbooks.OpenText Filename:=Nom_Fichier, Origin:=xlWindows, _
        StartRow:=1, DataType:=xlDelimited, Local:=True, Semicolon:=True
End If

End Sub

Il ouvre dans un fichier séparé ... ensuite on peut y faire ce que l'on veut : enregistrer ce fichier, ou réimporter les données dans le fichier qui a servi à lancer l'extraction.

60ouvrir-csv.xlsm (14.03 Ko)

Bonjour à tous et bonjour Steelson (pense à dormir quand même)

je ne dirais qu'un mot: PARFAIT!!

ça fonctionne parfaitement

Une dernière petite chose, peut-on ouvrirr directement le fichier concerné ? (le chemin exact est:

"\\P610\aanceau_home\MFGPRO_CODESOFT_FLC.csv")

j'ai bien tenté mais rien à faire.

En tout cas merci, merci, merci

Ah Ben oui mais avec un rhume carabine ce n'est pas facile de dormir. Alors je fais fonctionner mes neurones.

Bien sûr tu peux ajouter une ligne avec

Nom_Fichier = "\\P610\aanceau_home\MFGPRO_CODESOFT_FLC.csv"

Mais pour être certain du chemin complet, ceci te le donnera :

Sub ouvrir_csv()

Nom_Fichier = Application.GetOpenFilename("Fichiers csv, *.csv")
If Nom_Fichier <> False Then
MsgBox Nom_Fichier
End If

End Sub

En tous cas, plus c'est (relativement) difficile avec des pièges, plus on est content du résultat et d'y être parvenu !

C'est parfait, impeccable, j'ai intégré ce code dans ma macro de mise à jour générale et ça marche magnifiquement bien

Merci merci et....merci

Rechercher des sujets similaires à "macro ouvrir fichier csv via bloc note"