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 :

Optimiser la lecture du nombre de lignes et colonnes d'un fichier texte


Sujet :

Macros et VBA Excel

  1. #21
    Membre émérite
    Inscrit en
    Octobre 2010
    Messages
    1 401
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 1 401
    Points : 2 684
    Points
    2 684
    Par défaut
    Bonjour GoFio

    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
    Sub total_lignes()
     
    f = "C:\Documents and Settings\client\Mes documents\Downloads\exemple.txt"
     
    Open f For Input As 1
     
    While Not EOF(1)
    Line Input #1, a
     ligne = ligne + 1
    Wend
     
    Close
     
    MsgBox ligne & " lignes"
     
    End Sub
    Cordialement

    Docmarti.

  2. #22
    Expert éminent sénior
    Homme Profil pro
    aucune
    Inscrit en
    Septembre 2011
    Messages
    8 203
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Septembre 2011
    Messages : 8 203
    Points : 14 354
    Points
    14 354
    Par défaut
    Bonjour Gérard,

    La solution de Patrick a l'avantage de lire d'un coup le fichier texte dans une variable. Tout se passe ensuite en mémoire.
    Cordialement.

    Daniel

    La plus perdue de toutes les journées est celle où l'on n'a pas ri. Chamfort

  3. #23
    Expert éminent sénior
    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
    Points : 18 677
    Points
    18 677
    Par défaut
    Citation Envoyé par Marc-L Voir le message
    la méthode la plus rapide est la lecture de l'intégralité du fichier texte en une seule fois dans une variable tableau,
    et VBA étant déjà bien outillé, FSO pas nécessaire.
    Création d'une variable tableau en pur VBA - sans FSO donc - en une unique lecture globale des lignes d'un fichier texte
    puis création d'une seconde variable tableau à partir de la première en lignes / colonnes (espaces comme séparateurs)
    et enfin visualisation des données à partir de A1 :
    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
    Sub Demo()
        Open "D:\Tests\GoFio exemple .txt" For Input As #1
        TL = Split(Input(LOF(1), #1), vbNewLine):  Close
        U& = UBound(TL) + 1:  ReDim LC!(1 To U, 1 To 1)
     
        For L& = 1 To U
            SP = Split(Application.Trim(TL(L - 1)))
            If UBound(LC, 2) < UBound(SP) + 1 Then ReDim Preserve LC(1 To U, 1 To UBound(SP) + 1)
            For C& = 0 To UBound(SP):  LC(L, C + 1) = CSng(Val(SP(C))):  Next
        Next
     
        [A1].Resize(U, UBound(LC, 2)).Value = LC
        MsgBox "Tableau LC de " & U & " lignes par " & UBound(LC, 2) & " colonnes …"
        End
    End Sub

    Avec une variable tableau comme LC, c'est facile de traiter les données d'une ou plusieurs colonnes …

    __________________________________________________________________________________________

    Merci de cliquer sur pour chaque message ayant aidé puis sur pour clore cette discussion …
    C'est parce que la vitesse de la lumière est plus rapide que celle du son que tant de gens paressent brillants avant d'avoir l'air con ! (Thomas Boishardy)

  4. #24
    Membre émérite
    Inscrit en
    Octobre 2010
    Messages
    1 401
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 1 401
    Points : 2 684
    Points
    2 684
    Par défaut
    Bonjour Daniel

    Je ne partage pas cet avis et j'explique pourquoi :

    Citation Envoyé par Daniel.C Voir le message
    Il est beaucoup plus rapide de lire une variable en mémoire que de lire un fichier.
    Lire un fichier ligne par ligne avec Line Input et traiter cette ligne en la mettant en mémoire dans un petit tableau, est étonnamment rapide et prend le même temps que de mettre le fichier complet en mémoire pour ensuite le traiter. (testé avec un fichier de 30,000 lignes et 7 colonnes, il faut autour de 0.18 secondes)

    Mais quand le fichier contient 300,000 lignes, je constate sur mon PC un ralentissement notable dans le traitement d'un gros tableau, probablement causé par l'obligation de recourir à la mémoire virtuelle qui est plus lente que la mémoire vive.

    Résultat de tests:

    Pour un fichier texte de 300,000 lignes et 7 colonnes

    1,53 secondes (Lire chaque ligne et la mettre en mémoire dans le même petit tableau)
    1,58 secondes si en plus il y a un traitement des données

    1,96 secondes (Mettre tout en mémoire dans un gros tableau )
    2,92 secondes si en plus il y a un traitement des données
    Cordialement

    Docmarti.

  5. #25
    Expert éminent sénior
    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
    Points : 18 677
    Points
    18 677
    Par défaut
    Il était un peu tard hier soir et j'ai oublié de vérifier les données renvoyées …

    Démonstration bis suivie d'une explication de texte pour GoFio :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Sub DemoBis()
        Open "D:\Tests\GoFio exemple .txt" For Input As #1
        TL = Split(Input(LOF(1), #1), vbNewLine):  Close
        ReDim LC#(UBound(TL), UBound(Split(TL(0), "   ")))
     
        For L& = 0 To UBound(TL)
            SP = Split(TL(L), "   ")
            For C& = 0 To UBound(SP):  LC(L, C) = Val(SP(C)):  Next
        Next
     
        [A1].Resize(UBound(LC) + 1, UBound(LC, 2) + 1).Value = LC
        MsgBox "Tableau LC de " & UBound(LC) + 1 & " lignes de " & UBound(LC, 2) + 1 & " colonnes …"
        End
    End Sub
    • Lignes n°2 & 3 : l'importation globale en une lecture unique des lignes du fichier texte ne change pas …

    • Ligne n°4 : l'objet de cette version bis, le type de données de la variable tableau LC !

    En fait c'est suite à la lecture du code de GoFio que j'ai déclaré dans la démo initiale le tableau en Single.
    Mais ce type de variable altère trop les décimales des données du fichier; afin d'en conserver l'exactitude,
    il faut évidemment déclarer le tableau en Double

    De plus, contrairement à la version initiale dont le premier indice commence à 1, dans celle-ci il débute à zéro
    comme le tableau renvoyée par la fonction Split, cela peut être plus simple à gérer, bref les goûts et les couleurs,
    il y a donc les deux manières entre chaque démo …

    Dans la démo initiale, la ligne n°8 vérifiait le nombre de colonnes du tableau vis à vis de celui de la ligne,
    utile pour un fichier texte à colonnes variables selon les lignes.
    Dans cette seconde version, vu que le fichier joint comporte toujours le même nombre de colonnes,
    cette ligne n°4 déclare une fois pour toute le tableau, plus besoin de vérifier ensuite, plus rapide pour les gros fichiers …

    • Ligne n°7 : à cause du nombre d'espaces variant entre les données du fichier (4 la première fois, 3 ensuite),
    j'ai utilisé dans la précédente version la fonction de feuille de calcul SUPPRESPACE n'en conservant
    qu'un seul entre les données, séparateur par défaut de la fonction Split
    Choisir comme séparateur le nombre d'espaces minimum pouvant laisser un espace en début de chaîne
    ne gêne pas pour la conversion numérique et c'est peut être plus rapide pour les gros fichiers, bien vu Patrick !

    Comme l'indice du tableau commence à zéro - initialisation en ligne n°6 - comme le tableau renvoyé par Split,
    il n'y a plus besoin de retirer un à la variable L

    • Ligne n°8 : la conversion explicite du type de données n'est pas obligatoire comme dans la fonction CSng
    de la ligne n°9 de la version initiale, peut-être une fois encore serait-ce plus rapide sans …

    • Lignes n°11-12 : il est nécessaire d'ajouter 1 aux dimensions du tableau pour obtenir le nombre de lignes et de colonnes …


    @ l'ami canadien Docmarti :

    pas étonnant que ce soit plus lent via FSO !
    Récemment une recherche de fichiers sur un disque dur avait besoin de 2 minutes 15 secondes et moins de 20 secondes sans !

    Mais as-tu déjà essayé comme les lignes n°2 & 3 de mon code ? Tabernacle !
    C'est parce que la vitesse de la lumière est plus rapide que celle du son que tant de gens paressent brillants avant d'avoir l'air con ! (Thomas Boishardy)

  6. #26
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 379
    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 379
    Points : 12 075
    Points
    12 075
    Billets dans le blog
    8
    Par défaut une autre solution
    Bonjour
    comme je m'ennuie je viens un peu taquiner MarcL
    démo pour démo
    moi je ferait comme ca
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Sub demo_de_moi()
      'Activation de Microsoft forms 2.0 OBJECT library necessaire
       Open "C:\Users\le sauveur\Desktop\exemple.txt" For Input As #1 'adapte ton chemin de fichier
       TEXTE = Replace("<TABLE><TBODY><TR><TD>" & Replace(Input(LOF(1), #1), vbCrLf, "</TR>" & vbCrLf & "<TR><TD>") & "</TR></TBODY></TABLE>", "   ", "</TD><TD>")
       Set TABLEAU = New MSForms.DataObject
               TABLEAU.SetText TEXTE: TABLEAU.PutInClipboard
            [A1].Select: Sheets(1).Paste
    Close
    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. #27
    Membre émérite
    Inscrit en
    Octobre 2010
    Messages
    1 401
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 1 401
    Points : 2 684
    Points
    2 684
    Par défaut
    Bonjour Marc

    Je constate que tu connais très bien le Québécois.

    Citation Envoyé par Marc-L Voir le message

    pas étonnant que ce soit plus lent via FSO !
    ...
    Mais as-tu déjà essayé comme les lignes n°2 & 3 de mon code ? Tabernacle ! [/INDENT]
    Bien sûr que j'ai fait des tests avec les lignes 2 et 3 de ton code.
    Voir dans le classeur joint.

    Les résultats sont probants : Effectuer 327,000 Line Input est plus rapide que d'effectuer un seul Input qui met tout le fichier en mémoire dans un tableau.
    Fichiers attachés Fichiers attachés
    Cordialement

    Docmarti.

  8. #28
    Expert éminent sénior
    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
    Points : 18 677
    Points
    18 677
    Par défaut

    Passer par une table HTML via le Presse-papier, Patrick tu fais fort !
    Tu risques de donner mal à la tête à certains et faire grimper les actions des cachets de paracétamol ‼

    Merci Docmarti. Je n'ai jamais constaté de ralentissement mais c'est vrai sans dépasser les 100 000 lignes …
    C'est parce que la vitesse de la lumière est plus rapide que celle du son que tant de gens paressent brillants avant d'avoir l'air con ! (Thomas Boishardy)

  9. #29
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 379
    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 379
    Points : 12 075
    Points
    12 075
    Billets dans le blog
    8
    Par défaut re
    Bonjour Marcl
    Passer par une table HTML via le Presse-papier, Patrick tu fais fort !
    Tu risques de donner mal à la tête à certains et faire grimper les actions des cachets de paracétamol ‼
    Ma fois plus rapide que ca : tu rate une marche

    tu fait tout d'un coup la moi le paracétamol me fait rien y a que l'ibuprofène qui me fait du bien
    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

  10. #30
    Membre régulier
    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
    Points : 96
    Points
    96
    Par défaut
    Bonjour,

    Merci pour a réponse Patrick
    Je suis en train de tester ta proposition et j'ai quelques petits soucis.
    J'ai mis Option Explicit en dbut de module, donc je dois déclarer toutes mes variables

    J'ai déclaré
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dim texte_complet as Variant
    Je ne suis pas sur que cela soit la plus adapté


    Ensuite il bloque sur cette ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    For i = LBound(nbligne) To UBound(nbligne)
    Et me dit "Tableau Attendu"
    J'ai essayé de déclarer i comme un tableau, mais le problème reste le même.
    En mettant un point d'arrêt en début de Sub, le message est déjà affiché, donc je ne rentre même pas dans la Sub.

    Auriez vous une explication?
    Merci

  11. #31
    Expert éminent sénior
    Homme Profil pro
    aucune
    Inscrit en
    Septembre 2011
    Messages
    8 203
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Septembre 2011
    Messages : 8 203
    Points : 14 354
    Points
    14 354
    Par défaut
    Bonjour,

    Peut-être est-ce que tu ne sais pas comment obtenir l'aide VBA. Tu cliques sur un mot VBA, "LBound" ou "UBound" par exemple et tu appuies sur la touche "F1". Tu vas comprendre que tu dois remplacer "nbligne" par une variable représentant un tableau (ou une expression renvoyant un tableau). Note que, personnellement, je ne mets "Option Explicit" que lorsque mon code est testé, je peux plus facilement modifier l'usage des variables; mais là, chacun fait comme il veut.
    Cordialement.

    Daniel

    La plus perdue de toutes les journées est celle où l'on n'a pas ri. Chamfort

  12. #32
    Membre régulier
    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
    Points : 96
    Points
    96
    Par défaut
    Je n'avais pas remarqué la 2ème page, du coup mon précédent message était par rapport à la réponse de patrick de la page 1

    Je viens de lire toute la page 2. Merci pour toutes vos réponses !!
    Par contre mon niveau de VBA n'étant pas excellent, j'ai un peu de mal à vous suivre malgré les cachets de paracétamol

    J'aime bien utiliser Option Explict et déclarer toutes mes variables, c'est en tout cas ce qu'on m'avait conseillé pour éviter des erreurs. Comme vous ne déclarer pas vos variables, j'ai du mal à faire la différence entre variables et fonction propre à vba.

    Je suis en train de traiter la versoin de patrick de la première page, si je teste une version à chacun de vos postes je risques de de m'y perdre.
    Mon objectif est de faire en sorte qu'elle fonctionne, ensuite j'aimerais tester la tienne Marc-L

    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
        'Déclaration des variables
        Dim i As Long, j As Integer, Nbzone As Long, Nblignes As Long
        Dim nbligne() As Long
        Dim temps As Double, Pastps As Double, tps As Double, temp As Double
        Dim Ptps As String
        Dim fso As Object, F As Object
        Dim texte_complet As Variant
        Dim h As Long, nbcolonnes  As Long
     
        ' Lit le contenu d'un fichier dans une variable
        Const ForReading = 1, ForWriting = 2, ForAppending = 8
        Set fso = CreateObject("Scripting.FileSystemObject")
        Set F = fso.OpenTextFile(x, 1) 'chemin complet du fichier a adapter
        texte_complet = F.ReadAll
        nbligne() = Split(texte_complet, vbCrLf)
        Nblignes = UBound(nbligne)
        MsgBox Nblignes
        For h = LBound(nbligne) To UBound(nbligne)
        nbcolonnes = UBound(Split(nbligne(h), "   "))
        MsgBox "ligne  " & h + 1 & "  contient " & nbcolonnes + 1 & vbCrLf & "***************************************" & _
         vbCrLf & " les voici " & vbCrLf & "le 2 eme  " & Split(nbligne(h), "   ")(1) & vbCrLf & _
         "le 4 eme  " & Split(nbligne(h), "   ")(3) & vbCrLf & _
         "le 5 eme  " & Split(nbligne(h), "   ")(4)
        Next
     
        'création du tableau en fonction du nombre de lignes et de zones
        ReDim Tableau_Extraction_Temperature(1 To Nblignes, 0 To Nbzone) As Single
     
        'On ferme le fichier
        F.Close
    Par rapport à ton code Patrick, j'ai essayé de faire les déclarations nécessaire.
    J'arrive à une incompatibilité de type su cette ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    nbligne() = Split(texte_complet, vbCrLf)
    Je pense que le problème vient de la déclaration de texte-complet, mais comme je ne savais pas comment le déclaré, je l'ai mis en Variant.
    Ensuite j'ai rajouté cette ligne car cela buggait au niveau de la redimension du tableau
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      Nblignes = UBound(nbligne)
    Dans cette seconde version, vu que le fichier joint comporte toujours le même nombre de colonnes,
    Mon fichier joint est un exemple, le nombre de colones peut varier d'un fichier texte à l'autre.

    En tout cas merci pour vos réponses!
    Je préfererais avoir quelquechose d'un peu plus lent mais que je comprenne et que je puisse l'expliquer à quelqu'un, que quelquechose de très rapide dont je ne pige rien

  13. #33
    Expert éminent sénior
    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
    Points : 18 677
    Points
    18 677
    Par défaut

    Tu n'as pas bien compris le sens de ma phrase concernant le nombre fixe de colonnes,
    peu importe qu'un coup ce soit sept puis la suivante cinq ! Ce qui compte,
    c'est de savoir si au sein d'un fichier le nombre de colonnes est fixe (version 2) ou varie (version 1) …

    Quant à la déclaration des variables pour ma démo, soit retirer Option Explicit
    car mes variables sont déjà déclarées à la volée dans le code (sauf les Variant évidemment),
    soit lancer la compilation et pour chaque erreur de variable non définie,
    ajouter la variable telle que surlignée dans un Dim en début de procédure … (ex.: TL, L&)
    C'est parce que la vitesse de la lumière est plus rapide que celle du son que tant de gens paressent brillants avant d'avoir l'air con ! (Thomas Boishardy)

  14. #34
    Membre régulier
    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
    Points : 96
    Points
    96
    Par défaut
    Bonjour,

    Je suis partis sur ton code Marc-L et il fonctionne ! Merci !
    Pour ne pas à avoir à déclarer les variables j'ai mis la sub dans un autre module.
    Car les variables du types L&, pourquoi le "&" ?

    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
    Sub bis(x As String)
     
        Open x For Input As #1
        TL = Split(Input(LOF(1), #1), vbNewLine):  Close
        ReDim LC#(UBound(TL), UBound(Split(TL(0), "   ")))
     
        For l& = 0 To UBound(TL)
            SP = Split(TL(l), "   ")
            For C& = 0 To UBound(SP):  LC(l, C) = Val(SP(C)):  Next
        Next
     
        Worksheets("RésultatsBrut").Activate
        [A1].Resize(UBound(LC) + 1, UBound(LC, 2) + 1).Value = LC
        MsgBox "Tableau LC de " & UBound(LC) + 1 & " lignes de " & UBound(LC, 2) + 1 & " zones"
        End
     
    End Sub
    Le résultats obtenu pour le fichier exemple est 3 lignes et 7 colonnes or j'aurais aimé qu'il renvoie 3 lignes et 3 colonnes.

    Pour ça j'ai juste à changer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MsgBox "Tableau LC de " & UBound(LC) + 1 & " lignes de " & UBound(LC, 2) + 1 & " zones"
    Par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MsgBox "Tableau LC de " & UBound(LC) + 1 & " lignes de " & UBound(LC, 2)  / 2 & " zones"
    C'est cette ligne là qui permet de sauter les caractères?

    Parce que j'aimerais si possible que le tableau final dans excel ne contienne seulement la 1ere (le temps), la 2ème, 4ème, 6ème lignes (les températures)


    Ensuite j'avais ce code qui permettait de remplir en mémoire un tableau avec dans la première colonne les temps et ensuites les colones suivantes les températures.

    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
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    Set src = fs.OpenTextFile(x, 1)
     
            'on boucle sur les lignes
            For i = 1 To UBound(Tableau_Extraction_Temperature, 1) - 1
     
                'on rempli manuellement la 1ère colonne du tableau avec les temps
                j = 0
                'on saute les 2ers caractères qui correspondent à des blancs
                src.Skip (2)
                'on lit les 18 prochains caractères qui correnspondent aux T°
                Ptps = src.read(18)
                'on remplace les points par des virgules
                Ptps = Replace(Ptps, ".", ",")
                'on transforme la chaine de caractère en réel et on ajoute le temps de la séquence précédente
                Pastps = CDbl(Ptps) + tps
     
                'on introduit la colonne temps dans la 1ere colonne du tableau
                Tableau_Extraction_Temperature(i, 0) = Pastps
     
     
                'on saute 2 caractères pour arriver à la lecture des températures
                src.Skip (2)
     
                For j = 1 To Nbzone
                    'on saute le 1er caractère qui est un blanc
                    src.Skip (1)
     
                    'on fait un test sur le caractère d'après pour savoir si c'est un "-" ou un blanc
                    If src.read(1) = " " Then 'si c'est un blanc on saute ce caractère
                        'src.Skip (1)
                        'on arrondie les T° à 2entiers
                        temp = Round(Val(src.read(18)), 2)
                        'on rempli le tableau avec les T°
                        Tableau_Extraction_Temperature(i, j) = temp
                        'on saute les 22 prochains caractères qui correspondent à la colonne humidité
                        src.Skip (22)
                        'quand on arrive à la dernière colonne on passe à la ligne
                        If j = Nbzone Then
                        src.skipline
                        End If
                    Else
                        'on arrondie les T° à 2entiers
                        temp = Round(Val(src.read(18)), 2)
                        temp = -temp
                        'on rempli le tableau avec les T°
                        Tableau_Extraction_Temperature(i, j) = temp
                        'on saute les 22 prochains caractères qui correspondent à la colonne humidité
                        src.Skip (22)
                        'quand on arrive à la dernière colonne on passe à la ligne
                        If j = Nbzone Then
                        src.skipline
                        End If
                    End If
                Next j
          Next i
     
    'on donne à la variable tps le dernier temps de la séquence pour commencer la 2eme séquence avec le temps final de la précédente
    tps = Pastps
     
    'on ferme le fichier
    src.Close
    Mais il a déjà été remplie ce tableau en fait avec ton programme?


    Cordialement

  15. #35
    Expert éminent sénior
    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
    Points : 18 677
    Points
    18 677
    Par défaut

    Pour L& par exemple, consulter l'aide de Long … Mais comme déjà indiqué, tu peux le déclarer tel quel

    Le résultats obtenu pour le fichier exemple est 3 lignes et 7 colonnes or j'aurais aimé qu'il renvoie 3 lignes et 3 colonnes.
    Parce que j'aimerais si possible que le tableau final dans excel ne contienne seulement
    la 1ère (le temps), la 2ème, 4ème, 6ème lignes (les températures)
    A partir d'un fichier texte de 3 lignes de 7 colonnes dont tu ne veux que 3 lignes et 3 colonnes,
    et ensuite il est question de la « 1ère, 2ème, 4ème, 6ème lignes », je ne vois pas comment !

    Sans explication claire & exhaustive ni un fichier joint correct … T'as même droit au schéma !

    __________________________________________________________________________________________
    If you can’t explain it simply, you don’t understand it well enough … (Albert Einstein)
    C'est parce que la vitesse de la lumière est plus rapide que celle du son que tant de gens paressent brillants avant d'avoir l'air con ! (Thomas Boishardy)

  16. #36
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 379
    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 379
    Points : 12 075
    Points
    12 075
    Billets dans le blog
    8
    Par défaut re
    Bonjour Marc
    toi et moi on ne doit pas parler Français
    on en est a la 2 eme page sur ce sujet
    il pose encore la même question le 1,2 3 4 6 eme colonne
    et pourtant on lui a montrer plusieurs fois comment faire avec les splits
    moi je crois qu'il attend un code tout fait
    mais c'est pas le genre de la maison je crois
    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

  17. #37
    Expert éminent sénior
    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
    Points : 18 677
    Points
    18 677
    Par défaut

    Salut Patrick !

    Ce n'est pas le genre de la maison effectivement …
    En présence d'un code présenté en rapport avec une problématique bien exposée, je peux aider …

    J'ai lu « lignes » dans son dernier message mais effectivement s'il s'agit de colonnes !
    Comme je ne voyais pas où il veut en venir, j'ai donc proposé une lecture intégrale dans une variable tableau
    sur laquelle il peut en créer une autre selon ses besoins …

    Autre méthode, ne lire qu'une seule ligne à la fois pour ne conserver que le nécessaire …

    Je me demande même en fait si Igloobel n'a pas tapé dans le mille !
    C'est parce que la vitesse de la lumière est plus rapide que celle du son que tant de gens paressent brillants avant d'avoir l'air con ! (Thomas Boishardy)

  18. #38
    Membre régulier
    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
    Points : 96
    Points
    96
    Par défaut
    J'ai voulu tester sur un plus gros fichier et j'ai eu une erreur d'exécution '14' sur cette ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TL = Split(Input(LOF(1), #1), vbNewLine):  Close
    Avec un espace de chaîne insuffisant.

    En fait je teste sur un dossier et il va exécuter le code sur tous les fichiers resultats.txt

    A partir d'un fichier texte de 3 lignes de 7 colonnes dont tu ne veux que 3 lignes et 3 colonnes,
    et ensuite il est question de la « 1ère, 2ème, 4ème, 6ème lignes », je ne vois pas comment !

    Sans explication claire & exhaustive ni un fichier joint correct … T'as même droit au schéma !
    Je vais essayer de reprendre depuis le début.
    Un logiciel de calcul genere un fichier de résultats du même type que le fichier que j'ai joint.
    Dans se fichier texte je n'ai pas besoin de toutes les données.

    Exemple explicite avec le fichier joint.
    On prend un batiments avec 3 pièces. Pour chaque pièce le logiciel nous a calculé la température et la pression en fonction du temps. Donc dans mon fichier texte j'aurais :
    1ère serie de caractères : le temps
    2ème serie de caractères : la température (de la pièce 1)
    3ème serie de caractères : la pression (de la pièce 1)
    4ème serie de caractères : la température (de la pièce 2)
    5ème serie de caractères : la pression (de la pièce 2)
    6ème serie de caractères : la température (de la pièce 3)
    7ème serie de caractères : la pression (de la pièce 3)

    Je souhaite connaitre le nombre de pièces (nombre de zones) et le nombre d'itérations de temps (nombre de lignes)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MsgBox "Tableau LC de " & UBound(LC) + 1 & " lignes de " & UBound(LC, 2) /2 & " zones
    Cette ligne va bien me renvoyer 3lignes et 3zones

    Ensuite je souhaites extraire les données qui m'interesse et les remplir dans un tableau en mémoire.
    Ce qui m'interesse se sont les temps et les températures (pas les pressions).

    Je pense donc avoir besoin de mon nombres de lignes et zones afin de remplir mon tableau.
    ReDim Tableau_Extraction_Temperature(1 To Nbligne, 0 To Nbzone) As Single
    For i = 1 to Nblignes
    For j = 0 to Nbzone
    Tableau_Extraction_Temperature(i,j)= "la valeur du fichier texte"
    Next
    Next


    Avec l'exemple le tableau aura 3 lignes (chaque itérations) et 4 colonnes (1 pour le temps, 3 de températures)

    D'ou l'extraction de :
    « 1ère, 2ème, 4ème, 6ème lignes colonnes»
    Je m'embrouille moi même, car j'avais confondus lignes et zones


    J'espère ne pas avoir été trop broullion, si il y a des choses pas assez explicit, dis moi

    Cordialement


    EDIT :
    Je préfererais avoir quelquechose d'un peu plus lent mais que je comprenne et que je puisse l'expliquer à quelqu'un, que quelquechose de très rapide dont je ne pige rien
    Non je préfererais pas avoir quelquechose de tout fait. Mon but est de comprendre, pour réutiliser et transmettre ce que vous me conseiller. C'est juste que je suis encore débutant en VBA. Donc plus ce que vous me proposer est compliqué pour moi plus effectivement la solution à besoin d'être toute faite.
    Mais ce n'est pas avec une solution toute faite que je vais progresser.
    En tout cas, merci de vos aides !

  19. #39
    Expert éminent sénior
    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
    Points : 18 677
    Points
    18 677
    Par défaut

    C'est mieux !

    • Le fichier texte peut contenir jusqu'à 50 000 lignes ou encore bien plus ?

    • Le tableau en mémoire, t'en ferais quoi ensuite ?

    Car selon la destination, j'entrevois même une solution sans variable tableau
    en tenant compte du commentaire de Docmarti quant aux performances de lecture …

    __________________________________________________________________________________________
    Question bien formulée, solution assurée ! (Robert Durupt)


    Etant débutant en VBA, conserver alors Option Explicit

    En restant sur la base d'un tableau (même si je doute si c'est la meilleure solution selon la destination) :

    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
    Sub DemoTableau()
        Dim C&, L&, NC&, SP, T&, TL
     
        Open "D:\Tests\GoFio exemple .txt" For Input As #1
        TL = Split(Input(LOF(1), #1), vbNewLine):  Close
        NC = UBound(Split(TL(0), "   ")):  If NC And 1 Then Beep: End
        ReDim LC#(1 To UBound(TL) + 1, 1 To 1 + NC / 2):  NC = NC - 1
     
        For L = 1 To UBound(LC)
            SP = Split(TL(L - 1), "   "):  C = 1:  LC(L, C) = Val(SP(0))
            For T = 1 To NC Step 2:    C = C + 1:  LC(L, C) = Val(SP(T)):  Next
        Next
     
        Erase TL
        [A1].Resize(UBound(LC), UBound(LC, 2)).Value = LC
        MsgBox "Tableau LC de " & UBound(LC) & " lignes de " & UBound(LC, 2) & " colonnes …"
        End
    End Sub
    _______________ ____________________________________ ______________________________

    Merci de cliquer sur pour chaque message ayant aidé puis sur pour clore cette discussion
    C'est parce que la vitesse de la lumière est plus rapide que celle du son que tant de gens paressent brillants avant d'avoir l'air con ! (Thomas Boishardy)

  20. #40
    Membre régulier
    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
    Points : 96
    Points
    96
    Par défaut
    Le fichier texte peut contenir jusqu'à 50 000 lignes ou encore bien plus ?
    Oui, je viens de tester un fichier qui fait un peu plus de 51 000 lignes et mon code actuelle mais environ 45 secondes pour ressortir le nombre de lignes et zones (sans le remplissage du tableau)

    Le tableau en mémoire, t'en ferais quoi ensuite ?
    Le tableau, je souhaite le garder en mémoire. Car une fois les données voulues extraites, il y a déjà des sub qui permettent le calcul du T max entre autres. L'utilisateur en cependant la possibilité d'afficher le tableau de données extraites sur une page Excel

    Du coup avec mon petit niveau de vba, c'est comme pour une langue étrangère. Dès fois tu compends 80 ou 90% des mots, mais les 10% quireste t'empêche de comprendre la phrase ^^
    C'est la première fois que je vois des # en vba, j'ai cru voir sur internet que c'était pour la déclaration en Double.
    Les ":" te permette de ne pas revenir à la ligne?

    Je reposte ton code avec ce que compris en cherchant sur l'aide.


    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
    Sub Demo(x As String)
        Dim C&, L&, NC&, SP, T&, TL
     
        Open x For Input As #1 'Ouvre le fichier
        TL = Split(Input(LOF(1), #1), vbNewLine):  Close 'Créé un tableau 1D vide du nombre de lignes du fichier texte
        NC = UBound(Split(TL(0), "   ")):  If NC And 1 Then Beep: End 'Calcul du nombre de colonnes totales // J'ai compris le if qui suit avec le bruit Beep
        ReDim LC#(1 To UBound(TL) + 1, 1 To 1 + NC / 2):  NC = NC - 1
     
        For L = 1 To UBound(LC) 'Lecture des données en ne prennan qu'une colone sur deux
            SP = Split(TL(L - 1), "   "):  C = 1:  LC(L, C) = Val(SP(0)) 'ERREUR '9' : l'indice n'appartient pas à la selection
            For T = 1 To NC Step 2:    C = C + 1:  LC(L, C) = Val(SP(T)):  Next
        Next
     
        Erase TL 'libère le tableau du nombre de ligne
        [A1].Resize(UBound(LC), UBound(LC, 2)).Value = LC 'écrit dans le classeur excel à partir de A1
        MsgBox "Tableau LC de " & UBound(LC) & " lignes de " & UBound(LC, 2) & " colonnes …" 'indique le nombre de lignes et colones, UBound(LC) équivaut à UBound(LC, 1)
        End
     
    End Sub
    J'ai supprimé l'erreur 9 en rajoutant -1
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    For L = 1 To UBound(LC) - 1

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 3 PremièrePremière 123 DernièreDernière

Discussions similaires

  1. Réponses: 1
    Dernier message: 14/03/2014, 13h35
  2. Réponses: 2
    Dernier message: 15/11/2009, 16h03
  3. Vérifier le nombres de lignes et colonnes utilisé
    Par derin dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 24/09/2008, 15h22
  4. Réponses: 4
    Dernier message: 09/07/2008, 09h43
  5. Compter le nombre de ligne où colonne(x)=colonne(y)
    Par titou2 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 17/05/2007, 19h10

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