IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Comment se balader dans un fichier texte via VBA ? [XL-2013]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Ingénieur mécanique
    Inscrit en
    Février 2016
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur mécanique
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2016
    Messages : 13
    Par défaut Comment se balader dans un fichier texte via VBA ?
    Bonjour à tous,

    voilà je dois me balader dans un fichier texte rempli par un utilisateur lambda.
    Ce fichier peut contenir des informations sur 1 ou 2 lignes, cela dépend de l'utilisateur et de son humeur du jour

    Exemple:
    VALV PT=40 DY=0.11 EW=2
    PB=45 MA=0.0021 AL=/VALV_1/
    VALV PT=80 PB=45 DY=0.11 EW=2 MA=0.0021 AL=/VALV_2/

    Dans cet exemple, un premier élément VALV_1 a été définit sur 2 lignes et un deuxième élément VALV_2 a été définit sur 1 seule ligne.

    J'ai déjà un code qui fonctionne via VBA :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    'lecture sur fichier texte
    Open chemin For Input Access Read As #1
    Do While Not EOF(1)    ' Effectue la boucle jusqu'à la fin du fichier.
        Line Input #1, ligne   ' Lit une ligne
     
                    'recuperation type VALV
                If (Left(ligne, 4) = "VALV") Then
     
                     'recuperation nom vanne
                    T = 1
                    Do While (Mid(ligne, T, 3)) <> "AL="
                    T = T + 1
                        If T > 80 Then
                            Exit Do
                        End If
                    Loop
                    Sheets("file").Cells(ay, 2) = Mid(ligne, T + 3, 12)
     
                    'recuperation noeud
                    T = 1
                    Do While (Mid(ligne, T, 2)) <> "PT"
                    T = T + 1
                        If T > 80 Then
                            Exit Do
                        End If
                    Loop
                    Sheets("file").Cells(ay, 3) = Mid(ligne, T + 3, 5)
     
                    'recuperation masse vanne
                    ma = 1
                    Do While (Mid(ligne, ma, 3)) <> "MA="
                    ma = ma + 1
                        If ma > 80 Then
                            Exit Do
                        End If
                    Loop
                    Sheets("file").Cells(ay, 4) = Mid(ligne, ma + 3, 6)
                    'convertion tonnes en kg
                    Cells(ay, 4) = CDbl(Cells(ay, 4).Value * 1000)
     
                    'passe à la ligne
                    ay = ay + 1
                  End If
     
    Loop
    Close #1    ' Ferme le fichier.
    Le problème est le suivant : si l'utilisateur n'a pas entré toutes les infos sur 1 seule ligne, mon programme ne fonctionne pas.

    J'aimerai donc trouver un code qui se résumerai à:
    1) chercher une ligne commençant par VALV
    2) enregistrer le numéro de cette ligne (n)
    3) chercher les infos sur la ligne (n)
    4) si je ne trouve pas les infos sur la ligne (n), chercher ces infos sur la ligne (n+1)

    remarque : l'utilisateur ne peut pas définir un type VALV sur plus de 2 lignes.

    Je vous remercie d'avance pour votre aide.

  2. #2
    Membre Expert
    Avatar de Igloobel
    Homme Profil pro
    Développeur ERP - VBA et Formateur bureautique
    Inscrit en
    Septembre 2005
    Messages
    1 871
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Développeur ERP - VBA et Formateur bureautique
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 871
    Billets dans le blog
    1
    Par défaut
    Bonjour,

    Moi je chercherai "VALV" (ce que tu fais) et "/VALV" si trouvé une ligne sinon 2 lignes

  3. #3
    Membre averti
    Homme Profil pro
    Ingénieur mécanique
    Inscrit en
    Février 2016
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur mécanique
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2016
    Messages : 13
    Par défaut
    Citation Envoyé par Igloobel Voir le message
    Bonjour,

    Moi je chercherai "VALV" (ce que tu fais) et "/VALV" si trouvé une ligne sinon 2 lignes
    Re-bonjour,

    le soucis est que cette astuce ne peut marcher que dans le cadre de cet exemple, or les données entre les "/" ne servent qu'à préciser le nom de l'élément VALV utilisé dans le logiciel...

    Comment je peux le faire chercher dans 2 lignes ?

    Je peux donner un autre exemple:
    VALV PT=40 DY=0.11 EW=2
    PB=45 MA=0.0021 AL=/toto/
    TANG PT=70 DY=0.050 EW=3
    CROS CD=33
    VALV PT=80 DY=0.040 PB=81 EW=2 MA=0.0021 AL=/titi/

    remarque : la 2eme ligne dans l'exemple ci-dessus ne peut commencé qu'à partir du 5eme caractère.

    Avec le programme initial, la macro :
    1) ouvre le fichier texte
    2) explore ligne par ligne
    3) trouve une ligne qui commence par VALV
    4) extrait les infos de cette ligne
    5) passe à la ligne d'après, mais en cherchant un début de ligne = VALV

    VALV définit un type de vanne, PT définit le nœud où se situe la vanne, DY(ou DX ou DZ) donne la longueur de la vanne dans la direction indiquée, MA donne la masse (en tonne) et AL fournit la référence de la vanne.

    Donc dans mon fichier Excel, je me retrouve avec :
    une vanne identifiée au nœud 40, sans masse et sans référence (ce qui est fort regrettable n'est-ce pas?)
    une vanne identifiée au nœud 80, avec toutes les infos dispo.


  4. #4
    Expert éminent Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Par défaut
    A ta place, au lieu de passer par un Open For Input, je passerais par un banal Workbooks.Open en prenant pour délimiteur "/".

    Ce code devrait te mettre tous les articles sur une seule ligne.
    N'ayant pas ton fichier, je n'ai pas testé. Considère donc que c'est juste pour donner le principe général et qu'il y aura sans doute du débugage à faire.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Dim i as Long
    Workbooks.Open Filename:=chemin, Delimiter:="/"
    For i = cells(Rows.Count,1).End(xlUp).Row to 1 Step -1
       If Cells(i,2) = "" Then
          Cells(i,1) = Cells(i,1) & " " & Cells(i+1,1)
          Cells(i,2) = Cells(i+1,2)
          Rows(i+1).Delete
       End If
    Next i

  5. #5
    Membre averti
    Homme Profil pro
    Ingénieur mécanique
    Inscrit en
    Février 2016
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur mécanique
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2016
    Messages : 13
    Par défaut
    Citation Envoyé par Menhir Voir le message
    A ta place, au lieu de passer par un Open For Input, je passerais par un banal Workbooks.Open en prenant pour délimiteur "/".

    Ce code devrait te mettre tous les articles sur une seule ligne.
    N'ayant pas ton fichier, je n'ai pas testé. Considère donc que c'est juste pour donner le principe général et qu'il y aura sans doute du débugage à faire.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Dim i as Long
    Workbooks.Open Filename:=chemin, Delimiter:="/"
    For i = cells(Rows.Count,1).End(xlUp).Row to 1 Step -1
       If Cells(i,2) = "" Then
          Cells(i,1) = Cells(i,1) & " " & Cells(i+1,1)
          Cells(i,2) = Cells(i+1,2)
          Rows(i+1).Delete
       End If
    Next i
    Re-bonjour,

    je ne sais pas si la solution de mettre tout le fichier texte sur une seule et même ligne puisse m'aider...
    Je joins un exemple avec macro + fichier texte.
    Si vous avez des idées

    Résumé-essai.xlsEssai-free.txt

  6. #6
    Expert éminent Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Par défaut
    Tu semblais dire que ton principal problème était que certains articles étaient sur deux lignes.
    Donc, si la solution ne passe pas par la mise de tous les articles sur une seule ligne, je ne comprends plus...

  7. #7
    Membre éprouvé
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2015
    Messages
    78
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Aube (Champagne Ardenne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2015
    Messages : 78
    Par défaut
    il veut peut etre une valv par ligne

  8. #8
    Expert éminent Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Par défaut
    Citation Envoyé par Minise Voir le message
    il veut peut etre une valv par ligne
    C'est exactement ce que génère ma macro.

  9. #9
    Membre averti
    Homme Profil pro
    Ingénieur mécanique
    Inscrit en
    Février 2016
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur mécanique
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2016
    Messages : 13
    Par défaut
    Citation Envoyé par Menhir Voir le message
    Tu semblais dire que ton principal problème était que certains articles étaient sur deux lignes.
    Donc, si la solution ne passe pas par la mise de tous les articles sur une seule ligne, je ne comprends plus...
    Je pense que mon premier exemple a peut être plus embrouillé qu'autre chose...

    Pour pouvoir faire des vérifications sur un fichier de calcul de tuyauterie, j'ai besoin de trier les données entrées par un utilisateur.
    Le logiciel utilisé ne prend en compte que des lignes de codes, il est donc difficile de faire une vérification avec le fichier brut.

    Dans la plupart des cas (tri des supports/tri des données matériaux etc) je n'ai aucun problème de tri car toutes les données sont listées sur une seule ligne.

    Sauf pour les vannes... En effet, l'utilisateur a la liberté de rentrer les informations sur 2 lignes.
    Si j'utilise la macro de Menhir, je vais avoir toutes mes données mélangées et alignées sur 1 seule ligne. Ca aurait été parfait si je n'avais que des données de type VALV... Encore aurait-il fallu que les références des vannes et soient de même longueur (nombre de caractère fixe) et que je retrouve toujours la même structure.

    Le problème reste donc entier et je ne vois pas comment faire pour:
    1) trouver une ligne qui commence par VALV
    2) chercher une info sur cette ligne
    SI je trouve l'info, la lister dans mon fichier excel
    Sinon passer à la ligne N+1 et chercher l'info

    J'ai mis en ligne un exemple plus concret de mon problème.
    On peut voir dans le fichier excel, une fois le bouton "filtrer" activé, que certaines vannes n'ont ni de nom ni de masse.
    Or lorsque l'on regarde dans le fichier texte, ces informations sont bien présentent, mais dans la ligne juste en dessous.

    J'espère avoir été un peu plus clair et je vous remercie pour le temps que vous m'accordez.

  10. #10
    Expert éminent
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Par défaut



    Bonjour,

    vu qu'ici c'est le forum des formules de calculs - la prochaine fois poster dans le forum dédié au VBA ! - j'en resterais
    à de la simple logique : si une ligne ne commence pas par VALV, c'est donc la suite de la précédente, non ?!


    ______________________________________________________________________________________________________
    Je suis Paris, Charlie, …

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Supprimer un fichier texte via VBA
    Par Mimosa777 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 17/04/2008, 22h01
  2. Réponses: 3
    Dernier message: 01/08/2006, 15h18
  3. [VB.NET]comment écrire/lire dans un fichier text
    Par zouhib dans le forum Windows Forms
    Réponses: 1
    Dernier message: 19/05/2006, 17h11
  4. Retour à la ligne dans Zone de texte. Via VBA
    Par GuidoBrasletti dans le forum Access
    Réponses: 2
    Dernier message: 19/05/2006, 11h56
  5. Comment faire une insertion dans un fichier texte ?
    Par Isa31 dans le forum Langage
    Réponses: 10
    Dernier message: 28/12/2004, 09h06

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo