VB Excel2007 Ma boucle met 15 secondes - peut-on réduire le temp

Fermé
Mouftie Messages postés 215 Date d'inscription vendredi 28 novembre 2008 Statut Membre Dernière intervention 6 septembre 2020 - Modifié par Mouftie le 16/02/2013 à 16:44
Mouftie Messages postés 215 Date d'inscription vendredi 28 novembre 2008 Statut Membre Dernière intervention 6 septembre 2020 - 18 févr. 2013 à 16:18
Bonjour,
J'apprends VBA grâce aux forums... et je ne suis pas sûr d'utiliser la bonne méthode...

J'ai un fichier qui fait actuellement près de 2000 lignes, il devrait passer à 30 000 lignes.
J'ai fait une boucle pour supprimer toutes les lignes qui ne me servent pas, pour arriver à 900 lignes, mais cette boucle met une 15e de secondes à traiter ce fichier.
En cherchant, j'ai vu "des trucs" pour traiter les tableaux avec VBA qui raccourcissent le déroulement des boucles (notamment) mais j'avoue que je n'ai pas compris grand chose vu que le code de ces tutos se déroule de manière "virtuelle".
Donc voici mon code
Sub PfsDai() 
'Supprime les lignes dont la colonne C ne contient pas une des infos ci-après 
Dim z As String 
Dim i As Integer 
    For i = Range("B65536").End(xlUp).Row To 2 Step -1 
        z = Cells(i, 3).Value 
        If Not (Cells(i, 3) Like ("*DAI") Or Cells(i, 3) Like ("*PFS")) Then Rows(i).Delete 
    Next 
End Sub
et le fichier à qui je l'applique
https://www.cjoint.com/?CBqqPjQvLXP
Merci de me dire s'il y a mieux à faire quand je devrais traiter tous les jours mes 30 000 lignes...
A voir également:

6 réponses

lermite222 Messages postés 8702 Date d'inscription dimanche 8 avril 2007 Statut Contributeur Dernière intervention 22 janvier 2020 1 190
16 févr. 2013 à 21:40
Bonjour,
2,5 secondes
Sub PfsDai()
'Supprime les lignes dont la colonne C ne contient pas une des infos ci-après
Dim z As String
Dim i As Integer
    Application.ScreenUpdating = False
    For i = Range("B65536").End(xlUp).Row To 2 Step -1
        z = Cells(i, 3).Value
        If Not z Like "*DAI" Or z Like "*PFS" Then Rows(i).Delete
    Next
End Sub

A+

1
Mouftie Messages postés 215 Date d'inscription vendredi 28 novembre 2008 Statut Membre Dernière intervention 6 septembre 2020 15
17 févr. 2013 à 10:57
Bonjour Lermite222,
Merci;
Effectivement ça va beaucoup plus vite, juste un petit truc que je ne comprends pas, les données qui se terminent par PFS sont aussi supprimées ?
Tu vois pourquoi ?
0
eriiic Messages postés 24570 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 23 avril 2024 7 214
17 févr. 2013 à 11:40
Bonjour à tous,

en 0.6s :
Sub supplig()
    Dim t As Single, derlig As Long
    Application.ScreenUpdating = False
    t = Timer
    derlig = Cells(Rows.Count, "C").End(xlUp).Row
    Range("C2").AutoFilter
    ActiveSheet.Range("$B$2:$I$" & derlig).AutoFilter Field:=2, Criteria1:="<>*PFS", Operator:=xlAnd, Criteria2:="<>*DAI"
    Rows("3:" & derlig).Delete Shift:=xlUp
    Selection.AutoFilter
    Application.ScreenUpdating = True
    MsgBox Timer - t
End Sub 

eric
0
Mouftie Messages postés 215 Date d'inscription vendredi 28 novembre 2008 Statut Membre Dernière intervention 6 septembre 2020 15
17 févr. 2013 à 14:02
Bonjour Eric,
effectivement tu sors vainqueur !
je te remercie pour le timer, je le reprendrai...
je me suis même amusée à refaire ma macro avec et le timer indique exactement 16,47 secondes (moi j'avais compté ça à la louche...)
là c'est scientifique ;>

Pus sérieusement, c'est la propriété ScreenUpdating qui est importante
je suis donc allée voir dans l'aide et Microsoft dit : "N'oubliez pas de redéfinir sur True la propriété ScreenUpdating à la fin de l'exécution de la macro."
Or ni toi ni lermite222 ne le faite. je suppose qu'il faut la 'fermer' si la macro n'est pas fini et que de toute façon à la fin, la propriété se remet toute seule sur true ?
0
eriiic Messages postés 24570 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 23 avril 2024 7 214
17 févr. 2013 à 15:05
"N'oubliez pas de redéfinir sur True la propriété ScreenUpdating à la fin de l'exécution de la macro.
Or ni toi ni lermite222 ne le faite."

Si je l'avais mis, mais vu que mon code se limite à une seule suppression ça ne joue que pour 0.03 s...
De toute façon il vaut mieux prendre pour habitude de le mettre dès que tu as qcq centaines de lignes à modifier.
Et, comme tu dis, ça se rétablit à la fin des macros si tu oublies de rétablir.
eric
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Mouftie Messages postés 215 Date d'inscription vendredi 28 novembre 2008 Statut Membre Dernière intervention 6 septembre 2020 15
Modifié par Mouftie le 17/02/2013 à 15:16
Désolée Eric, j'ai mal lu, toi tu as fermer la propriété...

quant au code de Lermite222, il tourne en 1.5 s il y a juste un petit pb de parenthèse, pour la prise en compte des 2 critères :
Sub PfsDai()
'Supprime les lignes dont la colonne C ne contient pas une des infos ci-après
Dim z As String
Dim i As Integer
Dim t As Single
    Application.ScreenUpdating = False
    t = Timer
    For i = Range("B65536").End(xlUp).Row To 2 Step -1
        z = Cells(i, 3).Value
        If Not (z Like "*DAI" Or z Like "*PFS") Then Rows(i).Delete
    Next
        Application.ScreenUpdating = True
    MsgBox Timer - t
'timer = 1.449
End Sub

Merci à vous deux
0
lermite222 Messages postés 8702 Date d'inscription dimanche 8 avril 2007 Statut Contributeur Dernière intervention 22 janvier 2020 1 190
18 févr. 2013 à 14:34
Re, pour info
Concernant Application.ScreenUpdating
Il faut remettre à true SI ONT NE QUITTE PAS LA MACRO, ce qui est le cas avec un MsgBox
Sinon, dés que le code est terminer, contrairement à ce qui est dit dans l'aide c'est remis à true automatiquement au sortir de la macro.
Essaye sans MsgBox et sans la ligne
Application.ScreenUpdating = True

Et tu verras que l'affichage se met à jour.
A+
0
Mouftie Messages postés 215 Date d'inscription vendredi 28 novembre 2008 Statut Membre Dernière intervention 6 septembre 2020 15
18 févr. 2013 à 16:18
Bonjour Lermitte222,
Merci pour la précision, je regarde ça tout de suite ; surtout que j'ai plein de traitement de ce genre, donc j'ai mis des "Application.ScreenUpdating " un peu partout .
NB : je travaille avec des petites macros que je rassemble après ou que j'appelle les unes après les autres ; ça me rassure...
0