(RESOLU)Macro Excel récupération de données dans plusieurs fichiers Texte

jozerebel

XLDnaute Occasionnel
Bonjour à tous,

Mon logiciel métier me génère des fichiers texte quand il rencontre des anomalies.

Les fichiers texte sont nombreux et contiennent bcp de données.

Seulement, je n'ai besoin d'extraire que certaines anomalies (les lignes qui contiennent "Inexistant").

Je souhaiterais savoir s'il est possible, par macro, de lire tous les fichiers texte (placés dans un même dossier) et d'incrémenter dans Excel, chaque fois qu'il trouve "Inexistant", le nom du fichier correspondant puis la recopie de la ligne en question qui contient des éléments importants au traitement de l'erreur.

J'ai chaque mois 40 fichiers texte générés et chaque fichier contient environ 2000 lignes, d'où l'intérêt de passer par une macro.

Une idée pour m'aider?

D'avance merci.
 
Dernière édition:

dra72

XLDnaute Occasionnel
Re : Macro Excel récupération de données dans plusieurs fichiers Texte

Bonjour jozerebel et à tous,

Une première piste et à défaut de précision sur la partie qui te pose problème:

Il te faut utiliser la commande VBA Line Input.

Bonne continuation
 

Robert

XLDnaute Barbatruc
Repose en paix
Re : Macro Excel récupération de données dans plusieurs fichiers Texte

Bonjour le fil, bonjour le forum,

