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 fichier .txt avec une macro


Sujet :

Macros et VBA Excel

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Stagiaire
    Inscrit en
    Août 2013
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Stagiaire
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2013
    Messages : 22
    Points : 7
    Points
    7
    Par défaut Modifier fichier .txt avec une macro
    Salut à tous.

    Je cherche à écrire une petite macro toute simple qui me permettrait de rajouter du texte (venant d'un classeur Excel ou pas) à un fichier .txt.

    Pour l'instant je suis sur quelque chose du genre, juste pour découvrir les commandes et comment ça fonctionne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Sub TextModif()
     
    Filename = "D:\Test.txt"
     
    Open Filename For Output As #1
    Print #1, "Test"
    Print #1, Tab(8); Range("B3")
    Close #1
     
    End Sub
    Ce code ouvre effectivement le fichier Test.txt et vide complètement son contenu pour le remplacer par "Test", un saut de ligne, 7 tabulations et la valeur qu'il y a dans la cellule B3. Sur ce point là c'est bien, mais j'aimerais maintenant savoir comment faire pour que ce qu'il y avait avant dans le fichier ne soit pas supprimé par mon nouveau texte.

    En gros je voudrais pouvoir rajouter ce texte à la fin de mon fichier .txt, ou au début, ou à partir de la 5° ligne. Ou même faire un truc du genre "Si à un moment dans le fichier texte il y a la chaîne de caractères 'plop', insérer ici le contenu de la cellule A2". Mais je ne connais pas les commandes pour naviguer dans un fichier .txt et donc je suis un peu bloqué.

    Merci d'avance de votre aide !
    Quentin

  2. #2
    Inactif  
    Homme Profil pro
    Inscrit en
    Septembre 2012
    Messages
    1 733
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2012
    Messages : 1 733
    Points : 2 553
    Points
    2 553
    Par défaut
    va chercher le end of file EOF et tu continues à partir de là

  3. #3
    Expert éminent sénior


    Profil pro
    Inscrit en
    Juin 2003
    Messages
    14 008
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 14 008
    Points : 20 040
    Points
    20 040
    Par défaut
    bonjour,


    tout simplement "Ajout ":
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Open Filename For Append As #1

  4. #4
    Futur Membre du Club
    Homme Profil pro
    Stagiaire
    Inscrit en
    Août 2013
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Stagiaire
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2013
    Messages : 22
    Points : 7
    Points
    7
    Par défaut
    Merci pour cette commande Append, c'est fort !

    Mais ça ne répond pas totalement à ma question, si j'ai envie de faire mes modifications à un endroit précis au milieu du fichier texte, est-ce que je peux dire à ma macro d'aller spécifiquement à telle ligne/tel endroit pour rajouter ou remplacer des trucs ?
    (et comment je lui dis de sauter une/plusieurs lignes ?)

  5. #5
    Expert éminent sénior


    Profil pro
    Inscrit en
    Juin 2003
    Messages
    14 008
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 14 008
    Points : 20 040
    Points
    20 040
    Par défaut
    Tu ne peu pas il faut ré-écrire tout le fichier ...

  6. #6
    Invité
    Invité(e)
    Par défaut Bonjour, regarde ça
    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
    Sub TextModif()
     Dim TXT As String
     Dim TextLine As String
    Filename = "D:\Test.txt"
     
     
    Open Filename For Input As #1 'Ouverture du fichier en lecture.
    Do While Not EOF(1)
        Line Input #1, TextLine 'Lecture de la ligne
        If TextLine = "Ma Valeur" Then TXT = TXT & AjouterText() 'Si le test est concluant j'ajoute mes valeurs dans mon cas A, B, C, D…J
        TXT = TXT & TextLine & vbCrLf 'Je concatène mon texte
    Loop
    Close #1
     Open Filename For Output As #1 'Ouverture du fichier en écriture.
    Write #1, TXT 'Je stock dans mon fichier la variable TXT
    Close #1
    End Sub
    Function AjouterText() As String
    Dim I As Long
    For I = 0 To 10
    AjouterText = AjouterText & Chr(65 + I) & vbCrLf '65 =A 66=B ...
    Next
     
    End Function

  7. #7
    Futur Membre du Club
    Homme Profil pro
    Stagiaire
    Inscrit en
    Août 2013
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Stagiaire
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2013
    Messages : 22
    Points : 7
    Points
    7
    Par défaut
    Merci pour ce code, il fonctionne en effet très bien pour rajouter du texte Je vais essayer de l'adapter pour qu'il ne checke pas que des lignes entières mais juste des chaînes de caractères au sein des lignes (je cherche plutôt des correspondances avec des mots/chiffres qu'avec des lignes entières ; si un tel mot est quelque part alors blablabla). Mais c'est déjà un bon progrès comme ça.

    Par contre j'ai l'impression qu'à chaque fois que je fais tourner la macro il rajoute des " au début et à la fin du fichier .txt, et je ne comprends pas pourquoi...

  8. #8
    Invité
    Invité(e)
    Par défaut bonjour
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    If InStr("voila ma phrase préféré", "phrase") <> 0 Then MsgBox "phrase"
    If Left("voila ma phrase préféré", 5) = "voila" Then MsgBox "voila"
    If Right("voila ma phrase préféré", 7) = "préféré" Then MsgBox "préféré"
    Dernière modification par Invité ; 29/08/2013 à 14h22.

  9. #9
    Expert éminent
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    3 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 3 453
    Points : 6 871
    Points
    6 871
    Par défaut
    Bonjour,

    Voir aussi avec l'opérateur "Like" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Dim Texte As String
     
    Texte = "Ici une phrase où l'on souhaite savoir si un mot en particulier ou une partie de mot s'y trouve !"
     
    If Texte Like "*sav*" Then MsgBox "Trouvé !"
    Hervé.

  10. #10
    Futur Membre du Club
    Homme Profil pro
    Stagiaire
    Inscrit en
    Août 2013
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Stagiaire
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2013
    Messages : 22
    Points : 7
    Points
    7
    Par défaut
    J'aime bien la fonction InStr, qui correspond plutôt bien à ce que je recherche
    Pour la concaténation du texte, est-ce qu'il n'y aurait pas moyen de faire en sorte d'insérer (plus précisément de remplacer) du texte à l'endroit où le programme détecte le mot recherché ?

    Du genre si j'ai "Nombre de quiches 32 blablabla" dans mon fichier, et que je veux que ma macro remplace le '32' par '18' une fois qu'elle a détecté la chaîne de caractères "quiches", comment je peux faire ?

    (et une idée sur pourquoi j'obtiens des guillemets au début et à la fin de mon nouveau fichier .txt une fois que la macro a tourné une fois ?)

    Merci beaucoup pour votre aide en tout cas

  11. #11
    Invité
    Invité(e)
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Debug.Print Replace("Nombre de quiches 32 blablabla", "32", "18")

  12. #12
    Expert éminent sénior


    Profil pro
    Inscrit en
    Juin 2003
    Messages
    14 008
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 14 008
    Points : 20 040
    Points
    20 040
    Par défaut
    Bonjour,


    un cas d'utilisation un peu particulier de la fonction Mid :


    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
    Sub Remplace32par18()
    Dim stLigne As String
     
    Dim iPosQuiches As Integer
     
    stLigne = "Nombre de quiches 32 blablabla"
     
    iPosQuiches = InStr(1, stLigne, "Quiches", vbTextCompare)
     
    If iPosQuiches > 0 Then
            Mid(stLigne, iPosQuiches + Len("Quiches ")) = "18"
            MsgBox stLigne
        Else
            MsgBox "Pas de quiches"
    End If
     
     
     
    End Sub

  13. #13
    Expert éminent
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    3 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 3 453
    Points : 6 871
    Points
    6 871
    Par défaut
    Dans ce cas, un accès binaire peut le faire. On stocke en mémoire, on fais la modif et on remplace :
    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
     
    Sub Remplacer()
     
        Dim Tampon As String
     
        Open "F:\Texte.txt" For Binary As #1
     
            Tampon = Space(LOF(1))
            Get #1, , Tampon
     
        Close #1
     
        Tampon = Replace(Tampon, "Mot1", "Mot2")
     
        Open "F:\Texte.txt" For Binary As #1
     
            Put #1, , Tampon
     
        Close #1
     
    End Sub
    Hervé.

  14. #14
    Futur Membre du Club
    Homme Profil pro
    Stagiaire
    Inscrit en
    Août 2013
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Stagiaire
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2013
    Messages : 22
    Points : 7
    Points
    7
    Par défaut
    Bonjour,

    Merci à tous pour vos réponses qui m'ont bien aidé.

    J'aurais une autre question toute simple : quelle est la commande qui sélectionne les caractères (sur une ligne du fichier .txt) allant du x-ième caractère au y-ième de la ligne (pour pouvoir les rentrer dans la fonction "Replace" ensuite) ?

  15. #15
    Invité
    Invité(e)
    Par défaut Bonjour, regarde ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Sub test()
    Dim Strat As Long
    Dim NbChar As Long
    Texte = "Ici une phrase où l'on souhaite savoir si un mot en particulier ou une partie de mot s'y trouve !"
    Strat = 5
    NbChar = 10
    Texte2 = Mid(Texte, Strat, NbChar)
    Debug.Print Texte2
    End Sub

  16. #16
    Futur Membre du Club
    Homme Profil pro
    Stagiaire
    Inscrit en
    Août 2013
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Stagiaire
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2013
    Messages : 22
    Points : 7
    Points
    7
    Par défaut
    Bonjour !

    Merci rdurupt pour ton aide, ça fonctionne bien

    Mais toujours une nouvelle question vient se rajouter : quelle commande utiliser si je veux supprimer carrément une ligne du fichier texte (par exemple, la 1ère et la dernière ligne) ? J'imagine qu'il faut ouvrir le fichier en Append et qu'il y a une sorte de commande "Delete", mais comment faire ça "proprement" ? Je voudrais si possible une solution autre que "je copie toutes les lignes que je ne veux pas supprimer et je les colle ailleurs", si jamais une telle solution existe.

    Merci !

  17. #17
    Invité
    Invité(e)
    Par défaut Bonjour, regarde ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    'Pour la première tu peux faire une lecture pour rien
    If EOF(1) = False Then Line Input #1, TextLine 
    Do While Not EOF(1)
        Line Input #1, TextLine 'Lecture de la ligne
        If TextLine <> "Je ne mettrais pas ça" Then
           TXT = TXT & TextLine & vbCrLf 'Je concatène mon texte
        End If
    Loop
    Si non tu as une autre solution faire un tableau à partir de la variable TXT
    Un tableau commence a 0 et fini a UBound
    0= première ligne UBound= dernière ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Do While Not EOF(1)
        Line Input #1, TextLine 'Lecture de la ligne
               txt = txt & TextLine & vbCrLf 'Je concatène mon texte
        Loop
     Montable = Split(txt, vbCrLf)
     Open Filename For Output As #1 'Ouverture du fichier en écriture.
     For i = 1 To UBound(Montable) - 1 'Ne prend pas en compte la ligne 0 et la ligne UBound
        Print #1, Trim("" & Montable(i)) 'Je stock dans mon fichier la variable Montable(I)
    Next
    Close #1
    Dernière modification par Invité ; 11/09/2013 à 14h46.

  18. #18
    Futur Membre du Club
    Homme Profil pro
    Stagiaire
    Inscrit en
    Août 2013
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Stagiaire
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2013
    Messages : 22
    Points : 7
    Points
    7
    Par défaut
    Bonjour,

    j'ai un autre petit souci actuellement avec cette macro de modification de fichier Excel (pas encore eu le temps de me pencher vraiment sur ton dernier message rdurupt mais ça m'a l'air bon).

    En fait le fichier texte en question est censé être utilisé en donnée d'entrée d'un logiciel de simulation (Dymola, basé sur le langage Modelica) ; la macro de modification du fichier texte doit permettre de modifier à partir d'une interface Excel certaines variables d'entrées directement dans ce fichier texte pour plus de simplicité.

    Bref le souci est qu'après la modification de ce fichier texte, celui-ci n'est plus lisible par Dymola. D'ailleurs après avoir testé, en modifiant simplement le fichier texte à la main (via le Bloc-Notes Windows), il devient également illisible. Après avoir un peu cherché sur internet j'ai trouvé que le Bloc-Notes Windows avait des soucis de compatibilité et d'encodage au niveau des sauts de ligne par exemple, donc que cela pouvait peut-être expliquer ces soucis...

    La question est du coup : est-ce possible de passer outre ces soucis ? Je pensais à tenter de modifier le fichier texte avec un meilleur outil que le Bloc-Notes de base (Notepad++ ?), et est-ce possible alors de dire à la macro Excel qu'elle doit modifier ce fichier texte via Notepad++ et non le Bloc-Notes ?

    Merci d'avance !
    Quentin

  19. #19
    Expert éminent sénior
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Points : 18 674
    Points
    18 674
    Par défaut
    Bonjour,

    un programme VBA modifie un fichier par ses propres moyens, suffit de lui faire respecter la structure de Dymola

  20. #20
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    ton souci, me semble-t-il, est plus un question de format ISO ou UTF8.
    il faut savoir si Dymola est en Utf8.

    si c'est cela, nous avons un double problème, pas méchant au demeurant, mais existant.

    1) les données de ton fichier sont en Utf8 et nous les traitons en ISO (il faut les convertir en ISO avant de les traiter).

    2) après traitement nous les enregistrons au format ISO (il faut les convertir en Utf8 avant l'enregistrement)

    prenons ton fichier brut, peux tu L'importer dans un environnement de test de Dymola.

    si non regardons déjà ça. si oui informe toi sur le format d'entré des fichier dans Dymola.

Discussions similaires

  1. Réponses: 2
    Dernier message: 01/05/2007, 18h50
  2. Réponses: 3
    Dernier message: 05/03/2007, 23h54
  3. modifier fichier .txt avec Visual Basic
    Par marco1980 dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 29/09/2006, 20h19
  4. Réponses: 3
    Dernier message: 23/09/2006, 15h19
  5. [VBA-E] Exporter un fichier Web avec une macro
    Par Wilgard dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 22/05/2006, 12h25

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