Améliorer une macro pour rendre son exécution plus rapide

Fermé
jacky128 Messages postés 2 Date d'inscription mercredi 23 octobre 2013 Statut Membre Dernière intervention 14 novembre 2013 - 14 nov. 2013 à 08:57
Zoul67 Messages postés 1959 Date d'inscription lundi 3 mai 2010 Statut Membre Dernière intervention 30 janvier 2023 - 14 nov. 2013 à 11:45
Bonjour,

J'ai créé une macro dont certaines parties du code ont été écrites par enregistrement de mes actions sur le fichier. J'ai ensuite remanié le code pour supprimer certaines lignes que j'ai pu identifier comme étant superflues, mais ma macro reste assez lente.

Voici le code:
Sub MiseàJour()

'

Dim WbsK As Workbook
Dim Cel As Range
'
'Extraction
'
'Copier-Coller Liste Arrêts
'
Sheets("Niveau2").Columns("A:D").ClearContents
Sheets("Niveau3").Columns("A:D").ClearContents
'
'Ouvrir le fichier des arrêts
Set Wbks = Workbooks.Open(Filename:="T:Extractions\ListeArrets.xlsx")
'
'Réactiver ce classeur
ThisWorkbook.Activate
'
'Copier les colonnes du classeur source et les coller dans ce classeur
Wbks.Sheets("Résultats").Columns("F:I").Copy
Windows("Arrêts de ligne.xlsm").Activate
Sheets("Niveau2").Select
Range("A1").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Range("A1").Select
Sheets("Niveau3").Select
Range("A1").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Range("A1").Select
'
'
'
'
'
''
'
Sheets("TCD").Select
'
'Suppression des filtres
'Filtre temps total (valeurs nulles)
ActiveSheet.PivotTables("TCD niveau3").PivotFields("Temps total") _
.CurrentPage = "(All)"
With ActiveSheet.PivotTables("TCD niveau3").PivotFields( _
"Temps total")
.PivotItems("0").Visible = True
End With
'Filtre 3 premières causes
ActiveSheet.PivotTables("TCD niveau3").PivotFields("Niveau 2"). _
ClearValueFilters
'
'Actualiser les données du tableau
ActiveSheet.PivotTables("TCD niveau3").PivotCache.Refresh
'
'Filtrer les 3 premières causes
ActiveSheet.PivotTables("TCD niveau3").PivotFields("Niveau 2"). _
PivotFilters.Add Type:=xlTopCount, DataField:=ActiveSheet.PivotTables( _
"TCD niveau3").PivotFields("Somme de Pourcentage du temps"), _
Value1:=3
'
'Filtrer les valeurs nulles
ActiveSheet.PivotTables("TCD niveau3").PivotFields("Temps total") _
.CurrentPage = "(All)"
With ActiveSheet.PivotTables("TCD niveau3").PivotFields( _
"Temps total")
.PivotItems("0").Visible = False
End With
'
'Supprimer le filtre "cellules vides" sur le feuillet du graphique
Sheets("Graphique niveau3").Select
ActiveSheet.Range("$C$1:$C$52").AutoFilter Field:=1
'
'Supprimer le contenu du graphique
Columns("A:B").Select
Selection.ClearContents
With Selection.Interior
.Pattern = xlNone
.TintAndShade = 0
.PatternTintAndShade = 0
End With
'
'Copie du TCD
Sheets("TCD").Select
Columns("B:C").Select
Selection.Copy
Range("A1").Select
'
'Coller valeurs et mise en forme
Sheets("Graphique niveau3").Select
Range("B1").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
Selection.PasteSpecial Paste:=xlPasteFormats, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
'
'Masquer les cellules vides
ActiveSheet.Range("$C$1:$C$52").AutoFilter Field:=1, Criteria1:="<>"
'
'Couleurs du graphique
Dim Sér As Series, PlgX As Range, Zon As Range, Cels As Range, I As Long
Set Sér = ActiveSheet.ChartObjects(1).Chart.SeriesCollection(1)
Set PlgX = Application.Range(Split(Sér.Formula, ",")(1))
For Each Zon In PlgX.SpecialCells(xlCellTypeVisible)
For Each Cels In Zon
I = I + 1: Sér.Points(I).Interior.Color = Cels.Interior.Color
Next Cels, Zon
Range("A1").Select
'
'Fin SPI et date page d'accueil
'
Sheets("Accueil").Select
Windows("ListeArrets.xlsx").Activate
Sheets("En-Tête").Range("A2:C4").Copy
Windows("Arrêts de ligne UP1.xlsm").Activate
Sheets("Accueil").Select
Range("B2").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Windows("ListeArrets.xlsx").Activate
ActiveWindow.Close
'
'Extraction TRH
'
'
'Préparation du fichier pour accueillir les nouvelles données
Sheets("TRH").Select
Cells.Select
Selection.EntireRow.Hidden = False
Range("A1:W17").Select
Selection.ClearContents
'
'Copier les nouvelles données de l'extraction
Workbooks.Open Filename:= _
"T:\Extractions\Indicateur_HFE.xls"
Range("E9:AB25").Select
Selection.Copy
'
'Copier les valeurs
Windows("Arrêts de ligne.xlsm").Activate
Range("B1").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
'
'Préparer le tableau pour le diagramme
Range("B28:I34").Select
Selection.Copy
Range("B36").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Application.CutCopyMode = False
'
'Masquer les lignes inutiles
Rows("1:17").Select
Selection.EntireRow.Hidden = True
Rows("28:35").Select
Selection.EntireRow.Hidden = True
'
'Trier les données par TRH décroissant
Range("B36:I42").Select
ActiveWorkbook.Worksheets("TRH").Sort.SortFields.Clear
ActiveWorkbook.Worksheets("TRH").Sort.SortFields.Add Key:=Range("G42:G48"), _
SortOn:=xlSortOnValues, Order:=xlDescending, DataOption:=xlSortNormal
With ActiveWorkbook.Worksheets("TRH").Sort
.SetRange Range("B36:I42")
.Header = xlGuess
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
'
'Fin
Range("A18").Select
Sheets("Accueil").Select
Range("A1").Select
Windows("Indicateur_HFE.xls").Activate
ActiveWindow.Close
End Sub

Quelqu'un pourrait-il m'aider à épurer le langage afin de rendre la macro plus rapide à l'exécution ??

Merci d'avance pour votre aide !
A voir également:

2 réponses

f894009 Messages postés 17189 Date d'inscription dimanche 25 novembre 2007 Statut Membre Dernière intervention 6 mai 2024 1 705
Modifié par f894009 le 14/11/2013 à 11:26
Bonjour,

deja ceci: fige l'ecran le temp de l'execution

'au debut apres les def de variables
Application.ScreenUpdating = False
'a la fin avant le end sub
Application.ScreenUpdating = True
0
Zoul67 Messages postés 1959 Date d'inscription lundi 3 mai 2010 Statut Membre Dernière intervention 30 janvier 2023 149
14 nov. 2013 à 11:45
Bonjour,

Ta question est trop longue pour qu'on y réponde précisément, surtout que nous n'avons pas tes fichiers pour constater le volume de données.
Je peux toutefois te conseiller d'espionner les délais des différentes étapes avec un Timer

mouchard=""
t=Timer
mouchard=mouchard & Chr(10) & (Timer-t)
.
.
.
mouchard=mouchard & Chr(10) & (Timer-t)
.
.
.
mouchard=mouchard & Chr(10) & (Timer-t)
.
.
.
MsgBox mouchard

A+
0