Importer des données de .txt dans un tableau Excel

Bonjour à tous !

Je suis nouveau ici et j'ai déjà posté deux sujets pour un problème différent. N'ayant pas eu de solution, j'en ai donc conclu que je ne posais pas les bonnes questions et que je n'apportais pas suffisamment de détails. C'est pourquoi je vais tenter d'être le plus clair possible!

Alors voilà, l'entreprise où je travaille fabrique un produit. Ce produit peut être fabriqué de différentes façons selon la demande du/des client(s) et donc posséder des caractéristiques différentes. On m'a demandé de fabriquer un programme de saisie de ces dites données via Excel et VBA. C'est chose faite. Les données saisies par l'usagé sont ensuite stockées dans une feuille externe sous le format suivant : CLIENT_dd-mm-yyyy. Le programme fonctionne bien et je me suis surpris de réussir à un tel résultat. Mes connaissances en VBA étant limitées.

Et c'est justement là que je coince. En plus de devoir stocker les informations selon les clients. Des batteries de tests sont effectuées sur chaque produit et sont sauvegardées sous un format texte par un logiciel crée avant que j'arrive dans la boite. Je dois donc m'adapter et parvenir à récupérer ces données pour les stocker dans un autre tableau Excel, regroupant les caractéristique de saisie et les caractéristiques de test, et bien sur les faire correspondre correctement. C'est pourquoi je vous demande votre précieuse aide !

Je me suis renseigné sur les différentes méthodes afin d'interagir avec des fichiers texte et du VBA mais je ne trouve pas de solution adéquat sachant qu'il faut chercher les données d'une soixante-aine de fichiers .txt au maximum, j'ai du mal à trouver une méthode rapide et mes connaissances en VBA sont insuffisantes pour tenter de la lecture de txt en accès séquentiel par exemple.

De peur de foncer dedans sans vraiment savoir quelle serait la meilleur méthode pour mon projet, j'ai donc préféré venir ici en espérant que des gens plus débrouillards que moi me propose une solution rapide et efficace, je tiens à préciser que je viens ici avant tout pour progresser, je n'attends pas que les autres fassent le boulot pour moi sans tenter de comprendre le raisonnement.