Une proposition (grâce à l'aide VBA et la piste de Dra). Il ne te reste qu'a adapter le dossier d... :
Code:
Sub Macro1()
Dim o As Object 'déclare la variable o (Onglet)
Dim sf As Object 'déclare la variable sf (Système de Fichiers)
Dim d As Object 'déclare la variable d (Dossier)
Dim fs As Object 'déclare la variable fs (FichierS)
Dim f As Object 'déclare la variable f (Fichier)
Dim lt As String 'déclare la variable lt (Ligne de Texte)
Dim dest As Range 'déclare la variable dest (cellule de DESTinatiion)

Set o = Sheets("Feuil1") 'définit l'onglet o
Set sf = CreateObject("Scripting.FileSystemObject") 'définit la variable sf
Set d = sf.getfolder("C:\Poubelle") 'définit le dossier d (à adapter à ton cas)
Set fs = d.Files 'définit l'ensemble des fichiers fs du dossier d
For Each f In fs 'boucles sur tous les fichier f de l'ensemble fs
    If UCase(Right(f.Name, 3)) = "TXT" Then 'condition 1 : si l'extension du fichier est "txt" ou "TXT"
        Open f For Input As #1    ' Ouvre le fichier (extrait de l'aide VBA)
        Do While Not EOF(1)    ' Effectue la boucle jusqu'à la fin du fichier (extrait de l'aide VBA)
            Line Input #1, lt        ' Lit la ligne dans la variable (extrait de l'aide VBA)
            If lt Like "*inexistant*" Then 'condition 2 : si la ligne contient le mot "inexistant"
                'définit la cellule de destination (A1 si A1 est vide, sinon la première cellule vide de la colonne A)
                Set dest = IIf(o.Range("A1").Value = "", o.Range("A1"), o.Cells(Application.Rows.Count, 1).End(xlUp).Offset(1, 0))
                dest.Value = f.Name 'place le nom du fichier dans la colonne A (à supprimer éventuellement)
                dest.Offset(0, 1).Value = lt 'lplace la ligne contenant le mot "inexistant" dans la colonne B (à adapter éventuellement)
            End If 'fin de la condition 2
        Loop    'continue la boucle (extrait de l'aide VBA)
        Close #1    ' Ferme le fichier (extrait de l'aide VBA)
    End If 'fin de la condition 1
Next f 'prochain fichier de la boucle
End Sub
 

jozerebel

XLDnaute Occasionnel
Re : Macro Excel récupération de données dans plusieurs fichiers Texte

Salut à tous, Robert,


Merci bcp pour ton code qui fonctionne ss pb.

Pour ma gouverne, si je souhaitais recopier les trois lignes qui suivent celle où apparaît le mot "inexistant" ds le fichier txt, quelle modif devrais-je apporter au code?

Encore merci pour cette aide précieuse.
 

Robert

XLDnaute Barbatruc
Repose en paix
Re : Macro Excel récupération de données dans plusieurs fichiers Texte

Bonjour le fil, bonjour le forum,

Le code modifié ci-dessous n'est valable que si il n'y a qu'une seule fois le mot inexistant par fichier...
Code:
Sub Macro1()
Dim o As Object 'déclare la variable o (Onglet)
Dim sf As Object 'déclare la variable sf (Système de Fichiers)
Dim d As Object 'déclare la variable d (Dossier)
Dim fs As Object 'déclare la variable fs (FichierS)
Dim f As Object 'déclare la variable f (Fichier)
Dim lt As String 'déclare la variable lt (Ligne de Texte)
Dim dest As Range 'déclare la variable dest (cellule de DESTinatiion)
Dim test As Boolean 'déclare la variable test
Dim nv As Byte 'déclare la variable nv (Nombre de test Vrai)

Set o = Sheets("Feuil1") 'définit l'onglet o
Set sf = CreateObject("Scripting.FileSystemObject") 'définit la variable sf
'Set d = sf.getfolder("C:\Poubelle") 'définit le dossier d (à adapter à ton cas)
Set fs = d.Files 'définit l'ensemble des fichiers fs du dossier d
For Each f In fs 'boucles sur tous les fichier f de l'ensemble fs
    If UCase(Right(f.Name, 3)) = "TXT" Then 'condition 1 : si l'extension du fichier est "txt" ou "TXT"
        nv = 0 'initialise la variable nv
        Open f For Input As #1    ' Ouvre le fichier (extrait de l'aide VBA)
        Do While Not EOF(1)    ' Effectue la boucle jusqu'à la fin du fichier (extrait de l'aide VBA)
            Line Input #1, lt        ' Lit la ligne dans la variable (extrait de l'aide VBA)
            If lt Like "*inexistant*" Or test = True Then 'condition 2 : si la ligne contient le mot "inexistant" ou si test est vrai
                nv = nv + 1 'incrémente la variable nv
                test = IIf(nv < 3, True, False) 'définit la variable test (vrai si nv est inférieur à 3, sinon faux)
                'définit la cellule de destination (A1 si A1 est vide, sinon la première cellule vide de la colonne A)
                Set dest = IIf(o.Range("A1").Value = "", o.Range("A1"), o.Cells(Application.Rows.Count, 1).End(xlUp).Offset(1, 0))
                dest.Value = f.Name 'place le nom du fichier dans la colonne A (à supprimer éventuellement)
                dest.Offset(0, 1).Value = lt 'lplace la ligne contenant le mot "inexistant" dans la colonne B (à adapter éventuellement)
            End If 'fin de la condition 2
        Loop    'continue la boucle (extrait de l'aide VBA)
        Close #1    ' Ferme le fichier (extrait de l'aide VBA)
    End If 'fin de la condition 1
Next f 'prochain fichier de la boucle
End Sub
 
Dernière édition:

jozerebel

XLDnaute Occasionnel
Re : Macro Excel récupération de données dans plusieurs fichiers Texte

Bonjour Robert,

Aucune solution si le mot apparaît plusieurs fois?

car tel est le cas parfois dans les fichiers.

Par contre, ta première macro récupère bien toutes les lignes où le mot apparait.

Merci.
 
Dernière édition:

Robert

XLDnaute Barbatruc
Repose en paix
Re : Macro Excel récupération de données dans plusieurs fichiers Texte

Bonsoir le fil, bonsoir le forum,

Je ne maîtrise absolument pas ce genre de code, donc la solution fait un peu "usine à gaz" mais elle semble fonctionner :
Code:
Sub Macro1()
Dim o As Object 'déclare la variable o (Onglet)
Dim sf As Object 'déclare la variable sf (Système de Fichiers)
Dim d As Object 'déclare la variable d (Dossier)
Dim fs As Object 'déclare la variable fs (FichierS)
Dim f As Object 'déclare la variable f (Fichier)
Dim lt As String 'déclare la variable lt (Ligne de Texte)
Dim dest As Range 'déclare la variable dest (cellule de DESTinatiion)
Dim test As Boolean 'déclare la variable test
Dim nv As Byte 'déclare la variable nv (Nombre de test Vrai)

Set o = Sheets("Feuil1") 'définit l'onglet o
Set sf = CreateObject("Scripting.FileSystemObject") 'définit la variable sf
Set d = sf.getfolder("C:\Users\Robert\Desktop") 'définit le dossier d (à adapter à ton cas)
Set fs = d.Files 'définit l'ensemble des fichiers fs du dossier d
For Each f In fs 'boucles sur tous les fichier f de l'ensemble fs
    If UCase(Right(f.Name, 3)) = "TXT" Then 'condition 1 : si l'extension du fichier est "txt" ou "TXT"
        Open f For Input As #1    ' Ouvre le fichier (extrait de l'aide VBA)
        Do While Not EOF(1)    ' Effectue la boucle jusqu'à la fin du fichier (extrait de l'aide VBA)
            Line Input #1, lt        ' Lit la ligne dans la variable (extrait de l'aide VBA)
            If lt Like "*inexistant*" Or test = True Then 'condition 2 : si la ligne contient le mot "inexistant" ou si test est vrai
                nv = IIf(nv = 3, 0, nv + 1) 'définit la variable nv (zéro si nv est égal à trois, sinon incrémente nv)
                test = IIf(nv = 0, False, True) 'définit la variable test (Faux si nv vaut zéro, sinon Vrai)
                If test = True Then 'condition 3 : si test est Vrai
                    'définit la cellule de destination (A1 si A1 est vide, sinon la première cellule vide de la colonne A)
                    Set dest = IIf(o.Range("A1").Value = "", o.Range("A1"), o.Cells(Application.Rows.Count, 1).End(xlUp).Offset(1, 0))
                    dest.Value = f.Name 'place le nom du fichier dans la colonne A (à supprimer éventuellement)
                    dest.Offset(0, 1).Value = lt 'lplace la ligne contenant le mot "inexistant" dans la colonne B (à adapter éventuellement)
                End If 'fin de la condition 3
            End If 'fin de la condition 2
        Loop    'continue la boucle (extrait de l'aide VBA)
        Close #1    ' Ferme le fichier (extrait de l'aide VBA)
    End If 'fin de la condition 1
Next f 'prochain fichier de la boucle
End Sub
 

Discussions similaires