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 :

Line Input #1, texte


Sujet :

Macros et VBA Excel

  1. #1
    Membre confirmé
    Homme Profil pro
    Responsable de compte
    Inscrit en
    Juin 2014
    Messages
    219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable de compte

    Informations forums :
    Inscription : Juin 2014
    Messages : 219
    Par défaut Line Input #1, texte
    Bonjour.

    J'ai ce bout de code VBA qui devrait me lire le contenu d'un fichier .CSV ligne par ligne et m'afficher chaque ligne dans une MsgBox:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Private Sub lecture(fichier As String)
    Dim it As Integer
    Open fichier For Input As #1
    Do While Not EOF(1)
    Line Input #1, texte
    MsgBox texte
    it = it + 1
    MsgBox "itération N° " & it
    Loop
    Close #1
    End Sub
    Au lieu de cela, ma MsgBox texte m'affiche toutes les lignes de mon fichiers (les 35 premières plus précisément) les unes en dessous des autres, puis une fois acquittée, ma MsgBox itération m'affiche le N°1
    alors que je devrais avoir à acquitter chaque MsgBox pour passer à la ligne suivante et aussi incrémenter mon compteur itération..

  2. #2
    Membre Expert Avatar de mfoxy
    Homme Profil pro
    Automation VBA
    Inscrit en
    Février 2018
    Messages
    752
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Belgique

    Informations professionnelles :
    Activité : Automation VBA
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2018
    Messages : 752
    Par défaut
    Bonjour,

    Je ne comprend pas le but final de ta macro.

    Tu pourrais au plus simple importer ton csv dans Excel et le traité plus efficacement.

    Voir même une utilisation de power query.

  3. #3
    Membre confirmé
    Homme Profil pro
    Responsable de compte
    Inscrit en
    Juin 2014
    Messages
    219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable de compte

    Informations forums :
    Inscription : Juin 2014
    Messages : 219
    Par défaut
    Bonjour

    Le bu final est de remplir une feuille d'un classeur Excel depuis un fichier .CSV.

    Le but est donc de balayer le .csv ligne par ligne pour après les "disséquer" au niveau des ";" pour remplir chaque cellules du fichier Excel.
    Mais je vois que mon balayage ligne par ligne ne fonctionne pas, j'ai donc rédui mon bout de code présenté juste à la partie qui ne me donne pas satisfaction !

    C'est un bout de code exemple qui me permet de voir si le résultat attendu est respecté, mais sans but apparent réel.

  4. #4
    Membre Expert Avatar de Thumb down
    Homme Profil pro
    Retraité
    Inscrit en
    Juin 2019
    Messages
    1 560
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juin 2019
    Messages : 1 560
    Par défaut
    Bonsoir,
    Ton fichier est constitué de retour lignes VbCR il ne contient pas de findeligne vbLF !
    En fait ton fichier ne contient qu'une seule ligne.
    http://stackoverflow.com/questions/2...8/ddg#27223391

  5. #5
    Membre confirmé
    Homme Profil pro
    Responsable de compte
    Inscrit en
    Juin 2014
    Messages
    219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable de compte

    Informations forums :
    Inscription : Juin 2014
    Messages : 219
    Par défaut
    Peut être as tu raison, à savoir comment je pourrais vérifier tes dires, car quand j'ouvre mon CSV avec un éditeur, les lignes sont bien affcihées les unes sous les autres.
    Et si je fais une importation "manuelle" du .csv dans excel, les choses se passent relativement bien, mis à part le point à la place de la virgule qui m'embête à chaque fois.

    Cependant, selon la doc :
    https://docs.microsoft.com/fr-fr/off...inputstatement, il est dit :
    "L’instruction Line Input # lit un seul caractère à la fois jusqu’à ce qu’il rencontre un retour chariot (Chr(13)) ou un retour chariot-saut de ligne (Chr(13) + Chr(10)). Les séquences de retour chariot-saut de ligne sont ignorées au lieu d’être ajoutées à la chaîne de caractères."

    Et donc, je pense que si tu dis vrai, celà ne devrait pas poser de problème à l adétection de la fin de chaque ligne. (A moins que je n'ai mal compris quelque chose...)

  6. #6
    Membre Expert Avatar de Thumb down
    Homme Profil pro
    Retraité
    Inscrit en
    Juin 2019
    Messages
    1 560
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juin 2019
    Messages : 1 560
    Par défaut
    Tu fais une confusion ! Si tu exportes un fichier avec des retours lignes à l'intérieur même d'une cellule, Excel ouvrira le csv dans une autres cellule a la ligne.

    C'est simple fais ça.
    MsgBox replace(replace(texte,Chr(13),"###"),Chr(10),"€€€")

  7. #7
    Expert confirmé Avatar de Patrice740
    Homme Profil pro
    Retraité
    Inscrit en
    Mars 2007
    Messages
    2 475
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mars 2007
    Messages : 2 475
    Par défaut
    Bonjour,

    La lecture ligne à ligne n'est pas une bonne méthode car selon l'origine :
    - les lignes sont séparées par Cr, Lf ou CrLf.
    - un saut de ligne à l’intérieur d'un champs texte peut aussi être représenté par Cr, Lf ou CrLf et c'est pas toujours le même que celui de la ligne.
    Il est préférable de :
    - lire la totalité du fichier,
    - harmoniser ces séparateurs avec REPLACE(REPLACE(t,CrLf,Lf),Cr,Lf)
    - splitter le texte sur le séparateur Lf
    - reconstituer les lignes dont un ou plusieurs champs qui contiennent Lf (d'après les séparateurs textes)
    puis traiter de la même façon le séparateur de valeur et celui de texte.

    Les csv, c'est jamais simple !

  8. #8
    Membre confirmé
    Homme Profil pro
    Responsable de compte
    Inscrit en
    Juin 2014
    Messages
    219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable de compte

    Informations forums :
    Inscription : Juin 2014
    Messages : 219
    Par défaut
    Arf !

    N'y aurait il donc pas un tuto bien détaillé avec les bonnes pratiques de ce que je souhaite faire ?

    Je débute et suis dans l'incapacité de mettre directement en pratique tous ces conseils.

  9. #9
    Membre confirmé
    Homme Profil pro
    Responsable de compte
    Inscrit en
    Juin 2014
    Messages
    219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable de compte

    Informations forums :
    Inscription : Juin 2014
    Messages : 219
    Par défaut
    Citation Envoyé par Thumb down Voir le message
    Tu fais une confusion ! Si tu exportes un fichier avec des retours lignes à l'intérieur même d'une cellule, Excel ouvrira le csv dans une autres cellule a la ligne.

    C'est simple fais ça.
    MsgBox replace(replace(texte,Chr(13),"###"),Chr(10),"€€€")
    Apparement, je n'ai que des "€€€".

    Citation Envoyé par Patrice740 Voir le message
    Bonjour,

    La lecture ligne à ligne n'est pas une bonne méthode car selon l'origine :
    - les lignes sont séparées par Cr, Lf ou CrLf.
    - un saut de ligne à l’intérieur d'un champs texte peut aussi être représenté par Cr, Lf ou CrLf et c'est pas toujours le même que celui de la ligne.
    Il est préférable de :
    - lire la totalité du fichier,
    - harmoniser ces séparateurs avec REPLACE(REPLACE(t,CrLf,Lf),Cr,Lf)
    - splitter le texte sur le séparateur Lf
    - reconstituer les lignes dont un ou plusieurs champs qui contiennent Lf (d'après les séparateurs textes)
    puis traiter de la même façon le séparateur de valeur et celui de texte.

    Les csv, c'est jamais simple !
    Je ne comprends pas à partir de :
    "- reconstituer les lignes dont un ou plusieurs champs qui contiennent Lf (d'après les séparateurs textes)
    puis traiter de la même façon le séparateur de valeur et celui de texte."

  10. #10
    Expert confirmé Avatar de Patrice740
    Homme Profil pro
    Retraité
    Inscrit en
    Mars 2007
    Messages
    2 475
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mars 2007
    Messages : 2 475
    Par défaut
    Citation Envoyé par hary66 Voir le message
    Je ne comprends pas à partir de :
    "- reconstituer les lignes dont un ou plusieurs champs qui contiennent Lf (d'après les séparateurs textes)
    puis traiter de la même façon le séparateur de valeur et celui de texte."
    Après l'harmonisation des retours à la ligne, dans le fichier entier, chaque ligne entière est séparée de la suivante par un séparateur de ligne (Lf). Cependant certaines valeurs (cellules) peuvent contenir du texte avec un ou des retours à la ligne dans ce texte (Lf). Lorsque tu va "splitter" le fichier entier sur les retours à la ligne (Lf) pour séparer les différentes lignes, les lignes qui contiennent ces valeurs pré-citées vont être coupées en deux (ou plus si il y a plusieurs LF dans le texte de la valeur).
    C'est aussi ce qui se passe lorsque tu effectues une lecture ligne à ligne du fichier.
    Avant tout traitement ultérieur, il faut donc reconstituer les lignes entières. C'est grâce aux séparateurs de texte (") qu'on peut identifier ces valeurs et effectuer leur reconstitution.

    Ensuite dans une ligne entière, chaque valeur est séparée par un séparateur de valeurs (virgule ou point-virgule selon le cas). Comme précédemment, certaines valeurs peuvent contenir du texte avec une virgule (ou un point-virgule). Lorsqu'on va "splitter" sur la virgule (ou le point-virgule) ces valeurs pré-citées vont être coupées en deux (ou plus). Il faut aussi les reconstituer.

    Dans les 2 cas (ligne ou valeur), un écueil supplémentaire apparaît lorsque le texte d'une valeur contient un séparateur de texte : pour pouvoir les distinguer des séparateurs de début et de fin de texte, les séparateurs qui se trouvent dans le texte d'une valeur sont doublés ("" à l'enregistrement). Quand on lit un csv, il faut aussi tenir compte de ce cas.

    Ce sont là les principes de base de la lecture d'un csv. De plus, dans certains cas, les caractères sont encodés de façon spécifique (Ascii, Utf-8, Unicode, Utf-16BE, ...)
    Et tout ça, pour un seul pays : lire un csv n'est jamais simple.

    Lorsque les fichiers proviennent de pays étrangers, viennent se greffer des difficultés supplémentaires de traduction des nombres (séparateur décimal = point ou virgule, séparateur de milliers différents) et des dates (différents formats).

Discussions similaires

  1. multi line input text
    Par toraus dans le forum JSF
    Réponses: 2
    Dernier message: 20/04/2009, 10h18
  2. [HTML] input type text et Focus
    Par Stessy dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 21/06/2005, 14h06
  3. Affecter une valeur à un input type text
    Par mr.t dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 01/06/2005, 15h18
  4. redimentionner la hauteur d'une input type="text"
    Par GroRelou dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 13/04/2005, 10h32
  5. input type text limiter?
    Par philippejuju dans le forum Balisage (X)HTML et validation W3C
    Réponses: 3
    Dernier message: 11/03/2005, 09h21

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