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 un fichier replace(...,"","")


Sujet :

Macros et VBA Excel

  1. #1
    Membre éclairé
    Inscrit en
    Mars 2008
    Messages
    296
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 296
    Par défaut modifier un fichier replace(...,"","")
    Bonjour je voudrais modifier quelques lignes concecutif dans un fichier .txt

    le code suivant me permet de remplacer le texte1 par le texte2
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Replace(c.ReadAll, "texte1", "texte2")
    jusque la tout va bien. Mais moi je voudrais remplacer le texte suivant qui est sur plusieurs lignes concecutif :

    toto
    titi
    tata

    le code suivant de fonctionne pas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Replace(c.ReadAll, "toto titi tata", "texte2")
    est ce qu'il y a un moyen de remplacer ces trois lignes?
    car on peu retrouver toto dans mon fichier mais je ne veu pas qu'il soit remplacer si il n'y a pas titi a la ligne suivante et tata 2 ligne en desous

    des idees?
    merci

  2. #2
    Inactif  

    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    4 555
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 4 555
    Par défaut
    Bonjour,

    Tu as lu cette discussion ?
    http://www.developpez.net/forums/sho...d.php?t=596553

    il te suffit d'adapter la solution à ton cas (utilisation de replace suir chaque ligne)

    car on peu retrouver toto dans mon fichier mais je ne veu pas qu'il soit remplacer si il n'y a pas titi a la ligne suivante et tata 2 ligne en desous
    et pour celà : regarde mon dernier code ===>> il produit un array, non ?
    Il est dès lors simple d'y rechercher "toto" (par instr) et de voir si titi s'y trouve à l'élément suivant et tata 2 lignes en dessous.
    Celà ne demande qu'un tout petit peu de semi-concentration !

  3. #3
    Membre éclairé
    Inscrit en
    Mars 2008
    Messages
    296
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 296
    Par défaut
    Je ne comprend pas comment je peu supprimer (ou remplace par "") ces trois lignes

    toto
    titi
    tata

    merci de me donner un exemples

  4. #4
    Membre Expert Avatar de Godzestla
    Homme Profil pro
    Chercheur de bonheur
    Inscrit en
    Août 2007
    Messages
    2 403
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chercheur de bonheur
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2007
    Messages : 2 403
    Par défaut
    Salut Cortex59,

    tu ne peux pas modifier le fichier texte sur lui-même car il est ouvert en input.

    Pour faire cela tu dois :
    1) lire le fichier en Input,
    2) Modifier les records souhaites
    3) Ecrire chaque record dans un nouveau fichier.
    4) fermer les 2 fichiers
    5) Supprimer le fichier input
    6) renommer le fichier output au nom de l'input.

    Pour remplacer du texte qui est sur plusieurs lignes, il faut adapter ta logique comme l'indique ucfoutu.

    soit :
    Charger les records en table et faire les recherches, remplacements et suppression sur la table qui sera ensuite écrite dans un fichier.



  5. #5
    Membre éclairé
    Inscrit en
    Mars 2008
    Messages
    296
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 296
    Par défaut
    la modification simple fonctionne

    est ce qu'avec un replace on peu modifier plusieurs lignes
    ou je suis obligé de lire la ligne suivante et modifier ligne par ligne?

  6. #6
    Membre Expert Avatar de Godzestla
    Homme Profil pro
    Chercheur de bonheur
    Inscrit en
    Août 2007
    Messages
    2 403
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chercheur de bonheur
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2007
    Messages : 2 403
    Par défaut
    est ce qu'avec un replace on peu modifier plusieurs lignes
    tel quel, je ne crois pas, mais si tu ruses un peu tu devrais pourvoir y arriver.

    Idée (non testée).

    Lit tout tout fichier en input et construit avec tes records un string unique qui reprends tous tes records, séparés par un caractère qui ne se trouve pas dans ton texte.

    Ex :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    tout = ""
    Do While Not EOF(1)
      Line Input #1, LaLigne
      if trim(tout) = "" then
         tout = trim(tout) + Laligne
        else
         tout = trim(tout) +  "@" + Laligne
       ...
       endif
       line input...
    loop
    Ensuite tu exécute ton replace sur Tout.

    Puis tu découpes Tout avec Split
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    tablo=Split(Tout, "@")
    Et il ne te reste qu'à mettre les élements de tablo dans ton fichier texte.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    For i = 0 to ubound(Tablo)
     Laligne = tablo(i)
     .....
    next

  7. #7
    Membre éclairé
    Inscrit en
    Mars 2008
    Messages
    296
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 296
    Par défaut
    est ce que tu peu m'aider a ecrire le code qui correspond a ceci

    'rechercher "toto" dans mon fichier ( fichier = c.readAll)

    'verifier le contenu de la ligne suivante

    avec ca j'y arriverai
    merci

  8. #8
    Membre éclairé
    Inscrit en
    Mars 2008
    Messages
    296
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 296
    Par défaut
    Bon ca y j'ai une solution

    est ce qu'il est possible de supprimer une ligne (ou modifier "") si j'ai le numero de la ligne??

    si c possible comment je fais et comment recupere t'on le numero de la ligne ou il y a le texte "toto"?

  9. #9
    Inactif  

    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    4 555
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 4 555
    Par défaut
    D'abord :

    Juste un exemple :

    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
    Option Explicit
     
    Private Sub Command1_Click()
       Dim tonfichier As String, i As Integer
       tonfichier = "d:\essai.txt"
       Dim ff As Integer, strtext As String
       ff = FreeFile
       Open tonfichier For Input As #ff
          strtext = Input(LOF(ff), #ff)
       Close #ff
       Dim toto
       toto = Split(strtext, vbCrLf)
       For i = 0 To UBound(toto) - 1
         If InStr(toto(i), "toto") > 0 And InStr(toto(i + 1), "titi") > 0 Then
           MsgBox "bingo à la ligne " & i & " de mon texte" & vbCrLf & _
           "car la ligne" & i & " contient toto et la ligne " & i + 1 & " contient titi"
         End If
       Next
    End Sub
    Pour le reste :
    ouvre ton fichier en écriture et parcours les éléments de toto, que tu y écris un par un en les modifiant au besoin comme tu l'entends ! C'est là l'enfance de l'art,, ma foi ...

    Allez ! au boulot .

  10. #10
    Membre Expert Avatar de Godzestla
    Homme Profil pro
    Chercheur de bonheur
    Inscrit en
    Août 2007
    Messages
    2 403
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chercheur de bonheur
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2007
    Messages : 2 403
    Par défaut
    Salut,

    strtext = Input(LOF(ff), #ff)
    Ucfoutu, je pense que cette technique ne fonctionne pas si tu as des virgules dans tes records, car dans ce cas il découpe les enregistrement ?
    Et comme Cortex59 ne dit pas ce que ses lignes contiennent !!

    Avec Line input tu n'a pas ce problème.

  11. #11
    Inactif  

    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    4 555
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 4 555
    Par défaut
    Bonjour, Godzestla
    Ben... essaye ...(je viens de le faire)..

    La chose marchera s'il s'agit d'un fichier texte plat d'au plus 2 GO.
    Elle ne marchera pas que s'il s'agit d'un fichier texte structuré en base de données, mais alors ===>> Line Input non plus ... ... et il faudra s'y prendre alors tout autrement.

  12. #12
    Membre Expert Avatar de Godzestla
    Homme Profil pro
    Chercheur de bonheur
    Inscrit en
    Août 2007
    Messages
    2 403
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chercheur de bonheur
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2007
    Messages : 2 403
    Par défaut
    Bonjour, Godzestla
    Ben... essaye ...(je viens de le faire)..

    La chose marchera s'il s'agit d'un fichier texte plat d'au plus 2 GO.
    Elle ne marchera pas que s'il s'agit d'un fichier texte structuré en base de données, mais alors ===>> Line Input non plus ... ... et il faudra s'y prendre alors tout autrement.
    Promis, j'essaie dès que je peux.
    je viens encore d'pprendre quelquechose.

    Si a l'occasion tu as du temps pour m'expliquer cette partie du code, j'en serais ravi. (en gras)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Dim ff As Integer, strtext As String
       ff = FreeFile
       Open tonfichier For Input As #ff
          strtext = Input(LOF(ff), #ff)
       Close #ff
    Ca lit tout en 1 passage, donc LOF(ff) bytes ? C'est cela ?

  13. #13
    Inactif  

    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    4 555
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 4 555
    Par défaut
    LOF (Length Of File) est le nom d'une variable dont la valeur est égale à la longueur du fichier, longueur comprise entre le BOF (Beginning Of File) et le EOF(End Of File) qui commencent et terminent un fichier sous Windows.

    Dans notre exemple, donc, on lit d'un seul coup (LOF) le fichier jusqu'à sa fin dans une variable (strtext dans notre exemple).

    StrText contient tout le texte du fichier, y compris donc les VbCrLF.

    Bien...

    Et si nous ne voulions que les 10 premiers caractères, alors ?
    ===>> 10 au lieu de LOF ...

    donc :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Private Sub Command1_Click()
     'lire les 10 1ers caractères
      Dim FF As Integer: FF = FreeFile
     
       Open "d:\essai.txt" For Input As #FF
            strText = Input(10, #FF)
       Close #FF
       MsgBox strText
     
    End Sub
    C'est tout

  14. #14
    Membre Expert Avatar de Godzestla
    Homme Profil pro
    Chercheur de bonheur
    Inscrit en
    Août 2007
    Messages
    2 403
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chercheur de bonheur
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2007
    Messages : 2 403
    Par défaut
    Merci ucfoutu

  15. #15
    Membre éclairé
    Inscrit en
    Mars 2008
    Messages
    296
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 296
    Par défaut
    Bonjour,
    desole mais je comprend pas!
    voila ce que je voudrais changer dans mon fichier txt (je sais pas si ca va vous aider)
    //test [10]
    if ( M[1] == 1)
    {
    texte_couleur1 = 0;
    fond_couleur1 = 8454016;
    fond_contour_couleur1 = 0;
    texte1 = "M[1] is OK";
    }
    et je voudrais remplacer ce texte par :

    //test [10]
    if ( M[0] == 1)
    {
    texte_couleur1 = 16777215;
    fond_couleur1 = 16777215;
    fond_contour_couleur1 = 16777215;
    texte1 = "M[1] is OK";
    }
    mon PB c que je ne peut pas faire de remplace (ligne par ligne) car je ne connais pas le resultat des variables texte_couleur... De plus des M[1] qu'il ne faut pas remplacer. Moi je voudrais changer les 7 ligne qui suive la ligne //test [10]

    merci

  16. #16
    Inactif  

    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    4 555
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 4 555
    Par défaut
    On ne peut pas dire :
    - ni que tu te sois "foulé la rate" pour exposer clairement (et dès le début) ce que tu voulais faire
    - ni pour "y aller" en t'inspirant de l'exemple donné ...

    Il te faut du "tout cuit" ?
    Bon... en voilà (à la condition toutefois que tu te sois expriumé clairement et complètement. Dans le cas contraire, il te faudra adapter ... et c'est facile) ...

    Voilà une méthode (on pourrait en mettre mille et une autres différentes en oeuvre) :

    Lis, analyse, comprends (c'est ton affaire) :

    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
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    Option Explicit
     
    Private Sub Command1_Click()
      Dim tonfichier As String, i As Integer, j As Integer, onecrit As String
      tonfichier = "c:\allony.txt"
     
    ' ici, on va, pour simuler, écrire le contenu de ton fichier
      onecrit = "blabla" & vbCrLf & "blablabla" & vbCrLf _
      & "//test [10]" & vbCrLf & "if ( M[1] == 1)" & vbCrLf & "{" & vbCrLf & "texte_couleur1 = 0;" _
      & vbCrLf & "fond_couleur1 = 8454016;" & vbCrLf & "fond_contour_couleur1 = 0;" & vbCrLf _
      & "texte1 = " & Chr(34) & "M[1] is OK" & Chr(34) & ";" _
      & vbCrLf & "}" & vbCrLf & "blabla" & vbCrLf & "blabla"
      Open tonfichier For Output As #1
        Print #1, onecrit
      Close #1
     MsgBox "voilà ! va voir ton fichier par notepad, si tu veux ..."
     
     'et maintenant on va le traiter
       Dim ff As Integer, strtext As String
       ff = FreeFile
       Open tonfichier For Input As #ff
          strtext = Input(LOF(ff), #ff)
       Close #ff
       Dim toto
       toto = Split(strtext, vbCrLf)
       For i = 0 To UBound(toto) - 1
         If toto(i) = "//test [10]" Then
           MsgBox "bingo à la ligne " & i + 1 & " qui dit " & toto(i)
           For j = i To UBound(toto) - 1
             If toto(j) Like "* == #)" Then
               toto(j) = Replace(toto(j), "[1]", "[0]")
               MsgBox toto(j)
             End If
             If toto(j) Like "texte_couleur1 = *;" Then
               'toto(j) = toto(j)
               toto(j) = rigolo(toto(j), "16777215")
             End If
             If toto(j) Like "fond_couleur1 = *;" Then
               toto(j) = rigolo(toto(j), "16777215")
             End If
             If toto(j) Like "fond_contour_couleur1 = *;" Then
               toto(j) = rigolo(toto(j), "16777215")
             End If
           Next
           Exit For
         End If
       Next
     
       'bien ... On va maintenant réécrire ce fichier
       Open tonfichier For Output As #1
         For i = 0 To UBound(toto)
           Print #1, toto(i)
         Next
         Close #1
         MsgBox "va voir ton fichier avec notepad, maintenant "
    End Sub
    Private Function rigolo(chaine, rempl As String) As String
       Dim pos As Integer
        pos = InStr(chaine, "=")
        rigolo = Mid(chaine, 1, pos) & " " & Str(rempl) & ";"
    End Function

  17. #17
    Membre éclairé
    Inscrit en
    Mars 2008
    Messages
    296
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 296
    Par défaut
    MERCI ca fonctionne impec

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 20/01/2007, 20h36

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