Macro trop lente à l'exécution : plus de 15 min

Bonjour à tous,

J'ai un bout de code dans une macro complexe qui en ralentit l'exécution fortement.

Je pense que c'est à cause du tableau sur lequel elle s'exécute.

Une fois par semaine, je fais une extraction d'une base de données qui me donne un tableau à nombre de ligne variable (qui ne va qu'en augmentant). Pour l'instant, je suis à quelque chose comme 4300 lignes.

Une partie de mon code sert à copier ce tableau dans mon classeur, et le "nettoyer" avant utilisation c'est à dire :

- supprimer toutes les lignes pour lesquelles la cellule en colonne C est vide

- trier le tableau par la colonne C

- supprimer toutes les lignes pour lesquelles la différence entre la date d'aujourd'hui et la date en colonne C est supérieure à 45 jours

Je pense que c'est très long car la majorité des lignes sont à supprimer du fait que j'ai des dates en colonnes C remontant jusqu'en 2019.

Voici le bout de code qui ralentit l'exécution :

Worksheets("VRAC TERMINE").Activate

'suppression des lignes vides
For i = Range("A" & Rows.Count).End(xlUp).Row To 2 Step -1
    If Cells(i, 3) = "" Then
    Cells(i, 1).EntireRow.Delete
    End If
Next i

numcol = 3
Call TriParColonne 
' macro externe permettant le tri en fonction de la colonne - je l'ai créé car je l'utilise plusieurs fois dans mon fichier mais ce n'est pas cela 'qui ralentit le code

'suppression en fonction de la date
dtjour = Date

For i = Range("C" & Rows.Count).End(xlUp).Row To 2 Step -1
    dtprod = Cells(i, 3).Value
    iJours = dtjour - dtprod
    If iJours > 45 Then
    Rows(i & ":" & i).EntireRow.Delete
    End If
Next
    

Je précise que toutes les variables sont définies en public donc pas de problème normalement de ce côté.

Y-a-t'il quelque chose que je puisse faire pour améliorer ou mon fichier est trop gros ?

Eloïse

Bonjour

Pourquoi 2 boucles

Worksheets("VRAC TERMINE").Activate
numcol = 3
Call TriParColonne
' macro externe permettant le tri en fonction de la colonne - je l'ai créé car je l'utilise plusieurs fois dans mon fichier mais ce n'est pas cela 'qui ralentit le code
'suppression des lignes vides et suppression en fonction de la date
For i = Range("C" & Rows.Count).End(xlUp).Row To 2 Step -1
   If Cells(i, 3) = "" Then
   Cells(i, 1).EntireRow.Delete
Else
  If date - cdate(Cells(i, 3).Value) > 45 Then
     Rows(i & ":" & i).EntireRow.Delete
  End If
Endif
Next

A+ François

Bonsoir,

Autre méthode sans boucle:

Option Compare Text
Sub Supp_Lignes()
    Dim f1 As Worksheet
    Dim DerLig As Long, DerCol As Long
    Application.ScreenUpdating = False
    Set f1 = Sheets("VRAC TERMINE")
    DerLig = f1.Range("A" & Rows.Count).End(xlUp).Row
    DerCol = f1.Range("A1").End(xlToRight).Column

    Range(f1.Cells(2, DerCol + 1), f1.Cells(DerLig, DerCol + 1)).FormulaLocal = "=SI(OU(C2="""";(AUJOURDHUI()-C2)>45);""x"";"""")"
    If f1.AutoFilterMode = False Then Range(f1.Cells(1, "A"), f1.Cells(1, DerCol + 1)).AutoFilter
    Range(f1.Cells(1, "A"), f1.Cells(1, DerCol + 1)).AutoFilter Field:=DerCol + 1, Criteria1:="X"
    f1.Rows("2:" & DerLig + 1).SpecialCells(xlCellTypeVisible).Delete
    f1.AutoFilterMode = False
    f1.Columns(DerCol + 1).ClearContents
End Sub

Cdlt

Salut Eloïse,
Salut les as,

et une autre avec 1 petite bouclette !

Dim tTab, iRow%, iCol%
'
Application.EnableEvents = False
Application.ScreenUpdating = False
'
With Worksheets("VRAC TERMINE")
    iRow = .Range("A" & Rows.Count).End(xlUp).Row
    iCol = .Cells(1, Columns.Count).End(xlToLeft).Column
    .Range("A1").Resize(iRow, iCol).Sort key1:=.Range("C2"), order1:=xlDescending, Orientation:=xlTopToBottom, Header:=xlYes
    tTab = .Range("C2").Resize(.Range("C" & Rows.Count).End(xlUp).Row, 1).Value
    For x = 1 To UBound(tTab, 1)
        If DateDiff("d", CDate(tTab(x, 1)), DateAdd("d", -45, Date)) > 45 Then
            .Range("A" & x).Resize(iRow, iCol).ClearContents
            Exit For
        End If
    Next
End With
'
Application.EnableEvents = True
Application.ScreenUpdating = True

A+

Bonjour à tous,

Après pour ce genre d'opération vous auriez tout intérêt à vous tourner vers PowerQuery (outil d'analyse de données intégré à Excel). Il vous suffirait de rafraichir la requête pour mettre à jour le tableau.

C'est quasi-instantané, et la différence en temps de traitement pour 100 ou 10 000 lignes sera quasi imperceptible.

Si ça vous intéresse, je pense qu'il serait utile de joindre un fichier d'exemple.

Bonne journée.

Bonjour à tous,

D'abord merci pour vos retours ! J'ai d'abord essayé le code de François, mais toujours aussi lent, donc je suis passée au code d'Arturo et là miracle ! Le code s'exécute parfaitement et très rapidement ! Je pense que ce sont les boucles qui ralentissent la macro.

En tout cas merci bien !

Eloïse

Salut Eloïse,
Salut les as,

histoire de ne pas te méprendre sur les boucles et en faire des cauchemars, sache qu'une boucle bien utilisée avec les bons outils peut accomplir des miracles de rapidité sans t'obliger à créer des colonnes et des colonnes de calculs intermédiaires pour arriver à tes fins.
Cela dit, toute solution apportant satisfaction est excellente, bien évidemment!

A+

Rechercher des sujets similaires à "macro trop lente execution min"