Extraction de lignes précises d'un fichier txt sous Excel

Bonjour tout le monde,

étant nouveau et parcourant votre forum depuis quelques jours, j'ai pu apprendre et comprendre les bases de la programmation VBA pour les macros Excel.

J'ai lu plusieurs sujets sur ce forum, mais aucuns ne m'a vraiment semblé être identique c'est pourquoi je poste ce message. Je ne cherche en aucuns cas à recevoir un document tout fait, je suis là pour apprendre.

Alors voila, je récupère un fichier texte (.txt) d'une machine et j'aimerais ranger les infos de ce fichier txt dans un fichier excel pré-défini, avec des colonnes déjà prêtes à être complétées.

Je vous joins mon fichier .txt.

Mon but est donc de faire une macro me permettant de sélectionner ce fichier .txt (partie déjà effectuée), puis de pouvoir en extraire les lignes contenants la date, les termes "En dehors des tolérances" et les 5 valeurs qui suivent ce terme à chaque fois.

Un seul terme reviendra sur chaque fichier txt, c'est le terme CHR#1. J'aimerais donc récupérer des infos au dessus (la date) et en dessous (les valeurs et "en dehors des tolérances").

Pour le moment, j'ai écris/repris et modifié ceci:

Option Explicit

Sub Recuperelesinfos()
Dim Fichier As Variant
Fichier = Application.GetOpenFilename("Texte (*.txt), *.txt", , "Sélection du fichier texte", , False)
If Fichier = False Then Exit Sub
LectureFichier Fichier
End Sub

Private Sub LectureFichier(ByVal sFichier As String)
Dim Chaine As String
Dim Ar() As String
Dim i As Long
Dim iRow As Long, iCol As Long
Dim NumFichier As Integer
Dim Separateur As String * 1
Close
Separateur = ";"
NumFichier = FreeFile
iRow = 1: iCol = 1
Application.ScreenUpdating = False
Open sFichier For Input As #NumFichier
Do While Not EOF(NumFichier)
Line Input #NumFichier, Chaine
If InStr(Chaine, "CHR#1") Then
Line Input #NumFichier, Chaine
Line Input #NumFichier, Chaine
Line Input #NumFichier, Chaine
'permet de renvoyer la 3e ligne, y a t il plus simple?'
Ar = Split(Chaine, Separateur)
Cells(iRow, iCol) = Ar(0)
iRow = iRow + 1
End If
Loop
Close #NumFichier
Application.ScreenUpdating = True
End Sub

Je vous remercie d'avance pour vos conseils et commentaires et vous souhaite à tous une bonne journée.

Cordialement,

JuJel

250list8.txt (975.00 Octets)

UP!

Bonsoir,

Peux-tu nous dire exactement les valeurs que tu veux récupérer dans ton fichier texte, par exemple en les mettant sur une feuille Excel ?

Personnellement, je ne sais pas ce quelles lignes correspondent aux valeurs, et tu veux aussi récupérer la ligne En dehors de la tolérance ou les nombres du dessous ?

Ce ne serait pas plus simple de reconstruire le fichier sous forme de tableau avant de faire avant de filtrer tes données ?

Bonjour,

merci pour votre réponse. Je vais essayer d'être plus clair. EN fait ce fichier texte est récupéré dans le format présenté directement par la machine de contrôle et je dois obligatoirement me servir de ce fichier texte sans le réarranger. C'est pourquoi je demande comment récupérer les infos du fichier texte, sachant que suivant les tests de la machine toutes la informations contenues dans le fichier texte vont changer, sauf le terme CHR#1 (qui correspond en fait au numéro de la machine).

Mon but est de récupérer par une macro, la date et heure du test (qui se situe toujours 3 lignes au dessus de ce champ CHR#1.

Le code que j'ai écrit et posté dans mon premier post, me permet en fait de récupérer des lignes que je veux en dessous de ce champ (suivant le nombre de Line Input que j'écris), ici j'en avais écris 3 donc je récupère la 3e ligne en dessous de CHR#1, à savoir : "En dehors de la tolérance". Je peux donc récupérer en adaptant le "En dehors des tolérances" et les 5 valeurs numériques qui suivent à chaque fois. Mais mon problème se situe vraiment au niveau de la date, puisqu'elle se situe 3 lignes au-dessus, donc 3 lignes avant. Et ca je ne vois vraiment pas comment la récupérer.

C'est pour cela que j'en appelle à votre aide. (et éventuellement si vous connaissez un moyen plus simple que de mettre 3 Line Input pour récupérer la 3e ligne après le champ).

Voila j'espère avoir été clair et je vous remercie du temps passé à lire et à essayer de comprendre mon problème, c'est super sympa.

Jujel

Bonjour

Un peu laborieuse comme solution

Surement des améliorations à faire

Les 2 fichiers dans le même répertoire

Bonjour à tous,j'ignore tout à fait si je suis dans le bon forum;aussi vous voudrez bien pardonner mon éventuelle erreur d'aiguilage.

Voici mon problème : j'importe un fichier texte dans excel. En fait il s'agit d'une facture dont je voudrais n'extraire que les données "marchandises" soit quantités, désignations et prix unitaires.