Ci-joint deux fichiers texte afin que vous puissiez voir la mise en forme (sachez qu'elle peut varier selon le type de produit) et le tableau excel, .

Les cases remplies sont les valeurs saisies par l'usagé, les cases vides sont les valeurs à rechercher dans le txt correspondant (en fonction du numéro de série du produit).

Voilà, j'espère avoir été suffisamment clair, si vous avez besoin de plus de détails, n'hésitez pas !

PS : les noms de fichiers txt sont sous un format bien précis : yyyymmdd-hhmm-numerodeserie

2620151001-1506-1101.txt (682.00 Octets)
3020151001-1506-1109.txt (515.00 Octets)
43classeur1.xlsm (13.63 Ko)

bonjour,

une proposition

Sub aargh()
    Set ws1 = Sheets("feuil1")
    dl = ws1.Cells(Rows.Count, 1).End(xlUp).Row 'dernière ligne utilisée
    For i = 2 To dl 'on parcourt toutes les cellules de la colonne 4 ("D")
        f = Dir("*-" & ws1.Cells(i, 4) & ".txt") 'on recherche un fichier avec le numéro de série
        If f <> "" Then
            Open f For Input As #1 'on ouvre le fichier
            l = Input(LOF(1), 1) 'on lit le contenu du fichier dans l
            cs = 4 'indice de colonne
            ' on prend chaque phrase à rechercher
            For Each s In Array("Gm moyen :", "Moyenne test e :", "Moyenne test T :", "Moyenne test M :")
                cs = cs + 1
                s1 = InStr(l, s)
                If s1 <> 0 Then 'si on a trouvé la phrase
                    v = Mid(l, s1 + Len(s) + 1, InStr(s1, l, vbNewLine) - s1 - Len(s) - 1) ' on garde la partie de la ligne qui nous intéresse
                    Cells(i, cs) = Trim(Application.WorksheetFunction.Clean(v)) 'on nettoye la chaine et on la met à la bonne place dans le tableau
                            End If
            Next
            Close 1
        End If
    Next i
End Sub

Salut à vous et merci beaucoup pour votre solution qui fonctionne très bien, merci pour les explications, ça m'a permit de réaliser à quel point je me prenais la tête (pourquoi faire simple quand on peut faire compliqué est ma philosophie :'( )

Je vais me pencher là-dessus pour l'adapter selon les besoins.

J'aurais quelques questions à vous poser mais je vais bosser dessus et je vous demande demain si je suis toujours coincé et si, bien sur, vous voulez de nouveau m'apporter votre aide héhé

h2so4 a écrit :

bonjour,

une proposition

Sub aargh()
    Set ws1 = Sheets("feuil1")
    dl = ws1.Cells(Rows.Count, 1).End(xlUp).Row 'dernière ligne utilisée
    For i = 2 To dl 'on parcourt toutes les cellules de la colonne 4 ("D")
        f = Dir("*-" & ws1.Cells(i, 4) & ".txt") 'on recherche un fichier avec le numéro de série
        If f <> "" Then
            Open f For Input As #1 'on ouvre le fichier
            l = Input(LOF(1), 1) 'on lit le contenu du fichier dans l
            cs = 4 'indice de colonne
            ' on prend chaque phrase à rechercher
            For Each s In Array("Gm moyen :", "Moyenne test e :", "Moyenne test T :", "Moyenne test M :")
                cs = cs + 1
                s1 = InStr(l, s)
                If s1 <> 0 Then 'si on a trouvé la phrase
                    v = Mid(l, s1 + Len(s) + 1, InStr(s1, l, vbNewLine) - s1 - Len(s) - 1) ' on garde la partie de la ligne qui nous intéresse
                    Cells(i, cs) = Trim(Application.WorksheetFunction.Clean(v)) 'on nettoye la chaine et on la met à la bonne place dans le tableau
                            End If
            Next
            Close 1
        End If
    Next i
End Sub

Rebonjour, finalement j'ai un problème avec la fonction Dir. En effet, les premiers tests semblaient concluant mais en testant de nouveau, je me suis rendu compte que seule la première utilisation était ok. En effet, maintenant dans le pas à pas détaillé, je peux voir que le code considère f comme nul et donc saute directement au prochain i. J'ai beau changer la façon de déclarer Dir, rien n'y fait. J'ai fais des recherches sur mon copain google et je suis tombé sur une alternative utilisant le fso, or je ne connais pas du tout et je ne sais pas comment l'adapter à ma situation.

Source : http://stackoverflow.com/questions/22107858/vba-dir-function-not-working-on-excel-2010

si f est nul, c'est que le fichier recherché n'existe pas dans le répertoire spécifié

h2so4 a écrit :

si f est nul, c'est que le fichier recherché n'existe pas dans le répertoire spécifié

pourtant ce dernier existe bel est bien, f est nul alors que le fichier se trouve dans le répertoire

Et si je déclare le chemin via une range de cellule où j'ai écris l'adresse

exemple : "C:/repertoire/fichier/" je reçois un code d'erreur :

"Erreur d'execution '53' "

Fichier Introuvable

J'ai donc pensé à un problème de droit user windows mais ce n'est pas le cas, j'ai accès au fichier en lecture & en écriture. Je bloque sur le problème depuis un moment maintenant et je commence à désespérer.

Bonjour,

code adapté qui devrait te permettre de vérifier le nom du fichier recherché.

Sub aargh()
    Set ws1 = Sheets("feuil1")
    dl = ws1.Cells(Rows.Count, 1).End(xlUp).Row 'dernière ligne utilisée
   For i = 2 To dl 'on parcourt toutes les cellules de la colonne 4 ("D")
       ff="C:\repertoire\fichier\*-" & ws1.Cells(i, 4) & ".txt"
       msgbox "recherche fichier " & ff
       f = Dir(ff) 'on recherche un fichier avec le numéro de série
       If f <> "" Then
            Open f For Input As #1 'on ouvre le fichier
           l = Input(LOF(1), 1) 'on lit le contenu du fichier dans l
           cs = 4 'indice de colonne
           ' on prend chaque phrase à rechercher
           For Each s In Array("Gm moyen :", "Moyenne test e :", "Moyenne test T :", "Moyenne test M :")
                cs = cs + 1
                s1 = InStr(l, s)
                If s1 <> 0 Then 'si on a trouvé la phrase
                   v = Mid(l, s1 + Len(s) + 1, InStr(s1, l, vbNewLine) - s1 - Len(s) - 1) ' on garde la partie de la ligne qui nous intéresse
                   Cells(i, cs) = Trim(Application.WorksheetFunction.Clean(v)) 'on nettoye la chaine et on la met à la bonne place dans le tableau
                           End If
            Next
            Close 1
        End If
    Next i
End Sub

Tout d'abord, merci pour l'aide que vous m'apportez !

Le msg box m'affiche le bon fichier en fonction de la colonne D, ici la valeur en ligne deux de la colonne D est 1101.

Je reçois toujours le code d'erreur 53 et f est pourtant bel est bien correct :

ilzhblo

bonjour,

le message d'erreur survient sur quelle ligne ?


Bonjour,

correction du code si un répertoire est mentionné explicitement

Sub aargh()
    Set ws1 = Sheets("feuil1")
    dl = ws1.Cells(Rows.Count, 1).End(xlUp).Row 'dernière ligne utilisée
  For i = 2 To dl 'on parcourt toutes les cellules de la colonne 4 ("D")
      rep="C:\repertoire\fichier\"
      ff=rep & "*-" & ws1.Cells(i, 4) & ".txt"
       msgbox "recherche fichier " & ff
       f = Dir(ff) 'on recherche un fichier avec le numéro de série
      If f <> "" Then
            Open rep & f For Input As #1 'on ouvre le fichier
          l = Input(LOF(1), 1) 'on lit le contenu du fichier dans l
          cs = 4 'indice de colonne
          ' on prend chaque phrase à rechercher
          For Each s In Array("Gm moyen :", "Moyenne test e :", "Moyenne test T :", "Moyenne test M :")
                cs = cs + 1
                s1 = InStr(l, s)
                If s1 <> 0 Then 'si on a trouvé la phrase
                  v = Mid(l, s1 + Len(s) + 1, InStr(s1, l, vbNewLine) - s1 - Len(s) - 1) ' on garde la partie de la ligne qui nous intéresse
                  Cells(i, cs) = Trim(Application.WorksheetFunction.Clean(v)) 'on nettoye la chaine et on la met à la bonne place dans le tableau
                          End If
            Next
            Close 1
        End If
    Next i
End Sub
h2so4 a écrit :

bonjour,

Bonjour,

correction du code si un répertoire est mentionné explicitement

Bonjour! Merci pour votre aide, le fait de déclarer le répertoire de cette façon à résolu le problème !

EDIT : Autre problèmatique page 2

Bonjour tout le monde, je reviens vers vous car j'ai un petit soucis. Le code ci-dessus fonctionne très bien mais je coince à un certain niveau. Les fichiers textes sont générés par un logiciel externe que je ne peux pas modifier. Et ce dernier ne différencie pas les Test T des Test M

Donc, en utilisant sur le vba

For Each s In Array("Gm moyen :", "Moyenne test e :", "Moyenne test T :", "Moyenne test M :")

il ne peut pas non plus differencier T et M

Si l'on effectue le test T et le test M, le fichier .txt va se présenter sous cette forme :

Gm moyen

Moyenne test e

Moyenne test T

Moyenne test T < censé etre le test M et donc recopie en realité le test T dans la colonne du test M

Comment puis-je faire pour les différencier via le code vba ?

Sachant qu'il ya plusieurs cas :

Soit on fait un test T / format du . txt :

Gm moyen

Moyenne test e

Moyenne test T

Soit on fait un test M / format du . txt :

Gm moyen

Moyenne test e

Moyenne test T < censé être M

Soit on fait un test T ET M / format du . txt :

Gm moyen

Moyenne test e

Moyenne test T

Moyenne test T < censé être M

soit on fait un test T ET M

Je ne trouve pas de solution à mettre en place pour résoudre mon problème.

Firesyn a écrit :

Comment puis-je faire pour les différencier via le code vba ?

Sachant qu'il ya plusieurs cas :

Soit on fait un test T / format du . txt :

Gm moyen

Moyenne test e

Moyenne test T

Soit on fait un test M / format du . txt :

Gm moyen

Moyenne test e

Moyenne test T < censé être M

Je ne trouve pas de solution à mettre en place pour résoudre mon problème.

Il n'y a pas de solution, sauf si l'information est présente dans le nom du fichier (ou quelque part ailleurs) ou à demander si le fichier que l'on est en train de charger est un fichier T ou un fichier M, S'il y a les 2 cas et que T vient toujours avant M, il est possible de prévoir ce cas.

h2so4 a écrit :

Il n'y a pas de solution, sauf si l'information est présente dans le nom du fichier (ou quelque part ailleurs) ou à demander si le fichier que l'on est en train de charger est un fichier T ou un fichier M, S'il y a les 2 cas et que T vient toujours avant M, il est possible de prévoir ce cas.

J'ai pensé à quelque chose pour différencier T et M,

Pour le test T, on effectue via le logiciel externe 8 tests qui donne une moyenne, cette moyenne étant la valeur désirée de T dans notre tableau.

Pour le test M, on effectue 4 test qui donne une moyenne, cette moyenne étant la valeur désirée de M dans noter tableau.

Je vous joint ci-dessous le format TXT de ce que ça donne ^^

Avec cette distinction, est-il possible de faire quelque chose en vba ?

61506-400501.txt (595.00 Octets)

bonjour

à tester

Sub aargh()
    Set ws1 = Sheets("feuil1")
    dl = ws1.Cells(Rows.Count, 1).End(xlUp).Row 'dernière ligne utilisée
   For i = 2 To dl 'on parcourt toutes les cellules de la colonne 4 ("D")
       f = Dir("*-" & ws1.Cells(i, 4) & ".txt") 'on recherche un fichier avec le numéro de série
       If f <> "" Then
            Open f For Input As #1 'on ouvre le fichier
           l = Input(LOF(1), 1) 'on lit le contenu du fichier dans l
           cs = 4 'indice de colonne
           ' on prend chaque phrase à rechercher
           s1 = 1
           col = Array(5, 8, 6, 7) 'numero de colonne dans laquelle mettre la valeur trouvée
           cs = -1
           For Each s In Array("Grammage moyen :", "Moyenne E :", "Moyenne T :", "Moyenne T :")
                cs = cs + 1
                s1 = InStr(s1 + 1, l, s)
                If s1 <> 0 Then 'si on a trouvé la phrase
                   If cs = 2 Then If InStr(s1, l, "Valeur 8 :") = 0 Then cs = 3
                   v = Mid(l, s1 + Len(s) + 1, InStr(s1, l, vbNewLine) - s1 - Len(s) - 1) ' on garde la partie de la ligne qui nous intéresse
                   Cells(i, col(cs)) = Trim(Application.WorksheetFunction.Clean(v)) 'on nettoye la chaine et on la met à la bonne place dans le tableau
                           End If
            Next
            Close 1
        End If
    Next i
End Sub

Bonjour H2so4 !

Désolé mais je crois que tu as fais une erreur, en effet le code que tu viens de m'envoyer est celui que tu m'as conçu au tout début de mon topic, la problématique à changer depuis, la semaine dernière et tu m'as même indiqué que la solution serait compliquée en vue du format des .txt, c'est pourquoi je proposais ci dessus de différencier T et M par un nombre de valeurs différentes, mais je comprend tout à fait, tu ne peux pas te souvenir de tout les sujets auquel tu participes et je te remercie pour l'aide que tu apportes à la communauté ^^

Firesyn a écrit :

Bonjour H2so4 !

Désolé mais je crois que tu as fais une erreur, en effet le code que tu viens de m'envoyer est celui que tu m'as conçu au tout début de mon topic, la problématique à changer depuis, la semaine dernière et tu m'as même indiqué que la solution serait compliquée en vue du format des .txt, c'est pourquoi je proposais ci dessus de différencier T et M par un nombre de valeurs différentes, mais je comprend tout à fait, tu ne peux pas te souvenir de tout les sujets auquel tu participes et je te remercie pour l'aide que tu apportes à la communauté ^^

une mauvaise manipulation sans doute.

j'ai mis la bonne version dans mon message précédent.

Impeccable, j'ai adapté pour mes besoins et le fonctionnement est parfait. Merci beaucoup !

Rechercher des sujets similaires à "importer donnees txt tableau"