IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Remplacer les retours chariot et retour à la ligne dans un fichier csv depuis Excel. [XL-2007]


Sujet :

Macros et VBA Excel

  1. #1
    Nouveau membre du Club
    Inscrit en
    Novembre 2009
    Messages
    47
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 47
    Points : 36
    Points
    36
    Par défaut Remplacer les retours chariot et retour à la ligne dans un fichier csv depuis Excel.
    Bonjour,

    Je souhaite supprimer tous les retours chariots dans un fichier csv depuis une macro sous excel. Le rechercher remplacer fonctionne avec des mots, mais pas avec le code retour chariot.

    Pourriez-vous m'aider à comprendre mon erreur car là, je suis dans impasse.

    Merci d'avance

    Voici mon code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
     
    Sub ModifTEXT()
     
    Dim str As String
    Dim fso As FileSystemObject ' AJOUTER LA REFERENCE (VOIR FAQ SI BESOIN)
    Dim ts As TextStream
     
    Set fso = New FileSystemObject
    ' ouvre le fichier
     
    Set ts = fso.OpenTextFile("M:\export.csv")
     
    ' met tout le contenu dans une variable
    str = ts.ReadAll
    ts.Close
    ' remplace
    str = Replace(str, "Du texte", "Un autre texte")
    str = Replace(str, "Chr13", " - ")
    str = Replace(str, "Chr10", " - ")
     
     
    ' on écrase
    Set ts = fso.createtextfile("M:\export.csv", True)
    ts.write str
    ts.Close
     
    'on libère la mémoire
    Set fso = Nothing
    Set ts = Nothing
    MsgBox "OK"
     
    End Sub

  2. #2
    pgz
    pgz est déconnecté
    Expert éminent Avatar de pgz
    Homme Profil pro
    Développeur Office VBA
    Inscrit en
    Août 2005
    Messages
    3 692
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Office VBA
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2005
    Messages : 3 692
    Points : 6 591
    Points
    6 591
    Par défaut
    Bonsoir.

    Ce n'est pas maisTu peux aussi utiliser les constantes vbCr, vbLf et même VbCrLf. Par exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    str = Replace(str, vbCr, " - ")
    Cordialement,

    PGZ

  3. #3
    Nouveau membre du Club
    Inscrit en
    Novembre 2009
    Messages
    47
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 47
    Points : 36
    Points
    36
    Par défaut
    Merci PGZ, mais ça, ne fonctionne toujours pas. J'ai essayé plein de possibilités comme passer mon csv en .txt, rechercher \n ou \r, ...
    Je mets un extrait de mon fichier TXT en pj, peut-être qu'il ne s'agit pas de retour chariot.
    Merci pour votre aide
    Fichiers attachés Fichiers attachés

  4. #4
    pgz
    pgz est déconnecté
    Expert éminent Avatar de pgz
    Homme Profil pro
    Développeur Office VBA
    Inscrit en
    Août 2005
    Messages
    3 692
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Office VBA
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2005
    Messages : 3 692
    Points : 6 591
    Points
    6 591
    Par défaut
    Bonjour

    Citation Envoyé par Pierrea4564 Voir le message
    Je souhaite supprimer tous les retours chariots dans un fichier csv depuis une macro sous Excel.
    Citation Envoyé par Pierrea4564 Voir le message
    J'ai essayé plein de possibilités comme passer mon csv en .txt, rechercher \n ou \r, ...
    peut-être qu'il ne s'agit pas de retour chariot..
    En fait, tu veux faire quoi, exactement?

    Cordialement,

    PGZ

  5. #5
    Nouveau membre du Club
    Inscrit en
    Novembre 2009
    Messages
    47
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 47
    Points : 36
    Points
    36
    Par défaut
    Si tu regarde dans mon fichier texte, il y a plein de retour à la ligne.
    Donc en gros, je veux que ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    17;4;fr-FR;« Il était une fois… » au château;du 26 au 30 décembre 2010;animations de Noël"<p>
    	Dans les appartements confortables du logis</p>
    <p>
    	Un moment convivial pour les enfants</p>";site;17;2010-12-14 00:00:00.000;2010-12-30 00:00:00.000;24
    Devienne cela :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    17;4;fr-FR;« Il était une fois… » au château;du 26 au 30 décembre 2010;animations de Noël"<p>Dans les appartements confortables du logis</p><p>Un moment convivial pour les enfants</p>";site;17;2010-12-14 00:00:00.000;2010-12-30 00:00:00.000;24

  6. #6
    Expert éminent sénior
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    6 804
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Décembre 2007
    Messages : 6 804
    Points : 32 082
    Points
    32 082
    Par défaut
    Code plus que plus que bourrin mais qui marche :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    Option Explicit
     
    Sub EradicationRetourChariot()
        Dim NumFich1 As Integer, NumFich2 As Integer
        Dim NomFich1 As String, Nomfich2 As String
        Dim Pos1 As Long, Pos2 As Long, Val1 As Integer
        Dim CaractereLu As String * 1
     
        NumFich1 = FreeFile
        NomFich1 = "Z:\export.txt"
        Open NomFich1 For Random As #NumFich1 Len = 1
     
        NumFich2 = FreeFile
        Nomfich2 = "Z:\export2.txt"
        Open Nomfich2 For Random As #NumFich2 Len = 1
     
        Pos1 = 0
        Pos2 = 0
        Do While Not EOF(NumFich1)
            Pos1 = Pos1 + 1
            Get #NumFich1, Pos1, CaractereLu
            Val1 = Asc(CaractereLu)
            If (Val1 <> 10) And (Val1 <> 13) Then
                Pos2 = Pos2 + 1
                Put #2, Pos2, CaractereLu
            End If
        Loop
        Close #NumFich1
        Close #NumFich2
    End Sub
    doit être faisable en 5 fois moins de lignes, mais bon...

  7. #7
    pgz
    pgz est déconnecté
    Expert éminent Avatar de pgz
    Homme Profil pro
    Développeur Office VBA
    Inscrit en
    Août 2005
    Messages
    3 692
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Office VBA
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2005
    Messages : 3 692
    Points : 6 591
    Points
    6 591
    Par défaut
    Re,

    Il n'y a pas grande difficulté. Voici une autre façon de faire, en utilisant la bibli IWSH (si tu commences à l'utiliser aussi, on sera deux!)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    Sub Pierre4564()
    'Cocher référence : Windows Script Host Object Model
    Dim fso As IWshRuntimeLibrary.FileSystemObject
    Dim oTs As IWshRuntimeLibrary.TextStream
    Dim sFichierTxt As String, sContenu As String
     
    sFichierTxt = ThisWorkbook.Path & "\export.txt"
    Set fso = New IWshRuntimeLibrary.FileSystemObject
     
    Set oTs = fso.OpenTextFile(sFichierTxt, ForReading)
    sContenu = oTs.ReadAll
    oTs.Close
     
    sContenu = Replace(Replace(sContenu, vbCr, vbNullString), vbLf, vbNullString)
     
    Set oTs = fso.OpenTextFile(sFichierTxt, ForWriting)
    oTs.Write sContenu
    oTs.Close
     
    Set oTs = Nothing
    Set fso = Nothing
     
    End Sub
    Cordialement,

    PGZ

  8. #8
    Modérateur
    Avatar de AlainTech
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mai 2005
    Messages
    4 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2005
    Messages : 4 235
    Points : 24 327
    Points
    24 327
    Par défaut
    Bonjour à tous,

    Je me pose une question.
    Comment distinguer les retours chariot parasites de ceux de fin de record?
    Pour moi, le problème se situe à la création du fichier et pas à sa lecture.

  9. #9
    pgz
    pgz est déconnecté
    Expert éminent Avatar de pgz
    Homme Profil pro
    Développeur Office VBA
    Inscrit en
    Août 2005
    Messages
    3 692
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Office VBA
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2005
    Messages : 3 692
    Points : 6 591
    Points
    6 591
    Par défaut
    Bonsoir

    Citation Envoyé par AlainTech Voir le message
    Je me pose une question.
    Comment distinguer les retours chariot parasites de ceux de fin de record?
    Dans le message de 11:19, j'ai compris qu'il voulait tous les supprimer. Il ne reste donc qu'un enregistrement. C'est comme cela que j'ai interprété son exemple.
    La question est alors : a quoi ça sert?

    Cordialement,

    PGZ

  10. #10
    Expert éminent sénior
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    6 804
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Décembre 2007
    Messages : 6 804
    Points : 32 082
    Points
    32 082
    Par défaut
    Citation Envoyé par pgz Voir le message
    (.../...
    La question est alors : a quoi ça sert?(.../...)
    J'ai déjà eu à faire des choses comme ça pour transférer des données vers du Z/OS. Pas exactement comme ça(j'avais des longueurs supposées être fixes), mais certains types de transfert(notamment binaire) s'accommodent mal des retours chariot. Et comme je n'ai pas la main sur la génération de certains fichiers.....

    J'ai aussi eu à trafiquer certains caractères spéciaux qui ne ressortaient pas bien sous Z/OS. C'est d'ailleurs pour ça que ma méthode travaille caractère par caractère. ça permet aussi, en mode débug, de comprendre comment est fait le fichier en entrée. J'ai ainsi vu que le fichier joint à la discussion avait ses retours chariot en chr(13) & chr(10). J'ai brutalement traité les 2 séparément, c'est peu élégant, mais c'est adaptable à n'importe quel octet qui poserait problème.

  11. #11
    Nouveau membre du Club
    Inscrit en
    Novembre 2009
    Messages
    47
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 47
    Points : 36
    Points
    36
    Par défaut
    Salut à tous, et merci pour votre aide.

    Toutes vos solutions ont bien fonctionné. Seulement, AlanTech a soulevé une question très intéressante
    Je me pose une question.
    Comment distinguer les retours chariot parasites de ceux de fin de record?
    Pour moi, le problème se situe à la création du fichier et pas à sa lecture.

    J'ai pu identifier mes retour chariot parasites car ils sont tous derrières une balise fermante. ">"

    Après relecture de tous vos conseil, j'ai repris mon code initial. Comme l'avais souligné pgz, j'ai mis chr(13) entre des "", ce qui bien sur ne pouvais pas marcher.

    Voici mon code final. C'est pas forcément très pro, mais ça fonctionne à merveille.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
     
    Sub ModifTEXT()
     
    Dim str As String
    Dim fso As FileSystemObject ' AJOUTER LA REFERENCE (VOIR FAQ SI BESOIN)
    Dim ts As TextStream
     
    Set fso = New FileSystemObject
    ' ouvre le fichier
     
    Set ts = fso.OpenTextFile("M:\export.csv")
     
    ' met tout le contenu dans une variable
     
    str = ts.ReadAll
    ts.Close
    ' remplace
    str = Replace(str, Chr(10), "tototo")
    str = Replace(str, Chr(13), "")
    str = Replace(str, Chr(11), "")
    str = Replace(str, ">tototo", ">")
    str = Replace(str, "tototo", Chr(10))
     
    ' on écrase
    Set ts = fso.createtextfile("M:\export.csv", True)
    ts.Write str
    ts.Close
     
    'on libère la mémoire
    Set fso = Nothing
    Set ts = Nothing
    MsgBox "OK"
     
    End Sub
    Merci encore !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 13
    Dernier message: 03/08/2012, 14h27
  2. [RegEx] Remplacer les <br/> par des sauts à la ligne dans des zones de texte
    Par doncandid dans le forum Langage
    Réponses: 5
    Dernier message: 17/03/2010, 17h59
  3. [CSV] Effacer une ligne dans un fichier CSV
    Par poulepexo dans le forum Langage
    Réponses: 1
    Dernier message: 22/04/2009, 12h12
  4. aller à la ligne dans un fichier .csv
    Par paolo2002 dans le forum Langage
    Réponses: 4
    Dernier message: 01/02/2008, 11h40
  5. [CSV] Ajouter et supprimer des ligne dans un fichier CSV
    Par gpsevasion dans le forum Langage
    Réponses: 3
    Dernier message: 28/02/2007, 17h00

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo