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 :

[VBA] Problème avec EOF qui "sort" avant la fin du fichier [XL-2010]


Sujet :

Macros et VBA Excel

  1. #1
    Invité
    Invité(e)
    Par défaut [VBA] Problème avec EOF qui "sort" avant la fin du fichier
    Bonjour,

    J'utilise la macro suivante, extrêmement simple, je veux simplement lire mon fichier toto.txt ligne par ligne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Sub Go()
        Dim File_Path As String
        File_Path = "C:\toto.txt"
        Open File_Path For Input As #1
        row_num = 0
        Do Until EOF(1)
            Line Input #1, Line_FromFile
            row_num = row_num + 1
        Loop
        Close #1
        MsgBox row_num
    End Sub
    Cependant, mon fichier toto.txt (disponible ici sous forme zippée), contient des caractères spéciaux (il s'agit d'un extrait de dump d'une table de données).
    Il semblerait que l'un de ces caractères spéciaux (que vi fait apparaître en tant que "^Z" à la 2ème ligne, colonne 249 de mon fichier) perturbe la commande EOF qui du coup, "sort" à la ligne 2 dès qu'elle rencontre ce caractère.

    Ma variable row_num affiche donc la valeur 2, alors que mon fichier contient 6 lignes...
    Je voudrais que ma macro VBA parcoure bien l'ensemble des 6 lignes de mon fichier.
    D'où vient le problème, et comment corriger mon code pour que ça marche ?

    Par avance, merci !

  2. #2
    Invité
    Invité(e)
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Do while EOF(1)
            Line Input #1, Line_FromFile
            row_num = row_num + 1
        Loop

  3. #3
    Invité
    Invité(e)
    Par défaut
    J'ai testé, mais ça ne marche pas... row_num = 0

  4. #4
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Billets dans le blog
    8
    Par défaut heu
    bonsoir
    essaie de ne pas utiliser des noms d'expression vba pour tes fonctions

    adapte ton file_path

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Sub Gos()
        Dim File_Path As String
        File_Path = "C:\Users\polux\Desktop\test2.txt"
        Open File_Path For Input As #1
        laChaine = Input(LOF(1), #1)
        row_num = UBound(Split(laChaine, vbCrLf))
        Close #1
        MsgBox row_num
    End Sub
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  5. #5
    Invité
    Invité(e)
    Par défaut
    Malheureusement, ça ne marche pas non plus...

    J'obtiens le message d'erreur suivant sur l'instruction "laChaine = Input(LOF(1), #1)" :

    Erreur d'exécution '62' :
    L'entrée dépasse la fin de fichier

  6. #6
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Billets dans le blog
    8
    Par défaut re
    Ok visiblement la methode open n'aime pas ton fichier
    tant pis on par sur l'object scriptingfilesystem alors
    et la ca fonctionne !!!!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
     
    Sub test3()
    Dim oFSO as object,ofile as object ,texte as string 
     Const ForReading = 1: Const ForWriting = 2
     File_Path = "C:\Users\polux\Desktop\toto.txt"
     
    Set oFSO = CreateObject("Scripting.FileSystemObject")
        Set ofile = oFSO.OpenTextFile(File_Path, ForReading)
    texte = ofile.readall
    MsgBox UBound(Split(texte, vbCrLf))
    End Sub
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  7. #7
    Membre Expert
    Inscrit en
    Octobre 2010
    Messages
    1 401
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 1 401
    Par défaut
    Bonjour.


  8. #8
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Billets dans le blog
    8
    Par défaut re
    bon il semblerait quen ouvrant le fichier en binaire avec open ca fonctionne aussi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Sub testlecture()
    Dim laChaine As String, x, fichier As String
    fichier = "C:\Users\polux\Desktop\toto.txt"
    x = FreeFile
     Open fichier For Binary Access Read As #x
            laChaine = String(LOF(x), " ")
            Get #x, , laChaine
     
    Close #x
      MsgBox UBound(Split(laChaine, vbCrLf))
     
    End Sub
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  9. #9
    Invité
    Invité(e)
    Par défaut
    Patricktoulon,

    La solution avec Scripting.FileSystemObject ne fonctionne pas (renvoie 3).
    Mais la solution avec Open en binaire fonctionne (renvoie bien 6).

    Je vais maintenant étudier le pourquoi et comment de la chose.
    En tous cas, cet obstacle est enfin franchi grâce à ton aide, merci !

  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.

    Citation Envoyé par Faalamva Voir le message
    Je vais maintenant étudier le pourquoi et comment de la chose.
    C'est simple : mauvais fichier mal enregistré ou corrompu, n'est donc pas un vrai fichier texte !

    _____________________________________________________________________________________________________
    Je suis Charlie, Bardo, Sousse

  11. #11
    Expert confirmé
    Avatar de Oliv-
    Homme Profil pro
    solution provider
    Inscrit en
    Mars 2006
    Messages
    4 093
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : solution provider

    Informations forums :
    Inscription : Mars 2006
    Messages : 4 093
    Billets dans le blog
    20
    Par défaut
    Bonsoir,
    J'ai eu récemment un problème pour lire un fichier csv, c'était lié à l'encodage ANSI vs UTF-16LE

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      Set objStream = FSO.OpenTextFile(fichier, 1, False, True)
    Have a nice day. Oliv'
    Votre réponse est peut être dans mon blog !
    https://www.developpez.net/forums/blogs/191381-oliv-/

  12. #12
    Membre Expert
    Inscrit en
    Octobre 2010
    Messages
    1 401
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 1 401
    Par défaut
    Bonsoir.

    Voici un démo de : While Not EOF(filenumber)


    Valeurs dans le fichier test.txt

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    'Fichier test.txt
    1
    1.2
    1,235
    10-01-2015
    2015-01-10
    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
     
    Sub tt()
     
    'Fichier test.txt
    '1
    '1.2
    '1,235
    '10-01-2015
    '2015-01-10
     
     Set f = Worksheets("Feuil1")
     f.Cells.Clear
     f.Columns(1).NumberFormat = "@"
     f.Columns("B:E").NumberFormat = "General"
     f.Cells(1, 1) = "Fichier"
     f.Cells(1, 2) = ".Value"
     
     Chemin = "C:\Users\client\Downloads\test.txt"
     filenumber = FreeFile
     ReDim t(1 To 1, 1 To 1)
     
        Open Chemin For Input As #filenumber
     
           While Not EOF(filenumber)
     
            Line Input #filenumber, a
     
            ligne = ligne + 1
     
            f.Cells(ligne + 1, 1).Value = a
            f.Cells(ligne + 1, 2).Value = a
     
            ReDim Preserve t(1 To 1, 1 To ligne)
            t(1, ligne) = a
     
        Wend
     
        Close #filenumber
     
        f.Cells(2, 3).Resize(UBound(t, 2)).Value = Application.Transpose(t)
        f.Cells(1, 3) = ".Value"
     
        f.Cells(2, 5).Resize(UBound(t, 2)).FormulaLocal = Application.Transpose(t)
        f.Cells(1, 5) = ".FormulaLocal"
     
    End Sub

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

Discussions similaires

  1. Formulaires : problème avec les slashes et les quotes
    Par GarGamel55 dans le forum Langage
    Réponses: 1
    Dernier message: 12/10/2005, 15h59
  2. (jsp) problème avec sql qui contient la date
    Par future dans le forum Servlets/JSP
    Réponses: 7
    Dernier message: 31/08/2005, 16h18
  3. [Requete SQL en VBA] Problème avec la fonction FLOOR
    Par zubral dans le forum Langage SQL
    Réponses: 4
    Dernier message: 13/07/2004, 13h24

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