Parcourir fichier texte (.TXT) en VBA [Résolu]

Signaler
Messages postés
131
Date d'inscription
jeudi 21 mai 2009
Statut
Membre
Dernière intervention
18 mars 2012
-
Messages postés
131
Date d'inscription
jeudi 21 mai 2009
Statut
Membre
Dernière intervention
18 mars 2012
-
Bonjour,
Je sollicite ENCORE votre aide !!! J'aimerai copier toutes les lignes d'un fichier texte (.TXT) qui commencent par « MG » dans un autre fichier texte (.TXT) qui ce trouvera dans un autre répertoire.

La macro ci-dessous parcours tous les fichier texte (.TXT) du dossier et en copie chaque ligne commençant par « MG » mais elle ne fonctionne pas?.



Dim Doss As String
Dim fs As FileSearch
Dim i As Long
Dim fso
Dim fic
Dim ficLire
Dim Lignes() As String
Dim LigneAEcrire As String
Dim Lireligne As String

Doss = "C:\Fichier"

Set fs = Application.FileSearch
Set fso = CreateObject("Scripting.FileSystemObject")
Set fic = fso.CreateTextFile("C:\test\fichier_modifié.txt", True)


ReDim Lignes(1 To 1)
With fs
.NewSearch
.LookIn = Doss
.FileName = "*.txt"
.SearchSubFolders = True
.Execute
For i = 1 To .FoundFiles.Count ' Parcours de tous les dossiers
LigneAEcrire = ""
Do Until ficLire.atendofstream
Lireligne = ficLire.readline
If Left(Lireligne, 1) = "MG" Then
LigneAEcrire = LigneAEcrire & Lireligne & ";"
End If
Loop
Lignes(UBound(Lignes)) = LigneAEcrire
ReDim Preserve Lignes(1 To UBound(Lignes) + 1)
ficLire.Close
Next i
End With

For i = 1 To UBound(Lignes) - 1
fic.writeline Lignes(i)
Next i
fic.Close


Par contre il faudrait qu'il parcoure uniquement un fichier bien précis du répertoire.

Le tout en VBA excel.

Pourriez-vous m?aider.

Merci à tous et bonne journée !

22 réponses

Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
69
code réutilisable facilement...

Private Sub ExtractLines(ByRef vsFichierIn As String, ByRef vsFichierOut As String, ByRef vsCritere As String)
Dim FileName As String
Dim Content As String
Dim iFile As Integer
Dim oFile As Integer
Dim oMatch As Object
    '# Va permettre nos modifications de texte
    With CreateObject("VbScript.Regexp")
        .MultiLine = True
        '# Lecture du contenu du fichier d'entrée
        iFile = FreeFile
        Open vsFichierIn For Binary Access Read As #iFile
            Content = Space$(LOF(iFile))
            Get #iFile, , Content
        Close iFile
        If LenB(Content) > 0 Then
            oFile = FreeFile
            Open vsFichierOut For Output As #oFile
            
            '# Matchera la ligne d'entete
            .Pattern = "^.+$"
            Print #oFile, .Execute(Content)(0)

            '# Matchera la ligne dont le premier champ correspond au critère
            .Pattern = "^" & vsCritere & "\s*\|.*$"
            .Global = True
            For Each oMatch In .Execute(Content)
                Print #oFile, oMatch
            Next
            
            Close #oFile
        End If
    End With
End Sub


Pour l'appel, faire un :

ExtractLines "c:\test\Fichier_IN.txt", "c:\test\Fichier_OUT.txt", "MG"


Renfield - Admin CodeS-SourceS - MVP Visual Basic & Spécialiste des RegExp
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
69
If Left(Lireligne, 1) = "MG" Then

pourra jamais etre vrai, tu ne demande qu'un caractère...


Renfield - Admin CodeS-SourceS - MVP Visual Basic & Spécialiste des RegExp
Messages postés
131
Date d'inscription
jeudi 21 mai 2009
Statut
Membre
Dernière intervention
18 mars 2012

Merci pour ta célérité !!

Oui effectivement, mais j'ai tellement testé de différentes façon que j'ai oublié de corrigé, à la base ce n'était pas « MG » mais « # ».

Même avec If Left(Lireligne, 2) = "MG" Then cela ne fonctionne pas.

Le nouveau fichier « fichier_modifié.txt » est bien crée mais vide

As-tu une idée ?
Messages postés
693
Date d'inscription
samedi 18 mai 2002
Statut
Membre
Dernière intervention
17 avril 2017
2
Bonjour,

Renfield à débusqué l'erreur et, de préférence, il faut mieux typer ta fonction.

If Left$(Lireligne, 2) = "MG" Then

Tu obtiendras ainsi un gain de temps de plus de 300%.

