VB Excel2007 Ma boucle met 15 secondes - peut-on réduire le temp
Mouftie
Messages postés
215
Date d'inscription
Statut
Membre
Dernière intervention
-
Mouftie Messages postés 215 Date d'inscription Statut Membre Dernière intervention -
Mouftie Messages postés 215 Date d'inscription Statut Membre Dernière intervention -
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
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...
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 Subet 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:
- VB Excel2007 Ma boucle met 15 secondes - peut-on réduire le temp
- Comment réduire la taille d'un fichier - Guide
- Macos 15 - Accueil - MacOS
- Reduire taille image - Guide
- Reduire clavier iphone - Guide
- Vb - Télécharger - Langages
6 réponses
Bonjour,
2,5 secondes
A+
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+
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 ?
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 ?
Bonjour à tous,
en 0.6s :
eric
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
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 ?
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 ?
"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
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
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
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 :
Merci à vous deux
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
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
Et tu verras que l'affichage se met à jour.
A+
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+
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...
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...