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 :

Modifier donnée dans fichier csv par macro mais laisser fichier en csv [XL-2013]


Sujet :

Macros et VBA Excel

  1. #1
    Nouveau membre du Club
    Profil pro
    .
    Inscrit en
    octobre 2007
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : .
    Secteur : Finance

    Informations forums :
    Inscription : octobre 2007
    Messages : 51
    Points : 35
    Points
    35
    Par défaut Modifier donnée dans fichier csv par macro mais laisser fichier en csv
    Bonjour,

    je cherche à modifier par macro une donnée dans un fichier csv, mais sans que le format ou quoique ce soit d'autre de ce fichier csv soit impacté.

    Lorsque je modifie par macro, et que j'enregistre, soit excel modifie les dates (exemple : 30/10/16 dans fichier csv départ, devient 30/10/2016), et/ou il rajoute des " au début et à la fin de chaque ligne, et/ou il formate les colonnes ... enfin dans tous mes essais, le fichier csv ne se retrouve pas à l'identique du départ.

    Si vous vous demandez le but :
    - je reçois des fichiers csv d'un autre service (impossible de leur demander de modifier leur façon de les créer)
    - ces fichiers servent à alimenter un logiciel spécifique
    - or suite à un bug dans la nouvelle version de ce logiciel, il faut absolument que j'aille corriger quelques lignes dans les fichiers csv, mais cela sans en changer leur format, ni quoique ce soit d'autre, sinon l'importation de ces fichiers dans le logiciel plantera.

    J'ai essayé de plusieurs façons, je n'y arrive pas en passant par excel.

    A la main, je vais modifier par notepad, et là ça marche.
    Mais je ne peux pas piloter notepad par macro, je peux juste faire ouvrir chaque fichier, donner la main à l'utilisateur (en l'occurence moi, le temps que le bug du logiciel soit corrigé) ...

    J'ai plus de 100 lignes à corriger dans environ 60 fichiers, c'est la raison pour laquelle je souhaite faire une macro donc.

    Je m’apprêtais à occuper mon week-end à les faire manuellement une par une (avec le risque d'erreur que cela comporte), mais j'aurais quand même bien voulu savoir si ce n'est vraiment pas faisable par macro ?

    Si quelqu'un a une idée, je lui serais grandement reconnaissante !

    Merci d'avance

  2. #2
    Membre extrêmement actif
    Homme Profil pro
    aucune
    Inscrit en
    avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 81
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : avril 2016
    Messages : 7 563
    Points : 12 408
    Points
    12 408
    Par défaut
    Bonjour
    Déjà :
    A la main, je vais modifier par notepad, et là ça marche.
    di tu peux le faire via Notepad, tu peux le faire en utilisant l'instruction Open (rubrique Open, instruction de l'aide VBA)
    Quels sont les gestes que tu fais avec NotePad ?
    Je n'accepte pas de demande d' "amitié" individuelle. Tout développeur est pour moi un ami.
    Je n'ouvre AUCUN classeur tiers (avec ou sans macro ******). Ne m'en proposez donc pas .

    ****** : Non, non ... un classeur .xlsx ne "peut" par exemple et entre autres pas contenir un activex (de surcroît invisible) , "bien sûr" ...

    Il est illusoire de penser que l'on saurait exprimer valablement et précisément en un langage (rigide) de développement ce que l'on peine à exprimer dans le langage naturel, bien plus souple.

  3. #3
    Nouveau membre du Club
    Profil pro
    .
    Inscrit en
    octobre 2007
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : .
    Secteur : Finance

    Informations forums :
    Inscription : octobre 2007
    Messages : 51
    Points : 35
    Points
    35
    Par défaut
    Je sais ouvrir le fichier avec notepad depuis la macro.

    Mais ensuite, je ne sais pas faire ceci dans notepad par macro :

    - rechercher un texte (constant) dans les lignes
    - pour chaque ligne où on trouve ce texte, aller changer la 13ième zone entre ";" : c'est une zone du type 0000012345.67 et je dois remplacer par : 00000123.4567 => (ça je sais le faire par macro) mais pas dans notepad, si je devais le faire sous excel, pas de soucis
    - enregistrer le fichier csv via notepad

  4. #4
    Membre extrêmement actif
    Homme Profil pro
    aucune
    Inscrit en
    avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 81
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : avril 2016
    Messages : 7 563
    Points : 12 408
    Points
    12 408
    Par défaut
    Si je te lis bien (si tu as bien exprimé les choses)
    - rechercher un texte (constant) dans les lignes
    est ce qui te poserait problème ?
    Quel "texte constant" ?
    - L'instruction Open (dont je t'ai parlé plus haut et que je t'ai invité à lire) te permet de lire ligne par ligne le contenu toto d'une ligne
    - La fonction Instr te permet de déterminer si toto contient une chaîne de caractères spécifiée
    - la fonction split te permet d'éclater une chaîne de caractères par rapport à un délimitateur (ici : ton ";")
    - la fonction replace te permet de changer un caractère (ici ton "," par ".")
    je souhaite voir ce que tu fais (ou au moins tentes de faire) avec cela.
    Je n'accepte pas de demande d' "amitié" individuelle. Tout développeur est pour moi un ami.
    Je n'ouvre AUCUN classeur tiers (avec ou sans macro ******). Ne m'en proposez donc pas .

    ****** : Non, non ... un classeur .xlsx ne "peut" par exemple et entre autres pas contenir un activex (de surcroît invisible) , "bien sûr" ...

    Il est illusoire de penser que l'on saurait exprimer valablement et précisément en un langage (rigide) de développement ce que l'on peine à exprimer dans le langage naturel, bien plus souple.

  5. #5
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    avril 2009
    Messages
    15 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : avril 2009
    Messages : 15 379
    Points : 12 067
    Points
    12 067
    Billets dans le blog
    8
    Par défaut re
    re
    bonjour
    1. open for input....
    2. ligne=split(resultat,vbcrlf)
    3. pour récupérer ou modifier la 13 eme colonne c'est split (ligne(i),";")(12)dans la boucle sur les lignes
    4. ensuite une derniere boucle for et retranscription en texte avec open for output

    voila
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  6. #6
    Nouveau membre du Club
    Profil pro
    .
    Inscrit en
    octobre 2007
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : .
    Secteur : Finance

    Informations forums :
    Inscription : octobre 2007
    Messages : 51
    Points : 35
    Points
    35
    Par défaut
    Merci pour vos conseils,

    j'ai avancé, mais là je bloque parce qu'à la lecture de mon fichier input, il me lit tout le fichier comme une seule ligne, donc impossible de traiter comme je veux. Il est en EOF dès l& 1ére lecture.

    Mais comme c'est un autre problème, je suis en train de chercher à le résoudre, je ne vous dérange pas plus longtemps.

    Merci encore et je vous dis quand je suis au bout pour clore la discu

  7. #7
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    avril 2009
    Messages
    15 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : avril 2009
    Messages : 15 379
    Points : 12 067
    Points
    12 067
    Billets dans le blog
    8
    Par défaut re
    re
    un exemple concret
    dans cet exemple j'ouvre le csv en mémoire avec open for...
    split les text par ligne
    split la ligne par les ";" et remplace le 13 eme ( item 12)par "toto" dans chaque lignes
    y a pas plus simple
    on pourrait éventuellement faire une gestion d'erreur en cas de nombre de colonne insufisant sur la ligne
    je te laisse cela a faire tu devrais t'en sortir
    j'ai volontairement séparer les actions par fonction pour que tu puisse en comprendre le fonctionnement
    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
    Sub test()
    fichier = "C:\Users\polux\Desktop\Classeur1.csv"
    c = lecture_csv(fichier)
    lignes = Split(c, vbCrLf)
    For i = 0 To UBound(lignes) - 1
     new_csv = new_csv & Replace(lignes(i), Split(lignes(i), ";")(12), "toto") & vbCrLf
    Next
    ecriture fichier, new_csv
    End Sub
     
    Function lecture_csv(fich)
    Dim laChaine As String, x, fichier As String
    x = FreeFile
     Open fich For Binary Access Read As #x
            laChaine = String(LOF(x), " ")
           Get #x, , laChaine
      Close #x
      lecture_csv = laChaine
      End Function
     
    Function ecriture(fich, fnew)
    x = FreeFile
    Open fich For Output As #x
    Print #x, fnew
    Close #x
    End Function
    voila
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  8. #8
    Nouveau membre du Club
    Profil pro
    .
    Inscrit en
    octobre 2007
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : .
    Secteur : Finance

    Informations forums :
    Inscription : octobre 2007
    Messages : 51
    Points : 35
    Points
    35
    Par défaut
    Oulala ... je n'en demandais pas tant !!!

    En tout cas, merci beaucoup !!!

    J'ai un peu adapté :

    - vblf pour le split fin de ligne car vbcrlf ne marchait pas

    Et le traitement de la correction à faire : ce n'était pas tout à fait ce que tu écrivais, mais ce n'est pas grave : si dans la ligne j'ai une constante "toto" en position x, je vais modifier la colonne 13, qui contient un nombre avec un "." pour décaler le "." de 2 chiffres (comme si je divisais par 100 donc ...). Mais cela c'est un détail par rapport au reste !

    Habituée à traiter des fichiers csv via excel, je ne connaissais pas la lecture "for binary access read" !
    Merci de m'avoir appris (encore) quelque chose aujourd'hui, je garde tout cela dans ma boite à outils !

    MERCI A TOUS !

  9. #9
    Membre émérite
    Inscrit en
    octobre 2010
    Messages
    1 401
    Détails du profil
    Informations forums :
    Inscription : octobre 2010
    Messages : 1 401
    Points : 2 682
    Points
    2 682
    Par défaut
    Bonjour Patrick.

    Je te propose 3 modifications :

    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
    Sub test()
     
    c = lecture_csv(fichier)
    lignes = Split(c, vbCrLf)
     
    For i = 0 To UBound(lignes) ' Modification 1
    If i = UBound(lignes) Then separLigne = "" Else separLigne = vbCrLf
     new_csv = new_csv & Replace(lignes(i), Split(lignes(i), ",")(3), "toto") & separLigne ' Modification 2
    Next
    ecriture fichier, new_csv
    End Sub
     
    Function lecture_csv(fich)
    Dim laChaine As String, x, fichier As String
    x = FreeFile
     Open fich For Binary Access Read As #x
            laChaine = String(LOF(x), " ")
           Get #x, , laChaine
      Close #x
      lecture_csv = laChaine
      End Function
     
    Function ecriture(fich, fnew)
    x = FreeFile
    Open fich For Output As #x
    Print #x, fnew; ' Modification 3
    Close #x
    End Function
    Cordialement

    Docmarti.

  10. #10
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    avril 2009
    Messages
    15 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : avril 2009
    Messages : 15 379
    Points : 12 067
    Points
    12 067
    Billets dans le blog
    8
    Par défaut re
    re
    j'ai oublié de préciser pourquoi j'ai opté pour binary acces read au lieu de input
    avec inpout on a la lecture des caractères invisible et donc on a deux lignes supplémentaires tandis qu'avec acces read on coupe le texte par " " ( le 1 er espace après le dernier caractères ) dans la lecture
    voila
    docmarti je regarde cela
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  11. #11
    Nouveau membre du Club
    Profil pro
    .
    Inscrit en
    octobre 2007
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : .
    Secteur : Finance

    Informations forums :
    Inscription : octobre 2007
    Messages : 51
    Points : 35
    Points
    35
    Par défaut
    Merci !

    J'ai corrigé mes fichiers (en 5 secondes de traitement), je teste mardi que les nouveaux fichiers s'importent correctement dans le logiciel (qui est un peu chatouilleux ...), et si tout va bien, vous m'avez rendu un grand service !!!

    Pour Docmarti,
    oui, j'avais déjà fait la correction de moi-même dans mon code, pour ne pas ajouter le vbcrlf sur la dernière ligne !

    Super en tout cas !

  12. #12
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    avril 2009
    Messages
    15 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : avril 2009
    Messages : 15 379
    Points : 12 067
    Points
    12 067
    Billets dans le blog
    8
    Par défaut re
    re
    perso je fait comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Sub test()
        fichier = "C:\Users\polux\Desktop\Classeur1.csv"
        c = lecture_csv(fichier)
        lignes = Split(c, vbCrLf)
        For i = 0 To UBound(lignes) - 1
            If lignes(i) <> "" Then
                new_csv = new_csv & Replace(lignes(i), Split(lignes(i), ";")(12), "toto") & IIf(i = UBound(lignes)-1, "", vbCrLf)
            End If
        Next
        ecriture fichier, new_csv
    End Sub
    en ce qui concerne le test de la presence de "tto" par exemple a un emplacement x alors modifier la 13 eme colonne

    exemple
    si la colonne 3 de la ligne="toto" then la colonne 13 = toto
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    If lignes(i) <> "" and split(lignes(i),";")(3)="toto" Then
     new_csv = new_csv & Replace(lignes(i), Split(lignes(i), ";")(12), "toto") & IIf(i = UBound(lignes)-1, "", vbCrLf)
    else 
    new_csv = new_csv & lignes(i)
     
    end if
    voila
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  13. #13
    Nouveau membre du Club
    Profil pro
    .
    Inscrit en
    octobre 2007
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : .
    Secteur : Finance

    Informations forums :
    Inscription : octobre 2007
    Messages : 51
    Points : 35
    Points
    35
    Par défaut
    Oui oui c'est déjà fait ... comme je l'ai dit, et ça marche !!

    Merci

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

Discussions similaires

  1. [XL-2003] Par Macro, enregistrer le fichier sans les Macros
    Par malabarbe dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 07/01/2011, 12h22
  2. [MySQL] Problème d'insertion de données dans une base MySql à partir d'un fichier csv
    Par kazabandi dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 22/12/2010, 19h05
  3. Réponses: 5
    Dernier message: 27/05/2008, 19h43
  4. fichier csv par macro
    Par jnmab dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 04/12/2007, 00h31
  5. [Macro] ouverture d'un fichier csv par macro différent du double-clic
    Par Caro-Line dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 19/04/2007, 17h36

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