Sous les lignes de facturation, là où je voudrais m'arrêter, il y a une série d'autres indications (que je veux éliminer) la première ligne reprend toujours un mot qui est le même à chaque facture : emballage

mon problème est donc : comment compter les lignes à partir de la première jusqu'à la ligne contenant ce mot.

Après, je dois pouovoir me débrouiller pour continuer l'automatisation de cette liste de prix. J'ai déjà tout réalisé avec différentes macros, mais je dois toujours effacer ces lignes inutiles manuellement.

Je voous remercie de votre aide.

Bonsoir SimKmil,

Si tu veux faire l'extraction de ta facturation sous Excel, je confirmes que tu es dans le bon forum, mais il est préférable que tu crées un nouveau post pour ta demande, sinon cela va être compliqué de suivre le sujet principal.

Si tu veux une réponse rapide explique avec le minimum de détail et si possible, un extrait de ton fichier texte. Un truc du genre, voici mon fichier texte, dans celui-ci je voudrais récupérer toutes le lignes de facturation qui sont... et je souhaiterai retrouver le code en colonne A, le libellé en colonne B...

Mais il faut faire, stp, cette demande sur un nouveau fil.

Bonjour tout le monde et surtout Banzai64,

je te remercie pour ton code, il m'a l'air plutôt bien, en tout cas les infos que je voulais sont récupérées donc je te remercie grandement! C'est exactement ce que je voulais. Je vais adapter le code à ma feuille et ça devrait aller

En tout cas un grand merci à toi et un grand merci aux gens du forum pour leur rapidité et leurs connaissances!

Cordialement,

Jujel

Je reviens vers vous et vers toi Banzai64 suite à ta macro.

Elle marche vraiment bien dans mon cas, mais il y a un soucis concernant la récupération des dates.

En effet, dans la colonne A on retrouve aussi des valeurs numériques (qui apparemment sont interprétées comme des dates), aurais-tu ou auriez-vous une solution pour éviter cela?

Cordialement,

Jujel

Bonjour

Comme ton fichier n'avait pas cette particularité

Peut-être en testant si la "date" est supérieure à une date réelle ?

Je n'ai pas trop d'idée

En voyant ton fichier texte peut-être que je verrai une autre approche

Les nombres sont toujours par groupe de 5 ?

Bonjour Banzai64,

merci pour ta réponse. En fait j'ai pu trouver comment faire en partant de ton code et en récupérant la ligne de la date sans tester si c'est une date ou non.

J'adapte ta méthode ensuite en reglant l'offset pour récupérer la ligne voulue.

Je te joins le code final pour récupérer la ligne de la date par exemple.

Un grand merci à toi pour tout, car je n'aurai jamais réussi tout seul!

Option Explicit

Sub test()
Dim Chemin As String, Fichier As String
Dim Cel As Range
Dim NbLg As Long, Ligne As Long, LgDepart As Long
Dim WsDestin As Worksheet

  Application.ScreenUpdating = False
  Chemin = ThisWorkbook.Path & "\"
  Fichier = "List8.txt"

  Set WsDestin = Sheets(1)      ' La page de recopie

  Workbooks.OpenText Filename:=Chemin & Fichier, Origin:=xlMSDOS, StartRow:=1, DataType:=xlDelimited, _
                     TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=True, Semicolon:=False, _
                     Comma:=False, Space:=False, Other:=False, FieldInfo:=Array(1, 1), TrailingMinusNumbers:=True
  With ActiveWorkbook
    With .Sheets(1)
      NbLg = .Range("A" & Rows.Count).End(xlUp).Row

      Set Cel = .Columns(1).Find(What:="CHR#1", LookIn:=xlValues, LookAt:= _
        xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False _
        , SearchFormat:=False)
      If Not Cel Is Nothing Then
        Ligne = Ligne + 1
        LgDepart = Cel.Row
        While LgDepart <= NbLg
        WsDestin.Range("A" & Ligne) = Cel.Offset(-3, 0)
        Set Cel = .Columns(1).FindNext(Cel)
        Ligne = Ligne + 1
        LgDepart = LgDepart + 23
        Wend
      End If

    End With
    .Close savechanges:=False
  End With
  Range("A1:A" & Ligne).NumberFormat = "m/d/yyyy h:mm:ss"
End Sub

Voila, je pense que c'est un code correct. En tout cas il marche impeccablement bien!

En effet, le format du fichier texte est standard et il y a toujours 5 valeurs numériques entre les "En dehors des tolérances" et 23 lignes entre les CHR#1 (explication pour mon code

Un grand merci encore et une bonne fin de journée.

Cordialement,

Jujel

Bonjour

A la lecture de ton code tu ne récupères que les dates

Exact ?

Alors essayes ce code

Option Explicit

