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 :

accès sequentiel à un fichier


Sujet :

Macros et VBA Excel

  1. #1
    Membre émérite

    Homme Profil pro
    Technicien Métrologie R&D
    Inscrit en
    Janvier 2007
    Messages
    1 610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien Métrologie R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 610
    Points : 2 523
    Points
    2 523
    Billets dans le blog
    1
    Par défaut accès sequentiel à un fichier
    Bonjour
    Les besoins
    je dois récupérer un fichier de points généré par une machine de contrôle .
    L'extension est PRF (ce n'est qu'un fichier texte d'une colonne de nombre)
    Le nombre de ligne en fonction des mesures ne peut en aucun cas dépasser 120012 lignes (mais il peut les atteindre), les données s'étagent de la ligne 10 à l'antépénultième .
    j'ai dix lignes d'en-tête et le fichier se termine par
    EOR
    EOF

    Le problème :
    Pour Excel le travail sur Graphiques doit se faire sur 32000 lignes maximum
    la précision de la mesure étant soit avec un pas de 1µ ou de 0.25µ je ne veux prendre qu'une ligne sur 4 (step 4) à partir de la ligne 11 quel que soit la taille de mon fichier
    le vrai problème c'est que je ne vois pas par où commencer et est ce que je peut manipuler un tableau de 30000 données (systématiquement des entiers exprimé en nanomètres)

    Merci
    G.David

  2. #2
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 546
    Points
    15 546
    Par défaut
    Pour ouvrir ton fichier en mode séquentiel, regarde à Get, dans l'aide en ligne.
    A la place du code proposé, tu peux utiliser Step 4 dans une boucle pour ne récupérer les données toutes les 4 lignes. Un truc comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    PosDépart = 10
    For Position = PosDépart to 32000 step 4
         Get #1, Position, Ligne
    Next
    A+

  3. #3
    Membre émérite

    Homme Profil pro
    Technicien Métrologie R&D
    Inscrit en
    Janvier 2007
    Messages
    1 610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien Métrologie R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 610
    Points : 2 523
    Points
    2 523
    Billets dans le blog
    1
    Par défaut
    Merci je regarde ça

    bon j'ai regardé Get à l'aide en ligne je n'obtiens que le message Mode d'accés au fichier incorrect
    ou une série de donné vide
    Daranc

  4. #4
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 546
    Points
    15 546
    Par défaut
    Montre ton code. Tu n'aurais pas la possibilité de nous passer un petit bout de fichier afin qu'on puisse tester sur un exemple concret ?

  5. #5
    Inactif  

    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    4 555
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 4 555
    Points : 5 537
    Points
    5 537
    Par défaut
    Bonjour, Ousk,

    C'est le mode d'ouverture pour lire par Get, dont tu dois lui parler (tu ne l'as pas fait ... et il ouvre vraisemblablement en Input ...).

    A toi ...

  6. #6
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 546
    Points
    15 546
    Par défaut
    Salut ucfoutu,
    J'ai renvoyé à Get, dans l'aide en ligne, et là on en parle

  7. #7
    Membre émérite

    Homme Profil pro
    Technicien Métrologie R&D
    Inscrit en
    Janvier 2007
    Messages
    1 610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien Métrologie R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 610
    Points : 2 523
    Points
    2 523
    Billets dans le blog
    1
    Par défaut
    Salut
    à force de m'arracher les cheveux j'ai réussi deux choses
    un à récupérer mes données dans un tableau
    deux à me faire une coupe de skined
    je cale encore sur un point poser mes donnée d'un coup sur la feuille .
    Là je suis à mon domicile je vous passe le code que j'ai écris dès mon retour au taf (15h00)
    Merci
    PS le GET malgré l'impression de l'aide en ligne , je crois que j'y ai rien capté

  8. #8
    Membre émérite

    Homme Profil pro
    Technicien Métrologie R&D
    Inscrit en
    Janvier 2007
    Messages
    1 610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien Métrologie R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 610
    Points : 2 523
    Points
    2 523
    Billets dans le blog
    1
    Par défaut
    voici le code
    ca marche jusqu'au moment de poser le tableau data2 sur la feuille
    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
    Private Sub ListBox1_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
    Dim nom As String
    Dim PRF As Variant
    Dim ActiF As String
    Dim t As Long
    Dim n As Integer
    Dim DaTa() As Variant
    Dim dAtA2() As Long
    Dim y As Long
    Dim p As Long
    '** démarrage **
    Application.ScreenUpdating = False
        ActiF = ThisWorkbook.name
        nom = ThisWorkbook.Path
        PRF = ListBox1.Value
        nom = nom + "\" + PRF
    '** Ouvre l'exemple de fichier en accès aléatoire.
    Open nom For Input As #1
    Do While Not EOF(1)
    y = y + 1
    ReDim Preserve DaTa(y)
    Line Input #1, DaTa(y)
    Loop
    Close #1
    n = 0
    For p = 11 To y - 2 Step 4
    ReDim Preserve dAtA2(n)
    dAtA2(n) = CLng(DaTa(p))
    n = n + 1
    Next
    'Workbooks(ActiF).Activate
    Sheets(1).Select
    Range("b:b").ClearContents
    ThisWorkbook.Worksheets("mes").Range("b11:b" & n + 10).Value = dAtA2
    Unload Me
    Application.DisplayAlerts = True
    Application.ScreenUpdating = True
    End Sub
    merci
    Daranc

  9. #9
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 546
    Points
    15 546
    Par défaut
    As-tu un séparateur de données dans la ligne récupérée ?

  10. #10
    Membre émérite

    Homme Profil pro
    Technicien Métrologie R&D
    Inscrit en
    Janvier 2007
    Messages
    1 610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien Métrologie R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 610
    Points : 2 523
    Points
    2 523
    Billets dans le blog
    1
    Par défaut
    je ne pense pas
    les tableaux dans la fenêtre d'exécution sont corrects (enfin conforme à ce que je veux obtenir) c'est lorsque je veux poser dAtA2 sur la feuille que je n'ai que la valeur dAtA(0) qui est répéter sur toute ma plage
    Daranc

  11. #11
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 546
    Points
    15 546
    Par défaut
    Et si tu fais
    tu as quoi ?
    Déjà je mettrais plutôt (évite une variable et facilite la lecture
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    For p = 11 To Ubound(DaTa) - 2 Step 4
    Ensuite, pour remplir ta colonne, tu dois mettre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Range("b:b").ClearContents
    For p = 0 to Ubound(dAtA2)-1
         ThisWorkbook.Worksheets("mes").Range("b" & 11 + p).Value = dAtA2(p)
    Next
    Pour copier une plage, il te faudrait un range
    Tu dis
    A+

  12. #12
    Membre émérite

    Homme Profil pro
    Technicien Métrologie R&D
    Inscrit en
    Janvier 2007
    Messages
    1 610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien Métrologie R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 610
    Points : 2 523
    Points
    2 523
    Billets dans le blog
    1
    Par défaut
    le fichier zipé est un PRF il s'ouvre avec l'application Ultra contour en théorie
    (je viens de voir à la maison qu'il donne en effet une application assez exotique ) mais ce type de fichier s'ouvre également avec excel( sauf que le nombre de ligne dépasse les possibilités de mon excel 2000 .C'est pourquoi j'ai tenté l'accès séquentiel
    Tu peut l'ouvrir simplement avec le clic droit -ouvrir avec- excel - les données sont rangées dans la première colonne .c'est un fichier simple (mais trop gros)
    Je vires les premier enregistrement de data pour n'avoir dans data2 que les altitudes de mes points de contrôles .les x sont par défaut en dessous de 30mm avec un pas de 0.25µ et de 30 à 120mm avec un pas de 1µ l'amplitude maximum et de 6 ou 12 mm en fonction du palpeur
    dans tous les cas le nombres de ligne ne peut dépasser 120012
    (le dernier accès séquentiel que j'ai fait c'était sur le basic de l'Amstrad CPC)
    Daranc
    je teste au boulot dès demain

  13. #13
    Expert éminent sénior
    Avatar de kiki29
    Homme Profil pro
    ex Observeur CGG / Analyste prog.
    Inscrit en
    Juin 2006
    Messages
    6 132
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : ex Observeur CGG / Analyste prog.

    Informations forums :
    Inscription : Juin 2006
    Messages : 6 132
    Points : 11 272
    Points
    11 272
    Par défaut
    Soir Bon, je prends en cours, à adapter
    La solution proposée par ouskel'n'or plus bas est propre,pas la mienne...

  14. #14
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 546
    Points
    15 546
    Par défaut
    Ok, j'ai venu, j'ai vu, j'ai vaincu
    Tu n'as pas besoin d'ouvrir ton fichier en mode Random. C'est un peu plus long mais au bout du bout c'est plus court que de créer deux tableaux plus une boucle pour coller tes données dans la feuille de calculs.
    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 TestOuvrirTxt()
    Dim Ligne As String, Position as Double, NoLigne As Integer
    Open "D:\xls\Meniskus 05-02-08 L 15h00 90°.PRF" For Input As #1
        Do While Not EOF(1)
            Input #1, Ligne
            Position = Position + 1
            If Position > 10 Then
                If (Position - 7) Mod 4 = 0 Then
                    NoLigne = NoLigne + 1
                    Cells(NoLigne, 1) = Ligne
                End If
            End If
        Loop
    Close #1
     
    End Sub
    Tu testes et dis
    A+

    PS - Modifie le chemin de ton fichier

  15. #15
    Membre émérite

    Homme Profil pro
    Technicien Métrologie R&D
    Inscrit en
    Janvier 2007
    Messages
    1 610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien Métrologie R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 610
    Points : 2 523
    Points
    2 523
    Billets dans le blog
    1
    Par défaut
    le truc marche surement mais j'ai arrêté avant la fin après 32 minutes de moulinage .J'essayes de poser le tableau en un seul coup pour eviter ce problème de durée lié aux boucles .la conception des tableaux me prends environ 5 secondes (large) pour un fichier de 70000 lignes par contre l'ecriture sur la feuille n'en fini pas .
    kiki 29Le fichier marche trés bien mais je n'arrive pas à l'adapter j'ai un objet qui semble manquer : shData
    à propos je travail depuis un userform
    daranc

  16. #16
    Expert éminent sénior
    Avatar de kiki29
    Homme Profil pro
    ex Observeur CGG / Analyste prog.
    Inscrit en
    Juin 2006
    Messages
    6 132
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : ex Observeur CGG / Analyste prog.

    Informations forums :
    Inscription : Juin 2006
    Messages : 6 132
    Points : 11 272
    Points
    11 272
    Par défaut
    Jour bon, c'est curieux en adaptant la solution d'ouskel'n'or sur un fichier bidon de 120000 lignes : moins de 3s.Donc le probleme est ailleurs dans ton programme, même s'il tourne sur un serveur il ne prendrait pas tout ce temps

  17. #17
    Membre émérite

    Homme Profil pro
    Technicien Métrologie R&D
    Inscrit en
    Janvier 2007
    Messages
    1 610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien Métrologie R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 610
    Points : 2 523
    Points
    2 523
    Billets dans le blog
    1
    Par défaut
    Aprés plusieurs tentatives
    1 le tablo dAtA2 s'avère être un tableau en ligne ( si je le colle sur une plage horizontale j'ai bien mes valeurs distinctes qui s'affichent)
    sur un plage verticale je n'ai que la valeur dAtA2(0) qui se répète
    question comment retourné un tableau à une dimension ?
    Daranc

  18. #18
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 546
    Points
    15 546
    Par défaut
    Mon code ne donne pas ce que tu dis (cad rien...)
    Fais le test sur le fichier que tu as mis sur le forum en ajoutant le décompte du temps. GetTickCount donne le temps en millisecondes

    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
    Public Declare Function GetTickCount& Lib "kernel32" ()
     
    Sub TestOuvrirTxt() 
    Dim Depart As Double, Duree As Double
    Depart = GetTickCount
    Dim Ligne As String, Position As Double, NoLigne As Integer
    Open "D:\xls\Meniskus 05-02-08 L 15h00 90°.PRF" For Input As #1
        Do While Not EOF(1)
            Input #1, Ligne
            Position = Position + 1
            If Position > 10 Then
                If (Position - 7) Mod 4 = 0 Then
                    NoLigne = NoLigne + 1
                    Cells(NoLigne, 1) = Ligne
                End If
            End If
        Loop
    Close #1
    Duree = (GetTickCount - Depart) / 1000 '=> 1,359
    msgbox Duree
    End Sub
    Pour ton fichier de 28392 lignes j'obtiens 1,359 secondes, qui semble cohérent avec le test de kiki69

  19. #19
    Inactif  

    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    4 555
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 4 555
    Points : 5 537
    Points
    5 537
    Par défaut
    Bonjour,

    J'aimerais que Daranc nous mette ici un petit bout de ton fichier text (en copiant collant après ouverture par notepad)... juste pour voir s'il ne s'agirait pas d'un fichier structuré en base de données (ceci pouvant expliquer celà...)

  20. #20
    Membre émérite

    Homme Profil pro
    Technicien Métrologie R&D
    Inscrit en
    Janvier 2007
    Messages
    1 610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien Métrologie R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 610
    Points : 2 523
    Points
    2 523
    Billets dans le blog
    1
    Par défaut
    je tente le passage du fichier en TXt enregistré par le blocnote
    Daranc
    PS j'en ai coupé pas mal dans les données
    je passerais le classeur en cas de besoin

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. fichiers Accès sequentiel besoin d'aide
    Par ayoub aouad dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 03/03/2014, 13h01
  2. Probleme lecture fichier acces sequentiel
    Par ouar dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 23/09/2005, 13h39
  3. Réponses: 5
    Dernier message: 07/05/2004, 09h44
  4. problème d'acces concurentiel à un fichier
    Par Theoden dans le forum MFC
    Réponses: 2
    Dernier message: 04/03/2004, 09h49
  5. Chemin d'accès d'un fichier
    Par guitaros dans le forum Langage
    Réponses: 6
    Dernier message: 16/01/2004, 09h27

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