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
NextA+ 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 SubCdlt
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 = TrueA+
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+