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

Mouftie Messages postés 234 Statut Membre -  
Mouftie Messages postés 234 Statut Membre -
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...

6 réponses

  1. lermite222 Messages postés 9042 Statut Contributeur 1 199
     
    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
  2. Mouftie Messages postés 234 Statut Membre 17
     
    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
  3. eriiic Messages postés 24581 Date d'inscription   Statut Contributeur Dernière intervention   7 281
     
    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
  4. Mouftie Messages postés 234 Statut Membre 17
     
    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
    1. eriiic Messages postés 24581 Date d'inscription   Statut Contributeur Dernière intervention   7 281
       
      "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
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. Mouftie Messages postés 234 Statut Membre 17
     
    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
    1. lermite222 Messages postés 9042 Statut Contributeur 1 199
       
      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
  7. Mouftie Messages postés 234 Statut Membre 17
     
    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