Sub Recupere()
Dim Chemin As String, Fichier As String, Depart As String
Dim Cel As Range
Dim Ligne As Long
Dim WsDestin As Worksheet

  Application.ScreenUpdating = False
  Chemin = ThisWorkbook.Path & "\"
  Fichier = "List8.txt"

  Set WsDestin = Sheets(1)      ' La page de recopie

  Workbooks.OpenText Filename:=Chemin & Fichier, Origin:=xlMSDOS, StartRow:=1, DataType:=xlDelimited, _
                     TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=True, Semicolon:=False, _
                     Comma:=False, Space:=False, Other:=False, FieldInfo:=Array(1, 1), TrailingMinusNumbers:=True
  With ActiveWorkbook
    With .Sheets(1)
      Set Cel = .Columns(1).Find(what:="CHR#1", LookIn:=xlValues, lookat:=xlWhole)
      If Not Cel Is Nothing Then
        Depart = Cel.Address
        Do
          Ligne = Ligne + 1
          WsDestin.Range("A" & Ligne) = Cel.Offset(-3, 0)
          Set Cel = .Columns(1).FindNext(Cel)
        Loop While Depart <> Cel.Address
      End If
    End With
    .Close savechanges:=False
  End With
  Range("A1:A" & Ligne).NumberFormat = "m/d/yyyy h:mm:ss"
End Sub

Oui c'est exact, j'ai mis le code pour les dates uniquement. J'adapte ensuite le même code pour récupérer les autres infos en changeant l'offset.

Merci beaucoup Banzai64, je pense que maintenant tout est bon. Je clos le sujet et te remercie grandement!!!

Cordialement,

Jujel

Bonjour Jujel.

Je me permets de vous contacter même si le sujet est clos depuis quelques années.

Je n'ai pratiquement aucun connaissance en VBA juste quelques notions de formules Excel et votre code m’intéresse beaucoup.

Je souhaiterais également extraire les données de 4 fichiers textes "167.txt" , "174.txt" ,... pour les ajouter automatiquement dans les bonnes cellules de ma feuille excel : fichier "Inventaire-machines....xlsm", feuille "conf switch"

Je n'ai que des connaissances réseaux et système et j'imagine qu'il faut utiliser des boucles avec des tests sur des chaines de caractères ou quelques chose comme ça mais ça dépasse mes compétences.

Ce que j'aimerai pouvoir faire c'est de récupérer les informations suivantes :

- adresses MAC, n°switch et n° de port et de les faire correspondre au cellule A3,B3,C3 et cela pour chaque ligne sachant que dans mon fichier texte le nombre d'adresse MAC par port pourras augmenter ou diminuer chaque jour.

- que le format de l'adresse mac devrait être transformé de 68b5.99aa.e6f7 à 68-B5-99-AA-E6-F7.

Auriez vous, s'il vous plait, des pistes ou quelque morceaux de codes à me proposer pour ce problème qui me semble complexe.

J'ai testé avec des formules mais je pense qu'il y a beaucoup plus simple pour quelqu'un de plus expérimenté dans le domaine.

Je vous remercie par avance pour l'aide que vous pourriez m'accorder.

Bonne soirée

Cordialement

Jean

excel texte
31167.txt (12.24 Ko)

bonjour

voila une macro pour les adresse MAC

A+

Maurice

Sub AdresMac()
Dim Chn As String
Dim I&, L&
Dim AdrMac As String
Dim IPnrm As String
Application.ScreenUpdating = False
    For L = 3 To Range("F" & Rows.Count).End(xlUp).Row
        AdrMac = UCase(Range("F" & L).Value)
        AdrMac = Replace(AdrMac, ".", "")
            For I = 1 To 12 Step 2
              Chn = Chn & Mid$(AdrMac, I, 2) & "-"
            Next I
         Range("K" & L).Value = Left$(Chn, Len(Chn) - 1)
         Chn = ""
         AdrMac = ""
    Next
End Sub

Merci beaucoup pour cette réponse rapide et efficace.

Il me reste encore a trouver une macro pour extraire uniquement les données de mes fichiers textes automatiquement dans les bonnes colonnes . Mais la je pense que c'est une autre histoire...

J'ai aussi chercher une formule pour afficher dans une cellule le contenu d'une cellule A1 en fonction de deux valeurs de deux autres cellules de la même ligne du type :

comparer deux colonnes des deux feuilles différentes, et lorsqu'on trouve une correspondance, afficher dans la feuille2 le contenu de la cellule A1 de la feuille1 de la ligne ou les valeurs des deux colonnes correspondent.

Difficile a expliquer ... un peu du style :

=INDEX($D$4:$D$10;EQUIV(F3&G3;B4:B10&C4:C10;0)) et valider avec Ctrl+Maj+Entré

http://tssperformance.com/faites-la-recherche-dune-valeur-sur-la-base-de-2-criteres-en-utilisant-index-et-equiv-sous-forme-matricielle/#.Ws5tsZcuBaQ

mais peux être qu'une formule avec un rechercheV avec des "si" imbriqués me donnerais un résultat plus adapté ?

Après quand il ya a une correspondance sur plusieurs lignes, je ne sais pas s'il est possible de rajouter le contenu des différentes cellules de la feuille 1 dans la même et unique cellule de la feuille2.

Bref si quelqu'un a compris mes explications bravo

Bonne soirée.

Rechercher des sujets similaires à "extraction lignes precises fichier txt"