Améliorer le temps d'exécution d'une macro

Bonjour,

Etant nouveau sur VBA, j'ai créé un code pour supprimer toutes les lignes d'un tableau pour lesquelles la valeur de la colonne A est différente de : PP, QM, PM et F&P.

Sub CONDITION()

Application.ScreenUpdating = False

Dim i As Long

For i = ActiveSheet.UsedRange.Rows.Count To 2 Step -1

ElseIf Cells(i, 1).Value <> "PP" And Cells(i, 1).Value <> "PM" And Cells(i, 1).Value <> "QM" And Cells(i, 1).Value <> "F&P" Then

Cells(i, 1).EntireRow.Delete

End If

Next i

Application.ScreenUpdating = True

End Sub

Cependant, le temps d'exécution est long (5'30'' environ). Est-normal pour un traitement sur 65000 lignes (j'ai du supprimé des lignes pour le joindre) ou existe t-il une version optimisée de mon code ?

Merci,

Kevinsmith

51condition.zip (140.98 Ko)

Bonjour,

Il manque une partie de code dans ton post. S'il y a un ELSEIF, il doit y avoir un IF

Merci de mettre le code complet qui ne se trouve d'ailleurs pas dans ton fichier

Amicalement

Bonjour à tous,

essaye avec un filtre

tu nous diras le temps de traitement du fichier réel

Sub Filtre()
Dim Lg&, x
    x = Time
    Application.ScreenUpdating = False
    On Error Resume Next
        ActiveSheet.ShowAllData
    On Error GoTo 0
    Lg = Range("a" & Rows.Count).End(xlUp).Row
    Range("o2") = "=AND(a2<>""pp"",a2<>""pm"",a2<>""qm"",a2<>""f&p"")" 'critères
    Range("a1:a" & Lg).AdvancedFilter Action:=xlFilterInPlace, CriteriaRange:= _
    Range("o1:o2"), Unique:=False
    On Error Resume Next
    Range("a2:a" & Lg).SpecialCells(xlCellTypeVisible).EntireRow.Delete
    Range("o2").ClearContents
        ActiveSheet.ShowAllData
    MsgBox ("temps macro = " & Format(Time - x, "hh:mm:ss"))
End Sub

Salut Dan

Amicalement

Claude

édit: déplacé un On Error Resume Next

nouveau code et fichier

Merci beaucoup Claude, le temps d'exécution sur mon fichier est passé de 5'30" à 2' avec ton code!

Bonjour à tous,

En utilisant des variables tableaux, tu peux peut-être diminuer ce temps qui est déjà assez court :

Sub filtre2()
Dim Lg&, i&, j&, lim&, t#
Dim temp, temp2

t = Timer
Application.ScreenUpdating = False
Lg = Range("a" & Rows.Count).End(xlUp).Row
j = 1
temp = Range("a2:a" & Lg).Value
lim = UBound(temp, 1)

ReDim temp2(1 To lim, 1 To 1)
For i = 1 To lim
  If temp(i, 1) = "PP" Or temp(i, 1) = "PM" Or temp(i, 1) = "QM" Or temp(i, 1) = "F&P" Then temp2(j, 1) = temp(i, 1): j = j + 1
Next i
[A2].Resize(lim).Value = temp2

MsgBox Timer - t & " seconde pour filtrer tout ça"
End Sub

Bonjour à tous,

2 minutes, çà me parait encore bien long,

essaye ce nouveau code, (critères inversés)

ici, on extrait sur la feuille "Extrait"

Sub Extrait()
Dim Lg&, x
    x = Time
    Application.ScreenUpdating = False
    Lg = Range("a" & Rows.Count).End(xlUp).Row
    Range("o2") = "=or(a2=""pp"",a2=""pm"",a2=""qm"",a2=""f&p"")" 'critères

    Range("a1:a" & Lg).AdvancedFilter Action:=xlFilterCopy, CriteriaRange:= _
    Range("o1:o2"), CopyToRange:=Sheets("Extrait").Range("a1"), Unique:=False

    Range("o2").ClearContents
    MsgBox ("temps macro = " & Format(Time - x, "hh:mm:ss"))
End Sub

Bonne journée

Claude

Bonjour,

Je suis débutant en macro excel. Je rebondit sur ce post car j'ai le même souci de vitesse d’exécution sur une macro qui supprime des lignes si on ne répond pas a un critère de date qui est calculé sur la cellule AO

Mid(Cells(Lig, AO), 4, 2)

J'ai un fonctionnement acceptable avec des fichiers de 300 lignes mais dés que les fichiers ont plus de 1000 lignes le temps pour supprimer une ligne est de plus de 2mn alors qu'avec le fichier de 300 lignes tout est fait en moins de 2mn. (test fait avec screen update true).

Je ne sais pas comment à intégrer ce code dans ma macro.

Ma macro est installé dans mon personal.xlsb car les fichiers sources sont des fichiers collaboratifs.

But de la macro: Consolidation mensuelle d'activité

Ce qu'elle fait:

Création du fichier de consolidation

Boucle de demande d'ouverture des fichiers sources puis de sélection de l'onglet à copier dans le fichier de consolidation.

Actuellement 11 fichiers doivent être consolidés.

Ensuite, je traite le fichier pour supprimer les ligne inutiles et c'est la que j'ai mon problème de vitesse d'exécution.

Je viens d'intégrer un compteur pour connaitre le temps de traitement du fichier sur une MsgBox

Les étapes suivantes seraient de consolider tous les onglets sur un nouvel onglet puis de faire des graphes.

Je joint mon code (fichier.bas) à ce post.

Merci de votre aide.

Bonjour

Tu aurais du ouvrir un nouveau post

A part ça travailler avec juste le code ce n'est pas la meilleure façon de chercher une solution

Ce qu'il faut pour tester c'est ton fichier (celui contenant la macro) plus quelques fichiers de données

Le tout bien sur anonymisé mais exploitable (bien une date en colonne AO)

erreipnaej a écrit :

qu'avec le fichier de 300 lignes tout est fait en moins de 2mn. (test fait avec screen update true).

Récupération de la feuille + traitement ou seulement traitement

Déroulement de ta macro

  • -Création nouveau classeur
  • -ouverture d'un fichier source
  • -Sélection de la page
  • -Copie de la page
  • -Nettoyage de la page
  • -recommence en B

Ensuite à la vue de ta remarque tu regroupes toutes les feuilles sur une seule

Pourquoi ne pas le faire d'entrée ?

Bonjour,

Merci de ta réponse.

J'ai passé le code comme ça car il n'est pas dans un fichier .xlm mais dans mon fichier de macro perso.

J'ai modifié mon code ce matin et j'arrive à améliorer le temps de traitement mais ce n'est pas satisfaisant.

Comme la solution proposée est d'utiliser des filtres, je suis donc en train d'étudier plus précisément les filtres en enregistrant des macros de filtrage pour voir le code que ça me donne.

J'espére arriver à quelque chose de plus performant.

@+

Bonjour,

J'ai finalement trouvé le probléme.

il s'agissait d'un fichier enregistré au format xls (97~2003) qui mettait un temps fou à s'ouvrir et pour les effectuer les opréations demandées par la macro.

Passé en format xslx,, les temps de traitement sont corrects.

Merci de vos réponses.

Rechercher des sujets similaires à "ameliorer temps execution macro"