modifié un fichier txt

GI_tang

XLDnaute Nouveau
Bonjour, je souhaite modifier un fichier txt par macro excel
les données sont sous la forme :
18/01/2011, 4, 8, 345, , ,
19/01/2011, 6, 9, 123, , ,
etc..

je souhaite modifier la valeur 123 à la date 19/01/2011 et mettre 3

si quelqu'un peut m'aider
merci d'avance
 

mromain

XLDnaute Barbatruc
Re : modifié un fichier txt

Bonjour GI_tang,


Voici une fonction qui permet de modifier une ligne d'un fichier texte.

Elle prend en paramètre :
  • pathFichierTxt (String) : path du fichier texte à modifier (chemin + nom du fichier + extension) ;
  • separateurData (String) : séparateur des éléments de chaque ligne constituant le fichier txt/csv ;
  • texteRecherche (String) : texte recherché (qui permettra de définir la ligne à modifier) ;
  • numColRecherche (Long) : numéro de la colonne (élément dans la ligne) où l'on recherche le texte ;
  • texteModif (String) : Nouveau texte, remplaçant un des éléments de la ligne ;
  • numColModif (Long) : numéro de la colonne représentant l'élément à remplacer dans la ligne recherchée.
Et elle renvoie un booléen :
  • True : si la fonction s'est bien déroulée ;
  • False dans le cas contraire.
VB:
Private Function ModifValeur(pathFichierTxt As String, separateurData As String, texteRecherche As String, numColRecherche As Long, texteModif As String, numColModif As Long) As Boolean
Dim fso As Object, fichTxt As Object, pathFichTxtTmp As String, fichTxtTmp As Object, tabElLigne() As String, ligne As String, flagModif As Boolean

    ModifValeur = True
    On Error GoTo gestionErreur

    'ouvrir le fichier texte en lecture seule et créer un fichier temporaire à la racine du classeur
    Set fso = CreateObject("Scripting.FileSystemObject")
    Set fichTxt = fso.OpenTextFile(pathFichierTxt, 1)
    pathFichTxtTmp = ThisWorkbook.Path & "\FichTxtTmp_" & Format(Now, "yyyymmddhhnnss") & ".txt"
    Set fichTxtTmp = fso.CreateTextFile(pathFichTxtTmp, True)
    
    flagModif = False
    'boucler sur chaque ligne du fichier texte
    While Not fichTxt.AtEndOfStream
        'récupérer la ligne courante
        ligne = fichTxt.ReadLine
        'récupérer chaque élément de la ligne dans un tableau (on éclate la ligne en fonction du séparateur)
        tabElLigne = Split(ligne, separateurData)
        'si l'élément de la la ligne correspondant à la colonne cherchée équivaut au texte recherché
        If tabElLigne(LBound(tabElLigne) - 1 + numColRecherche) = texteRecherche Then
            'modifier la valeur dans la colonne à modifier
            tabElLigne(LBound(tabElLigne) - 1 + numColModif) = texteModif
            flagModif = True
            'reconstituer la ligne (avec les séparateurs)
            ligne = Join(tabElLigne, separateurData)
        End If
        'écrire la ligne dans le fichier temporaire
        fichTxtTmp.WriteLine ligne
    Wend
    'fermer les fichiers
    fichTxt.Close: fichTxtTmp.Close
    
    'si une modification a été apportée au fichier de base
    If flagModif Then
        'supprimer le fichier de base
        fso.DeleteFile pathFichierTxt, True
        'le remplacer par le fichier temporaire (contenant les modifications)
        fso.MoveFile pathFichTxtTmp, pathFichierTxt
    End If
    
    GoTo finProcedure
gestionErreur:
    ModifValeur = False
finProcedure:
    
    'détruire les objets
    Set fso = Nothing: Set fichTxt = Nothing: Set fichTxtTmp = Nothing

End Function


Et voici comment l'utiliser dans ton cas :
18/01/2011, 4, 8, 345, , ,
19/01/2011, 6, 9, 123, , ,
Paramètres :
  • pathFichierTxt : "C:\TestFichierTxt.txt" (à adapter)
  • separateurData : ", " (avec un espace, d'après ton exemple)
  • texteRecherche : "19/01/2011"
  • numColRecherche : 1
  • texteModif : "3"
  • numColModif : 3
VB:
Public Sub TestModif()
Dim modificationFaite As Boolean
    'effectuer la/les modification(s)
    modificationFaite = ModifValeur("C:\TestFichierTxt.txt", ", ", "19/01/2011", 1, "3", 4)
    'verifier si la modification s'est bien faite
    If Not modificationFaite Then MsgBox "Erreur lors de la mofification du fichier texte"
End Sub
A+
 

GI_tang

XLDnaute Nouveau
Re : modifié un fichier txt

merci de ta réponse mais ca ne fonctionne pas, en faite le nombre d'espace dans mon fichier txt peut varier:
EXEMPLE
03/01/2011, 0, 3, 19, 1,
03/01/2011, 0, 6, 16, 2,
03/01/2011, 80, 5, 4, 1,
03/01/2011, 5, 3, 9, 1,
 

mromain

XLDnaute Barbatruc
Re : modifié un fichier txt

merci de ta réponse mais ca ne fonctionne pas, en faite le nombre d'espace dans mon fichier txt peut varier:
EXEMPLE
03/01/2011, 0, 3, 19, 1,
03/01/2011, 0, 6, 16, 2,
03/01/2011, 80, 5, 4, 1,
03/01/2011, 5, 3, 9, 1,
Re bonjour,

Dans ton exemple, on ne voit pas la différence.
Peux-tu joindre un exemple du fichier txt en question (quand tu édites la réponse, clique sur Aller en mode avancé, puis sur l'icône Gérer les pièces jointes ; la pièce jointe doit être <= à 48 Ko).

A+
 

mromain

XLDnaute Barbatruc
Re : modifié un fichier txt

voici mon fichier en exemple

Re,

Avec le fichier que tu viens de fournir, je n'ai eu aucun soucis :
  • je l'ai dé-zipé ;
  • j'ai coller les deux bouts de code précédents dans un module d'un nouveau classeur (et adapté le chemin du fichier texte) ;
  • j'ai lancé la macro.


Le fichier texte a bien été modifié (123 a été remplacé par 3).

Peux-tu faire l'essai de ton coté s'il te plait ?

A+
 

GI_tang

XLDnaute Nouveau
Re : modifié un fichier txt

laisse tombé, je suis trop un boulet, je mettais 2011 AU lieu de 11.
en tout cas tu es trop fort c'est un script de ouf !!!!
juste une derniere requete en fait d'après mon fichier, quand on fait ta macro ca resserre les champs, il faudrai, si possible, gardé a chaque fois l'espace entre les virgule quelque soit le chiffre, les virgule doivent être aligné.
si tu as encor 5 min a m'accordé, je vais essayé de mon coté.
je pense que ca peut être dans la sub où on lance la fonction et en adaptant le paramètre d'entrée ca marchera
merci pour ton coup de main tout de même si je n'est pas de nouvelle
c cool
ca m'enlève une grosse épine du pied
 

GI_tang

XLDnaute Nouveau
Re : modifié un fichier txt

c'est bon merci j'ai réussi,
je concatène mes un champ vide (9espaces) avec ma valeur et après je fait un right(résultat concaténation , longueur champ) et je le passe en paramètre de ta fonction.

encore un grand merci, si un jour je peux t'aider
 

Discussions similaires

Réponses
1
Affichages
191

Statistiques des forums

Discussions
312 294
Messages
2 086 947
Membres
103 404
dernier inscrit
sultan87