Cheyenne
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
69
Application.FileSearch

plus géré avec les Office récent, j'ai vu passer une question sur le forum il y a une quinzaine de jours...


on peut s'amuser un peu :

Const Folder As String = "C:\Fichier"
Dim FileName As String
Dim Content As String
Dim iFile As Integer
Dim oFile As Integer
Dim oMatch As Object
    '# Va permettre nos modifications de texte
    With CreateObject("VbScript.Regexp")
        .Pattern = "^MG.*$"
        .Global = True
        .MultiLine = True
        '# Parcoure de tous les fichiers .txt
        FileName = Dir$(Folder & "*.txt")
        Do While LenB(FileName)
            '# Lecture du contenu du fichier d'entrée
            iFile = FreeFile
            Open Folder & FileName For Binary Access Read As #iFile
                Content = Space$(LOF(iFile))
                Get #iFile, , Content
            Close iFile
            '# Ouverture du fichier de sortie, s'il n'a pas déja ete créé
            If oFile = 0 And .test(Content) Then
                oFile = FreeFile
                Open "C:\test\fichier_modifié.txt" For Output As #oFile
            End If
            For Each oMatch In .Execute(Content)
                Print #oFile, oMatch
            Next
            
            '# Fichier suivant...
            FileName = Dir$
        Loop
        '# Fermeture du fichier de sortie
        If oFile Then
            Close #oFile
        End If
    End With



Renfield - Admin CodeS-SourceS - MVP Visual Basic & Spécialiste des RegExp
Messages postés
131
Date d'inscription
jeudi 21 mai 2009
Statut
Membre
Dernière intervention
18 mars 2012

Oui cela fonctionne !! J'ai oublié quelques détails (Mia culpa).

1.Le dossier « fichier_modifié.txt » est bien crée mais range sur la même ligne les « MG » au lieu de les rangers lignes après lignes.

2.J'ai oublié de dire que le fichier de départ contient des entêtes que j'aimerais conserver pour des traitements ultérieurs.

3.il faudrait également ne parcourir qu'un seul fichier un endroit précis par exemple : C:\fichier.txt

Désolé des détails qui ont leurs importances.

Merci d'avance.
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
69
1. Pas moi...
le
Print #oFile, oMatch
ajoute un saut de ligne systématiquement...

libre a toi d'en ajouter un au besoin:
Print #oFile, oMatch & vbNewLine


2. ajoutes l'entete que tu souhaites, a l'ouverture du fichier

3. pourquoi en ce cas se compliquer avec une boucle ?
supprime là, pas de soucis..





Renfield - Admin CodeS-SourceS - MVP Visual Basic & Spécialiste des RegExp
Messages postés
131
Date d'inscription
jeudi 21 mai 2009
Statut
Membre
Dernière intervention
18 mars 2012

Désolé Renfield de te déranger encore une fois.

? Je n'arrive pas à enlever la boucle pour parcourir qu'un seul fichier précis.
? Lorsque je rajoute Print #oFile, oMatch & vbNewLine j'ai une ligne vide entre deux lignes à chaque fois.
? Comment puisse-je faire pour récupérer les entêtes du fichiers initial & C:\fichier.txt dans le fichier & dans le fichier fichier_modifié.txt et ensuite le remplir chaque ligne commençant par « MG » dans le fichier fichier_modifié.txt qui provient du fichier initial.


Encore une fois merci pour ton aide !!
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
69
a quoi ressemble ton fichier d'origine ?

Renfield - Admin CodeS-SourceS - MVP Visual Basic & Spécialiste des RegExp
Messages postés
131
Date d'inscription
jeudi 21 mai 2009
Statut
Membre
Dernière intervention
18 mars 2012

C'est un fichier TXT qui ce présente sous cette forme mais il y a beaucoup plus d'entêtes:


Magasin |col |hauteur |adresse | Equipement |Date 1ere mise en service
MG . . AF O 20/05/2011

Magasin MG
Col .
Hauteur .
adresse AF
equipement o
Date 1ere mise en service 20/05/2011

Il y a un peu prés 80000 lignes mais seules les lignes du magasin MG m?intéressent.

Merci
Messages postés
131
Date d'inscription
jeudi 21 mai 2009
Statut
Membre
Dernière intervention
18 mars 2012

Pour plus de compréhension voici comment mon fichier TXT ce présente:


Magasin   |col |hauteur  |adresse   | Equipement  |Date 1ere mise en service  
  MG      | .  |    .    |     AF   |     O       |           20/05/2010           
  MG      | .  |    .    |     AG   |     N       |           20/05/2011  
  MG      | .  |    .    |     AZ   |     O       |           20/05/2009 
  MG      | .  |    .    |     AA   |     N       |           20/05/2008
  MG      | .  |    .    |     AC   |     O       |           20/05/2008           
      




