Précédent   Forum des professionnels en informatique > Logiciels > Microsoft Office > Excel > Macros et VBA Excel
Macros et VBA Excel Vos questions relatives aux macros Excel, à l'utilisation de VBA et à l'automatisation de vos classeurs Excel.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
Vieux 03/02/2010, 16h00   #1
Nouveau Membre du Club
 
Inscription : avril 2007
Messages : 73
Détails du profil
Informations forums :
Inscription : avril 2007
Messages : 73
Points : 30
Points : 30
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 :
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
imaril est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/05/2010, 08h54   #2
Membre chevronné
 
Inscription : avril 2008
Messages : 581
Détails du profil
Informations personnelles :
Âge : 62

Informations forums :
Inscription : avril 2008
Messages : 581
Points : 644
Points : 644
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
__________________
La qualité et la précision de la réponse sont proportionnelles à celles de la question.
PPz78 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/05/2010, 12h55   #3
Membre éclairé
 
Inscription : février 2006
Messages : 285
Détails du profil
Informations forums :
Inscription : février 2006
Messages : 285
Points : 346
Points : 346
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 :
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à.

Dernière modification par neupont ; 03/05/2010 à 13h09.
neupont est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/05/2010, 13h17   #4
Membre éclairé
 
Inscription : février 2006
Messages : 285
Détails du profil
Informations forums :
Inscription : février 2006
Messages : 285
Points : 346
Points : 346
Arf, le message date du 3 février !
Qu'est-ce que tu es allé nous déterrer là PPz ?
neupont est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +1. Il est actuellement 20h24.


 
 
 
 
Partenaires

Hébergement Web