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 :

Extraire quelques lignes de donnée d'un fichier CSV de 14000 ligne


Sujet :

Macros et VBA Excel

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    73
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 73
    Points : 52
    Points
    52
    Par défaut Extraire quelques lignes de donnée d'un fichier CSV de 14000 ligne
    Bonjour,

    On va dire que le titre n'est pas très très explicite mais on va faire avec...
    Une fois par semaine, je doit réaliser une vérification des performance de la semaine passé à l'aide d'un fichier CSV ( de 12 à 13000 ligne fourni par le serveur et non modifiable)
    je dois donc extraire les fiches (lignes) qui ont certain critere
    • un statut clos
    • la date comprise entre lundi et dimanche de la semaine derniere ( rentré manuellement)
    • un type : MAC ou EVO


    j'ai tout d'abord penser à un filtre automatique, mais a ma grande surprise, dans la colonne date, il (excel) concidere que la cellule est une date ou du texte ce qui fausse le filtre auto.
    De plus vu le nombre de donnée differente le filtre auto se limite a un certain nombre et les dernieres dates valide sont en 2008.

    J'ai donc fais un parcours complet du fichier avec un verification des conditions mais cette macro prend a peu pres 30 à 40 min...

    Y aurai-t-il une solution plus rapide ?

    Merci

    ci-joint le code que j'ai développer :
    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
     
    Sub sla() 
    Dim fich_csv As Workbook 
    Dim nb_ligne As Long 
    Dim cpt As Long 
    Dim parcours As Long 
    Dim date_debut As String 
    Dim date_fin As String 
    Application.ScreenUpdating = False 
    Set fich_csv = Workbooks.Open(Application.GetOpenFilename("Excel file (*.csv), *.csv", , "Selectionnez la derniere extraction eRequester")) 
    date_debut = InputBox("entrez la date de début de période") 
    date_fin = InputBox("entrez la date de fin de période") 
    nb_ligne = Range("A1", Range("A1").End(xlDown)).Count 
    parcours = 2 
    For cpt = 2 To nb_ligne
        If condition(date_debut, date_fin, parcours) Then 
            parcours = parcours + 1 
        Else 
            Range("m" & parcours).EntireRow.Delete 
        End If 
    Next 
     
     
    Application.ScreenUpdating = True 
    End Sub 
     
    Function condition(date_deb As String, date_fin As String, parcours As Long) As Boolean 
    condition = False 
    If Range("m" & parcours).Value = "Closed" Then 
        If Range("K" & parcours).Value = "Maintenance Corrective" Or Range("K" & parcours).Value = "Evolution mineure" Then 
            If Range("CY" & parcours).Value <> "" Then 
                If CDate(Range("CY" & parcours).Value) >= CDate(date_deb) And CDate(Range("CY" & parcours).Value) <= CDate(date_fin) Then 
                    condition = True 
                End If 
            Else 
                If CDate(Range("N" & parcours).Value) >= CDate(date_deb) And CDate(Range("N" & parcours).Value) <= CDate(date_fin) Then 
                    condition = True 
                End If 
            End If 
        End If 
    End If 
     
    End Function

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    592
    Détails du profil
    Informations personnelles :
    Âge : 74
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 592
    Points : 730
    Points
    730
    Par défaut
    Le calcul semble trop long, il faut donc éviter de calculer plusieurs fois la même chose dans la fonction "condition" :
    CDate(date_deb) et CDate(date_fin) doivent être sortis de la fonction et mis dans le main,
    Range("CY" & parcours).Value est calculé deux fois
    Range("K" & parcours).Value est calculé deux fois

    Ces modifications devraient diviser le temps de calcul par 2

    Merci de nous donner le résultat.

    PPz

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Février 2006
    Messages
    288
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 288
    Points : 364
    Points
    364
    Par défaut
    Bonjour,
    le CSV provient-il d'un serveur Unix ou Windows ? Tu pourrais en mettre quelques lignes en pièce jointe ?
    Merci

    Edit : D'autre part il serait utile de savoir l'ordre dans lequel ces conditions sont le plus discriminatoire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    If Range("m" & parcours).Value = "Closed" Then
        If Range("K" & parcours).Value = "Maintenance Corrective" Or Range("K" & parcours).Value = "Evolution mineure" Then
            If Range("CY" & parcours).Value <> "" Then
                If CDate(Range("CY" & parcours).Value) >= CDate(date_deb) And CDate(Range("CY" & parcours).Value) <= CDate(date_fin) Then
    En effet on gagne à faire d'abord les tests qui éliminent le plus de lignes, histoire de ne pas avoir à tester les autres conditions dans ces cas-là.

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Février 2006
    Messages
    288
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 288
    Points : 364
    Points
    364
    Par défaut
    Arf, le message date du 3 février !
    Qu'est-ce que tu es allé nous déterrer là PPz ?

Discussions similaires

  1. Réponses: 2
    Dernier message: 04/11/2014, 15h36
  2. inclure une ligne de données dans un fichier csv
    Par alvine18 dans le forum Langage
    Réponses: 5
    Dernier message: 08/06/2012, 14h40
  3. Extraire des données d'un fichier .csv avec C++
    Par cre31400 dans le forum C++Builder
    Réponses: 14
    Dernier message: 08/07/2008, 10h25
  4. Extraire des données dans un fichier .csv
    Par orj30754 dans le forum C
    Réponses: 7
    Dernier message: 03/11/2006, 14h48
  5. [VBA-Excel] copier des lignes de données d'un fichier à un autre
    Par ash_rmy dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 31/07/2006, 10h17

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