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 :

Revenir au début d'un fichier texte après être arriver à la dernière ligne


Sujet :

Macros et VBA Excel

  1. #1
    Membre confirmé
    Homme Profil pro
    Architecte matériel
    Inscrit en
    Janvier 2013
    Messages
    113
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Architecte matériel
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2013
    Messages : 113
    Par défaut Revenir au début d'un fichier texte après être arriver à la dernière ligne
    Bonjour,

    Voici une partie de mon code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     Case "toto.asc"
         With text
     
            While Not text.Line = 6
                .SkipLine
            Wend
            '...
         End Wtih
    J'ai un fichier .asc (qui j'ouvre comme un .txt)
    A l'ouverture du fichier il va à la ligne 6 puis commence à lire les données.

    Mais pour que le code soit plus fonctionnel je dois d'abord connaitre le nombre de ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
            While Not text.AtEndOfStream
                text.SkipLine
            Wend
    Du coup j'insère cette parti de code avant la lecture des données.


    Connaissez vous un moyen de revenir au début du fichier texte après avoir déterminer le nombre de ligne, pour ensuite rependre la suite du code avant la modification.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     Case "toto.asc"
         With text
             While Not text.AtEndOfStream
                text.SkipLine
            Wend     
     
     
           'Revenir au début du fichier
     
            While Not text.Line = 6
                .SkipLine
            Wend
            '...
         End Wtih

    Car j'ai le message d'erreur "L'entrée dépasse la fin du fin" ce qui est logique comme je suis arrivé à la fin du fichier pour compter le nombre de ligne.

    En vous remerciant pour votre aide

  2. #2
    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, bonjour,

    fermer le fichier et le rouvrir par exemple !

    Sinon la question est de savoir pourquoi connaître à l'avance le nombre de lignes ? Quel intérêt ?

  3. #3
    Membre confirmé
    Homme Profil pro
    Architecte matériel
    Inscrit en
    Janvier 2013
    Messages
    113
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Architecte matériel
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2013
    Messages : 113
    Par défaut
    Merci pour ta réponse,

    J'avais pensé à fermer et rouvrir le fichier mais je ne sais pas trop ou placer la chose.
    Le code initial de vient pas de moi et est assez gros donc j'ai peu peu de faire une manip qui puisse engendrer des erreurs par la suite.

    Pour situé un peu plus le problème.
    Je sélectionne un dossier, qui contient lui même des dossiers, qui eux contiennent des fichiers textes dont le fameux "toto.asc". D'un sous dossier à l'autre les noms de fichiers textes sont les même (donc 4 sous dossiers, 4 fichiers "toto.asc")

    Donc pour chaque sous dossier le code va ouvrir les fichiers text et récupérer les données à récupérer en remplissant des tableaux.


    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
    Sub Recuperation_Donnees(CheminAs String)
    Dim n As Integer
    Dim i As Integer
     
    Dim nomk() As String
     
        DossiersResultats (CheminPointThb)
        NbCas= AdresseCas(0)
     
        ReDim Preserve NomCasData(NbCasData)
     
        For i = 1 To AdresseCas(0)
            nomk = Split(AdresseCas(i), "\")
            NomCasData(i) = Mid(nomk(UBound(nomk)), 7)
        Next i
     
       n = 0
      For i = 1 To AdresseCas(0)
         Call Fichier(i, AdresseCas(i), "aaa")
         Call Fichier(i, AdresseCas(i), "bbb")
         Call Fichier(i, AdresseCas(i), "ccc")
         Call Fichier(i, AdresseCas(i), "ddd")
         Call Fichier(i, AdresseCas(i), "eee")
         Call Fichier(i, AdresseCas(i), "fff")
         Call Fichier(i, AdresseCas(i), "ggg")
     Next i
     
        For i = 1 To AdresseCas(0)
     
            Call Fichier(i, AdresseCas(i), "toto.asc")
     
        Next i
    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
    Public Function FichierData(numk As Integer, chk As String, nom As String)
     
    Dim FSO As Scripting.FileSystemObject
    Dim Fichier As Scripting.File
    Dim text As Scripting.TextStream
    Dim stock() As String, s() As String, b As Integer, c As Integer, d As Integer, pa As Long
    Dim nomk() As String
     
     
     Set FSO = New Scripting.FileSystemObject
     Set Fichier = FSO.GetFile(chk & "\" & nom)
     Set text = Fichier.OpenAsTextStream(ForReading)
     
     
     Select Case nom
     
     
     Case "aaa":
         With text
             While Not .Line = 9
                .SkipLine
             Wend
    ...
        End With
     
     Case "bbb":
         With text
             While Not .Line = 5
                .SkipLine
             Wend
    ....
         End With
     
    ' ECT pour chaque fichier
    Et donc voilà un peu la structure du code
    Donc il faudrait que je ferme et je réouvre le fichier.
    J'ai essayé de rajouter après la lecture du nombre de ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
            text.Close
            Set text = Fichier.OpenAsTextStream(ForReading)
    Mais j'ai le message d'erreur
    "variable ou objet de bloc with non définie"

    Sinon la question est de savoir pourquoi connaître à l'avance le nombre de lignes ? Quel intérêt ?
    En fait pour éviter de possible erreur je dois d'abord connaitre le nombre de ligne pour pouvoir redimensionner un tableau et ensuite le remplir.
    J'ai pensé à le redimensionner ligne par ligne, mais d'un sous dossier à l'autre je risque de perdre des données car le nombre de ligne de "toto.asc" varie d'un sous dossier à l'autre.

  4. #4
    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

    Je suppose que le terme de tableau ne désigne pas une plage de cellules d'une feuille
    mais bien une variable tableau en mémoire, non ?

    La finalité une fois le tableau rempli ? (Sans détails, j'ai au moins une douzaine de voies donc autant m'abstenir !)

    Fichiers texte .asc < 1 Mo ? Pas de séparateur, juste des lignes de texte ?

  5. #5
    Invité
    Invité(e)
    Par défaut Bonjour,
    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
    Dim FileNumber As Long
    Dim t As String
    Dim txtFichier As String
    Dim TableauTxt
    FileNumber = FreeFile
     Open chk & "\" & nom For Input As #FileNumber
     While EOF(FileNumber)
     Line Input #FileNumber, t
     txtFichier = txtFichier & t & vbCrLf
     Wend
    Close (FileNumber)
    TableauTxt = Split(txtFichier, vbCrLf)
    For i = 0 To UBound(TableauTxt)
        Debug.Print TableauTxt(i)
        If Trim("" & TableauTxt(i)) = "toto" Then i = 0 'je repat du début.
    Next

  6. #6
    Membre confirmé
    Homme Profil pro
    Architecte matériel
    Inscrit en
    Janvier 2013
    Messages
    113
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Architecte matériel
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2013
    Messages : 113
    Par défaut
    Je suppose que le terme de tableau ne désigne pas une plage de cellules d'une feuille
    mais bien une variable tableau en mémoire, non ?
    Oui c'est ça, chaque ligne contient plusieurs caractères.
    Le code les remplie de cette manière (i = numéro du sous dossier)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Tableau(i - 1, 1).Temps = Replace(stock(2), ".", ",")
    La finalité une fois le tableau rempli ? (Sans détails, j'ai au moins une douzaine de voies donc autant m'abstenir !)
    D'autres tableau en mémoire sont remplies à partir d'un fichier excel et, le code compare les données excel et fichiers pour rapporter les différences.
    Fichiers texte .asc < 1 Mo ? Pas de séparateur, juste des lignes de texte ?
    La taille est variable, mais tous les exmples que j'ai pu voir faisaient mois de 50ko, donc je suppose que oui.


    Mais je pense avoir résolue le problème en fermant et réouvrant le fichier. Je plaçais les morceaux de code au mauvais endroit sans doute.


    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
     Case "toto.asc"
            'AJOUT
            ReDim Preserve Nbligne(0 To numk)
            Nbligne(0) = 0
     
            Set text = Fichier.OpenAsTextStream(ForReading)
            While Not text.AtEndOfStream
                text.SkipLine
            Wend
            Nbligne(numk) = text.Line
            'MsgBox ("nblignes  " & Nbligne(numk))
     
            If Nbligne(numk) < Nbligne(numk - 1) Then Nbligne(numk) = Nbligne(numk - 1)
            ReDim Preserve Tableau(AdresseCas(0) - 1, Nbligne(numk))
            text.Close
            Set text = Fichier.OpenAsTextStream(ForReading)
            'AJOUT FIN
     
         'CODE ORIGINEL pour la suite
         With text
            While Not text.Line = 6
                 text.SkipLine
            Wend
    Je vais faire des tests pour voir si je lit tout comme il faut.

    Merci rdurupt pour ton aide également, si je trouve des bugs, je testerai ta proposition.
    Et Merci encore Marc-L

  7. #7
    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

    La "solution" de fermer et de rouvrir le fichier est un pis-aller car le fichier est lu deux fois !
    Bon, comme les fichiers ne sont pas gros mais c'est par principe …

    En conservant la lecture via FileSystemObject, il y a sa méthode ReadAll (cf tutoriel) …

    Une variante de la proposition de Robert dans les dix premières lignes de ce code,
    la variable tableau TL recevant l'intégralité des lignes du fichier lu …

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

Discussions similaires

  1. Création d'un fichier texte après modification d'une table
    Par keryss dans le forum MS SQL Server
    Réponses: 0
    Dernier message: 17/01/2012, 14h04
  2. Réponses: 0
    Dernier message: 31/08/2011, 18h42
  3. [TPW] Ajout d'une ligne dans un fichier texte après une position saisie
    Par Invité dans le forum Turbo Pascal
    Réponses: 1
    Dernier message: 19/12/2010, 12h27
  4. Ecrire au début d'un fichier texte
    Par lebigboss dans le forum VB.NET
    Réponses: 4
    Dernier message: 26/03/2010, 10h09
  5. Réponses: 2
    Dernier message: 21/10/2008, 11h46

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