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 :

Optimisation de Programme(lecture .txt) [XL-2003]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2012
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Avril 2012
    Messages : 23
    Par défaut Optimisation de Programme(lecture .txt)
    Amis du jour Bonjour!

    Voila je post une demande en vue d'optimiser mon programme existant.

    (le besoin n'est pas urgent )

    Cela concerne principalement la lecture d'un fichier texte ainsi que la récupération de données.

    Cela étant pour moi un cauchemar (les histoires de tableaux...)

    J'ai repris l'idées de différents tutos et mis en place une copie de données dans des tablCollonne tablLigne


    Puis je lance un copie de tout cela dans une feuille prédefinie "NomFeuilleOuverture"
    pour soumettre les valeurs de lignes à différents tests.


    Tout cela fonctionne bien mais ... j'ai près de 350 .txt à étudier donc les recopier sous excel pour les étudier puis les effacer fais bien pédaler ce pauvre PC que l'on m'as fourni pour programmer.

    ci dessous le bout de code actuel pour ouvrir et copier les données de mon .txt


    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
    Private Sub LireFichierTexte()
    'lecture d'un fichier .txt en vue d'une récupération des données
     
     
     
    NumFichier = FreeFile
    Open chemin & codeCapteurStr & "_" & dateMesure & ".txt" For Binary Access Read As #NumFichier
    recup = String(LOF(NumFichier), Chr(9))
    Get #NumFichier, , recup
    Close #NumFichier
    'stockage temporaire des mesures dans une feuille
     
    With Worksheets(NomFeuilleOuverture).Range("A1")
    TabLigne = Split(recup, vbCrLf)
    'démarrage d'une boucle for  pour stocker des valeurs de ligne dans un tableau
    For cmpt1 = 0 To UBound(TabLigne)
    tabCol = Split(TabLigne(cmpt1), Chr(9))
    'démarrage d'une 2ieme boucle for pour stocker des valeurs de collone dans un tableau
    For cmpt2 = 0 To UBound(tabCol)
    'recopie des valeurs dans une feuille
     
        .Offset(cmpt1, cmpt2).Value = tabCol(cmpt2)
        Next cmpt2
        Next cmpt1
        End With


    PS: Mes études de lignes (pour mes autres sub exploitant ces données)se font via des boucles FOR.

    J'ai tant bien que mal essayé de récupérer directement les valeurs dans les tableaux de variables mais dès que je cherche à récupérer une ligne précise, une erreur de délimitation apparait.

    vous pourrez trouver la totalité du test en cours si jamais le code ci dessus ne suffisait pas

    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
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    268
    269
    270
    271
    272
    273
    274
    275
    276
    277
    278
    279
    280
    281
    282
    283
    284
    285
    286
    287
    288
    289
    290
    291
    292
    293
    294
    295
    296
    297
    298
    299
    300
    301
    302
    303
    304
    305
    306
    307
    308
    309
    310
    311
    312
    313
    314
    315
    316
    317
    318
    319
    320
    321
    322
    323
    324
    325
    326
    327
    328
    329
    330
    331
    332
    333
    334
    335
    336
    337
    338
    339
    340
    341
    342
    343
    344
    345
    346
    347
    348
    349
    350
    Option Explicit
     
    Dim TabLigne() As String, tabCol() As String, recup As String, PosteStr As String
     
    Dim cmpt1 As Long, cmpt2 As Long
     
    Dim lanceH As Boolean, lanceV As Boolean, lanceQ As Boolean
    Dim lanceLE As Boolean, lanceV1 As Boolean, lanceV2 As Boolean, lanceV3 As Boolean, lanceNT As Boolean
    Dim lanceAL As Boolean, lanceAM As Boolean, lanceAV As Boolean
    Dim lanceH1 As Boolean, lanceH2 As Boolean
     
     
    Dim IntroHStr As String, IntroVStr As String, IntroQStr As String, memedateStr As String
    Dim memedateHStr As String, memedateVStr As String, memedateQStr As String
    Dim mesureHLng As Variant, mesureVLng As Variant, mesureQLng As Variant
    Dim x As Integer
     
     
     
    Dim DepasSeuilStr As String, Str_Boolean As String, NomFeuilleOuverture As String
    Dim codeCapteurStr As Variant
     
    Dim mesure As Long, seuilMinLng As Long, seuilMaxLng As Long
     
    Dim sheetStr As String, valDepasseStr As String, dateMesure As String
     
    Dim cmpt As Integer, ligneouvert As Integer, NumFichier As Integer
     
    Private Const chemin As String = "D:\Documents and Settings\ccruz\Bureau\stephane_stagiaire\DO\"
     
     
     
    Private Sub Seuils()
     
     
     
    dateMesure = Sheets("metrologieNCA").Cells(20, 4)
     
     
    For ligneouvert = 2 To 450
     
    codeCapteurStr = Sheets("status").Cells(ligneouvert, 2)
     
    'appel de la fonction de traitement de fin de chaine
     
     Call detectionFinDeChaine
     
     
     If lanceH = True Then
     NomFeuilleOuverture = "ReleveH"
     End If
     
     
     
     If lanceV = True Then
     NomFeuilleOuverture = "ReleveV"
     End If
     
     
    If lanceLE = True Then
    NomFeuilleOuverture = "ReleveQ"
     End If
     
     
    If lanceH = False And lanceV = False And lanceLE = False Then
    NomFeuilleOuverture = "ReleveAutre"
    End If
     
     
     
    'appel de la fonction d'ouverture fichier
     
     
    Call LireFichierTexte
     
     
     
     
     
     
     
    'chargement de la cellule cmp,2 dans codeCapteurStr
    codeCapteurStr = Sheets("status").Cells(ligneouvert, 2)
    PosteStr = Sheets("status").Cells(ligneouvert, 1)
    If codeCapteurStr = "" Then Exit For
    If PosteStr = "" Then Exit For
     
     
     
    'si H détecté on charge les valeurs associées
    If lanceH = True Then
    seuilMinLng = Sheets(PosteStr).Cells(2, 3)
    seuilMaxLng = Sheets(PosteStr).Cells(2, 4)
    End If
     
    'si H1 détecté on charge les valeurs associées
    If lanceH1 = True Then
    seuilMinLng = Sheets(PosteStr).Cells(3, 3)
    seuilMaxLng = Sheets(PosteStr).Cells(3, 4)
    End If
     
     
     
    'si H2 détecté on charge les valeurs associées
    If lanceH2 = True Then
    seuilMinLng = Sheets(PosteStr).Cells(4, 3)
    seuilMaxLng = Sheets(PosteStr).Cells(4, 4)
    End If
     
     
    'si H amont détecté on charge les valeurs associées
    If lanceNT = True Then
    seuilMinLng = Sheets(PosteStr).Cells(5, 3)
    seuilMaxLng = Sheets(PosteStr).Cells(5, 4)
    End If
     
     
     
    'si H aval détecté on charge les valeurs associées
    If lanceAL = True Then
    seuilMinLng = Sheets(PosteStr).Cells(6, 3)
    seuilMaxLng = Sheets(PosteStr).Cells(6, 4)
    End If
     
     
     
    'si D centrale détecté on charge les valeurs associées
    If lanceLE = True Then
    seuilMinLng = Sheets(PosteStr).Cells(7, 3)
    seuilMaxLng = Sheets(PosteStr).Cells(7, 4)
    End If
     
    'si V détecté on charge les valeurs associées
    If lanceV = True Then
    seuilMinLng = Sheets(PosteStr).Cells(8, 3)
    seuilMaxLng = Sheets(PosteStr).Cells(8, 4)
    End If
     
     
    'si V1 détecté on charge les valeurs associées
    If lanceV1 = True Then
    seuilMinLng = Sheets(PosteStr).Cells(9, 3)
    seuilMaxLng = Sheets(PosteStr).Cells(9, 4)
    End If
     
     
    'si V2 détecté on charge les valeurs associées
    If lanceV2 = True Then
    seuilMinLng = Sheets(PosteStr).Cells(10, 3)
    seuilMaxLng = Sheets(PosteStr).Cells(10, 4)
    End If
     
     
    'si V3 détecté on charge les valeurs associées
    If lanceV3 = True Then
    seuilMinLng = Sheets(PosteStr).Cells(11, 3)
    seuilMaxLng = Sheets(PosteStr).Cells(11, 4)
    End If
     
     
     
     
     
    'résumé du test en cours :
    'On lance une boucle for avec cmpt pour selection de ligne
    'a chaque ligne on viens lire la collone indiquant le nom de PNIC
    'ce nom est chargé dans  sheetStr
    'nous lançons une commande d'appel de sheet correspondant à sheetStr
    'nous allons charger les valeurs min et max de la mesure demandé dans varMin varMax
    'on compare la valeur de la ligne .txt avec varMin et varMax
    'si la valeur dépasse les seuils fixés ont écrit un texte dans le sheet statut
    'dans la collone correspondante
     
    'IMPORTANT :
    'pour le vrai programme la valeur de la ligne en question sera récupéré dans un .txt
    'toutes les lignes de ce .txt seront étudiés via une boucle for déstinée à cela
     
     
    'fonctionnement ok
    '!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
     
     
     
    sheetStr = Sheets("status").Cells(ligneouvert, 1)
     
     
    cmpt = 2
    For cmpt = 2 To 451
     
     
     
    'stockage de la valeur relevée dans une variable
     
    mesure = Sheets(NomFeuilleOuverture).Cells(cmpt, 2)
     
    'si la mesure est hors limite alors  un dépassement est inscrit et l'on sort de la boucle de test
     
    If mesure < seuilMinLng Or mesure > seuilMaxLng Then
     
    Sheets("status").Cells(ligneouvert, 11) = "Dépassement"
    Exit For
    'sinon nous continuons le test
     
    Else
    Sheets("status").Cells(ligneouvert, 11) = "OK"
     
     End If
     
     
     
     
     
    Next cmpt
     
     
    Next ligneouvert
     
     
    End Sub
     
    'Sub ok rien à revoir
    'pour l'instant
     
    Private Sub detectionFinDeChaine()
     
     
     
    'mise à faux de tous les booléens
     
    lanceH = False
    lanceV = False
    lanceQ = False
    lanceLE = False
    lanceV1 = False
    lanceV2 = False
    lanceV3 = False
    lanceNT = False
     
     lanceAL = False
     lanceAM = False
     lanceAV = False
     lanceH1 = False
     lanceH2 = False
     
     
     
    Str_Boolean = Right(codeCapteurStr, 2)
    'recherche du caractère et activation du bool en fonction
     
     
        If (Str_Boolean = "_H") Then
        lanceH = True
     
            End If
     
     
        If (Str_Boolean = "H1") Then
        lanceH1 = True
     
            End If
     
        If (Str_Boolean = "H2") Then
        lanceH2 = True
     
            End If
     
     
     
        If (Str_Boolean = "_V") Then
        lanceV = True
     
        End If
     
     
        If (Str_Boolean = "V1") Then
        lanceV1 = True
     
        End If
     
     
        If (Str_Boolean = "V2") Then
        lanceV2 = True
     
        End If
     
        If (Str_Boolean = "V3") Then
        lanceV3 = True
     
        End If
     
     
        If (Str_Boolean = "le") Then
        lanceLE = True
     
        End If
     
    If (Str_Boolean = "nt") Then
        lanceNT = True
     
        End If
     
    If (Str_Boolean = "al") Then
        lanceAL = True
     
        End If
     
    If (Str_Boolean = "am") Then
        lanceAM = True
        End If
     
        If (Str_Boolean = "av") Then
        lanceAV = True
        End If
     
     
     
    End Sub
     
     
     
     
    Private Sub LireFichierTexte()
    'lecture d'un fichier .txt en vue d'une récupération des données
     
     
     
    NumFichier = FreeFile
    Open chemin & codeCapteurStr & "_" & dateMesure & ".txt" For Binary Access Read As #NumFichier
    recup = String(LOF(NumFichier), Chr(9))
    Get #NumFichier, , recup
    Close #NumFichier
    'stockage temporaire des mesures dans une feuille
     
    With Worksheets(NomFeuilleOuverture).Range("A1")
    TabLigne = Split(recup, vbCrLf)
    'démarrage d'une boucle for  pour stocker des valeurs de ligne dans un tableau
    For cmpt1 = 0 To UBound(TabLigne)
    tabCol = Split(TabLigne(cmpt1), Chr(9))
    'démarrage d'une 2ieme boucle for pour stocker des valeurs de collone dans un tableau
    For cmpt2 = 0 To UBound(tabCol)
    'recopie des valeurs dans une feuille
     
        .Offset(cmpt1, cmpt2).Value = tabCol(cmpt2)
        Next cmpt2
        Next cmpt1
        End With
     
     
     
    End Sub
    Bonne fin d'après midi à toutes et à tous

  2. #2
    Membre éclairé Avatar de nchal
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2012
    Messages
    512
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2012
    Messages : 512
    Par défaut
    Salut,

    Une bonne chose à faire pour réduire efficacement un temps d'exécution, utiliser Application.ScreenUpdating.
    Au debut de ton scprit et si tu n'as pas besoin de rafraichir ton écran avant la fin de l'exécution, tu mets :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Application.ScreenUpdating = False

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2012
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Avril 2012
    Messages : 23
    Par défaut
    Merci pour l'idée nChal

    mais juste pour savoir si cette commande ne va pas venir faire planter mon programme:


    Si je me sert d'un script d'écriture dans une cellule puis détude de cette meme cellule.

    Placer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Application.ScreenUpdating = False
    me permetra de réaliser l'étude sur cette cellule ou celle ci (vu qu'il n'y a pas de refresh) sera considéré comme vide?


    Merci pour l'idée en tout cas





    [/CODE]

  4. #4
    Membre expérimenté Avatar de CODYCO
    Homme Profil pro
    Webplanneur
    Inscrit en
    Avril 2009
    Messages
    217
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Avril 2009
    Messages : 217
    Par défaut
    En aucun cas cette ligne de code ne fera que figé l'affichage pour l'utilisateur le traitement des données et les données elles même restent intact, par contre ne pas oublier de remettre à la valeur "True" en fin de code.

  5. #5
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2012
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Avril 2012
    Messages : 23
    Par défaut
    Merci effectivement cela racourcis quelques peu le programme en cours.

    Et tout fonctionne bien


    Reste a voir si les utilisateurs du matin auront la patience d'attendre les 2min d'exécutions du programme

  6. #6
    Membre Expert

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

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 610
    Billets dans le blog
    1
    Par défaut
    si tu veux gagner en vitesse il te faudrait travailler tes tableaux en mémoire
    lorsque tu ferme ton fichier txt tu as tout en mémoire
    quel est la forme de ce que tu as ?
    mais apparemment tu séquence les données feuille
    tu peut en faire autant en mémoire
    un truc du genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    For cmpt1 = 0 To UBound(TabLigne,1)
    ReDim Preserve tabCol(cmpt1)
    mais je ne comprends pas ordonnancement de tes données

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

Discussions similaires

  1. Optimiser des programmes .net
    Par TSalm dans le forum Général Dotnet
    Réponses: 4
    Dernier message: 06/03/2008, 12h19
  2. Optimiser un programme java
    Par piteon dans le forum Général Java
    Réponses: 27
    Dernier message: 05/08/2007, 20h01
  3. Réponses: 4
    Dernier message: 09/06/2007, 18h25
  4. Réponses: 9
    Dernier message: 07/11/2006, 14h12
  5. Optimisation de la lecture de tres gros fichiers
    Par Lydie dans le forum C++Builder
    Réponses: 4
    Dernier message: 12/07/2004, 14h09

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