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

sancho12345 131 Messages postés jeudi 21 mai 2009Date d'inscription 18 mars 2012 Dernière intervention - 13 févr. 2012 à 13:20 - Dernière réponse : sancho12345 131 Messages postés jeudi 21 mai 2009Date d'inscription 18 mars 2012 Dernière intervention
- 14 févr. 2012 à 09:32
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 !
Afficher la suite 

Votre réponse

22 réponses

Meilleure réponse
Renfield 17307 Messages postés mercredi 2 janvier 2002Date d'inscription 18 janvier 2017 Dernière intervention - 14 févr. 2012 à 09:10
3
Merci
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

Merci Renfield 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 125 internautes ce mois-ci

Commenter la réponse de Renfield
Renfield 17307 Messages postés mercredi 2 janvier 2002Date d'inscription 18 janvier 2017 Dernière intervention - 13 févr. 2012 à 13:42
0
Merci
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
Commenter la réponse de Renfield
sancho12345 131 Messages postés jeudi 21 mai 2009Date d'inscription 18 mars 2012 Dernière intervention - 13 févr. 2012 à 13:58
0
Merci
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 ?
Commenter la réponse de sancho12345
cs_cheyenne 693 Messages postés samedi 18 mai 2002Date d'inscription 17 avril 2017 Dernière intervention - 13 févr. 2012 à 14:03
0
Merci
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
Commenter la réponse de cs_cheyenne
Renfield 17307 Messages postés mercredi 2 janvier 2002Date d'inscription 18 janvier 2017 Dernière intervention - 13 févr. 2012 à 14:30
0
Merci
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
Commenter la réponse de Renfield
sancho12345 131 Messages postés jeudi 21 mai 2009Date d'inscription 18 mars 2012 Dernière intervention - 13 févr. 2012 à 14:53
0
Merci
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.
Commenter la réponse de sancho12345
Renfield 17307 Messages postés mercredi 2 janvier 2002Date d'inscription 18 janvier 2017 Dernière intervention - 13 févr. 2012 à 15:10
0
Merci
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
Commenter la réponse de Renfield
sancho12345 131 Messages postés jeudi 21 mai 2009Date d'inscription 18 mars 2012 Dernière intervention - 13 févr. 2012 à 17:23
0
Merci
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 !!
Commenter la réponse de sancho12345
Renfield 17307 Messages postés mercredi 2 janvier 2002Date d'inscription 18 janvier 2017 Dernière intervention - 13 févr. 2012 à 17:28
0
Merci
a quoi ressemble ton fichier d'origine ?

Renfield - Admin CodeS-SourceS - MVP Visual Basic & Spécialiste des RegExp
Commenter la réponse de Renfield
sancho12345 131 Messages postés jeudi 21 mai 2009Date d'inscription 18 mars 2012 Dernière intervention - 13 févr. 2012 à 17:43
0
Merci
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
Commenter la réponse de sancho12345
sancho12345 131 Messages postés jeudi 21 mai 2009Date d'inscription 18 mars 2012 Dernière intervention - 13 févr. 2012 à 19:34
0
Merci
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
Commenter la réponse de sancho12345
ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionContributeurStatut 11 avril 2018 Dernière intervention - 13 févr. 2012 à 20:07
0
Merci
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
Commenter la réponse de ucfoutu
sancho12345 131 Messages postés jeudi 21 mai 2009Date d'inscription 18 mars 2012 Dernière intervention - 13 févr. 2012 à 20:18
0
Merci
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
Commenter la réponse de sancho12345
ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionContributeurStatut 11 avril 2018 Dernière intervention - 13 févr. 2012 à 20:21
0
Merci
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
Commenter la réponse de ucfoutu
sancho12345 131 Messages postés jeudi 21 mai 2009Date d'inscription 18 mars 2012 Dernière intervention - 13 févr. 2012 à 20:41
0
Merci
Comment fait on pour coller un copier-coller dans le cadre votre message ?
Commenter la réponse de sancho12345
ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionContributeurStatut 11 avril 2018 Dernière intervention - 13 févr. 2012 à 20:49
0
Merci
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
Commenter la réponse de ucfoutu
sancho12345 131 Messages postés jeudi 21 mai 2009Date d'inscription 18 mars 2012 Dernière intervention - 13 févr. 2012 à 21:54
0
Merci
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
Commenter la réponse de sancho12345
Renfield 17307 Messages postés mercredi 2 janvier 2002Date d'inscription 18 janvier 2017 Dernière intervention - 14 févr. 2012 à 06:03
0
Merci
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
Commenter la réponse de Renfield
sancho12345 131 Messages postés jeudi 21 mai 2009Date d'inscription 18 mars 2012 Dernière intervention - 14 févr. 2012 à 08:09
0
Merci
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
Commenter la réponse de sancho12345
ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionContributeurStatut 11 avril 2018 Dernière intervention - 14 févr. 2012 à 08:29
0
Merci
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
Commenter la réponse de ucfoutu

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.

Parcourir fichier texte (.TXT) en VBA - page 2