* par le nombre de ligne soit en peu près 80000 lignes

Merci
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
236
Ce que tu montres à Renfield est-il (c'est ce qu'il attend, en fait) un copier/coller de ce que contient ton fichier texte, ouvert avec le bloc-notes ?


____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
Messages postés
131
Date d'inscription
jeudi 21 mai 2009
Statut
Membre
Dernière intervention
18 mars 2012

Ce n'est pas un copier coller du fichier, mais il se présente exactement comme cela avec beaucoup plus d'entête c'est la seul difference.



Magasin   |col |hauteur  |adresse   | Equipement  |Date 1ere mise en service  
  MG      | .  |    .    |     AF   |     O       |           20/05/2010           
  MG      | .  |    .    |     AG   |     N       |           20/05/2011  
  MG      | .  |    .    |     AZ   |     O       |           20/05/2009 
  MG      | .  |    .    |     AA   |     N       |           20/05/2008
  MG      | .  |    .    |     AC   |     O       |           20/05/2008           
  MA      | .  |    .    |     AC   |     O       |           20/05/2008           
  MB      | .  |    .    |     AC   |     O       |           20/05/2008  
  MG      | .  |    .    |     AC   |     O       |           10/05/2007                      



Merci
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
236
montre un copier/coller !


____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
Messages postés
131
Date d'inscription
jeudi 21 mai 2009
Statut
Membre
Dernière intervention
18 mars 2012

Comment fait on pour coller un copier-coller dans le cadre votre message ?
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
236
Tu ouvres ton fichier avec le bloc-notes ===>> tu en sélectionnes environ 10 lignes (cela devrait suffire) === >> tu les copies === >> tu les colles ici telles que dans le presse-papier *
C'est dur ?


____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
Messages postés
131
Date d'inscription
jeudi 21 mai 2009
Statut
Membre
Dernière intervention
18 mars 2012

je veux bien mais rien n'est aligné?

Lign/Mag Magasin | col |hauteur |adresse | Equipement |Date 1ere mise en service |Cause | traité par |Infos de
MG | . | . | | AA | O | 20/05/2010 | KC | ld | .
MG | . | . | | AF | O | 20/05/2010 | KC | ld | .
MG | . | . | | AF | O | 20/05/2010 | KC | ld | .
MG | . | . | | AG | O | 20/05/2010 | KC | ld | .
MA | . | . | | AF | O | 20/05/2010 | KC | ld | .
MG | . | . | | AF | O | 20/05/2010 | KC | ld | .
MG | . | . | | AF | O | 20/05/2010 | KC | ld | .
MG | . | . | | AJ | O | 20/05/2010 | KC | ld | .
MG | . | . | | AF | O | 20/05/2010 | KC | ld | .
MG | . | . | | AE | O | 20/05/2010 | KC | ld | .
MG | . | . | | AF | O | 20/05/2010 | KC | ld | .
MG | . | . | | AF | O | 20/05/2010 | KC | ld | .
MG | . | . | | AF | O | 20/05/2010 | KC | ld | .
MC | . | . | | AF | O | 20/05/2010 | KC | ld | .
MG | . | . | | AR | O | 20/05/2010 | KC | ld | .
MG | . | . | | AF | O | 20/05/2010 | KC | ld | .
MG | . | . | | AF | O | 20/05/2010 | KC | ld | .
MG | . | . | | AF | O | 20/05/2010 | KC | ld | .
MV | . | . | | AM | O | 20/05/2010 | KC | ld | .
MG | . | . | | AF | O | 20/05/2010 | KC | ld | .
MG | . | . | | AF | O | 20/05/2010 | KC | ld | .
MG | . | . | | AE | O | 20/05/2010 | KC | ld | .
MG | . | . | | AF | O | 20/05/2010 | KC | ld | .
MG | . | . | | AF | O | 20/05/2010 | KC | ld | .
MO | . | . | | AF | O | 20/05/2010 | KC | ld | .



merci
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
69
pas aligné ?
les séparateurs sont là pour mettre tout le monde d'accord ^^

Renfield - Admin CodeS-SourceS - MVP Visual Basic & Spécialiste des RegExp
Messages postés
131
Date d'inscription
jeudi 21 mai 2009
Statut
Membre
Dernière intervention
18 mars 2012

Oui effectivement, mais pas alignés se sont les entêtes par rapport au reste.
lorsque je copie le fichier original tout est alignés les entêtes et le reste et quand je le colle ici ce n est pas le cas. Voilà pourquoi je dis pas alignés. Merci
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
236
Ah !
essaye de le coller ici entre balises code, pour voir !
car je devine des tabulations ou des espaces (et il nous faut savoir ce que c'est)


____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient