temps d'exécution croissant pour écriture dans un tableau structuré
Bonjour,
je me forme à l'usage d'Excel et à la programmation VBA, et je suis en train d'explorer le bon usage des tableaux structurés en VBA.
Voici le contexte :
- un tableau structuré à 8 colonnes déjà existant dans une feuille de calcul,
- une macro VBA qui vide ce tableau avec ...ListObject.DataBodyRange.Delete
- puis qui remplit ce tableau à l'aide d'une boucle For qui tourne 579 fois (nombre arbitraire)
- dans une itération de la boucle, il y a une insctruction Add pour ajouter la ligne, puis une instruction Count pour récupérer le numéro de la nouvelle ligne, puis 8 instructions ...DataBodyRange(ligne,colonne)=cpt pour écrire la valeur du compteur de la boucle dans les 8 colonnes de la ligne
Voici ce que j'observe :
- à la 1ère exécution de la macro, le temps d'exécution est de l'ordre de 0,8s
- à chaque exécution supplémentaire, le temps d'exécution augmente de l'ordre de 0,1s
- si je ferme le fichier puis que je le rouvre, ça recommence à partir de 0,8s (puis ça augmente progressivement de 0,1s)
Voici mes questions :
- est-ce que c'est normal que ça augmente à chaque exécution ? (alors que le traitement est le même !)
- à votre avis, qu'est-ce que je fais de travers ?
Je ne comprends pas ce qui se passe, et je n'ai pas trouvé d'infos à ce sujet jusque là.
Merci d'avance à ceux qui se pencheront sur la question.
[EDIT : voici le code de la procédure]
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64
|
Sub creer_ts_v1()
' Fonction ADD dans boucle FOR pour ajouter 579 lignes
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' désactiver les MAJ cf affichage & recalcul pour gagner du temps à l'exécution
Application.ScreenUpdating = False
Application.DisplayStatusBar = False
Application.EnableEvents = False
ActiveSheet.DisplayPageBreaks = False
Application.Calculation = xlCalculationManual
' récupérer l'heure courante au début (pour messure du temps d'exécution)
tempsDebut = Timer
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' nom du ts à manipuler
LDD = "ts_v1"
' RAZ TS
If Not Range(LDD).ListObject.DataBodyRange Is Nothing Then
Range(LDD).ListObject.DataBodyRange.Delete
End If
' boucle FOR
For cpt = 1 To 579
' ajouter 1 ligne dans le TS
Range(LDD).ListObject.ListRows.Add
ligne = Range(LDD).ListObject.ListRows.Count
' compléter la ligne 1 avec le n° du cpt
Range(LDD).ListObject.DataBodyRange(ligne, 1) = cpt
Range(LDD).ListObject.DataBodyRange(ligne, 2) = cpt
Range(LDD).ListObject.DataBodyRange(ligne, 3) = cpt
Range(LDD).ListObject.DataBodyRange(ligne, 4) = cpt
Range(LDD).ListObject.DataBodyRange(ligne, 5) = cpt
Range(LDD).ListObject.DataBodyRange(ligne, 6) = cpt
Range(LDD).ListObject.DataBodyRange(ligne, 7) = cpt
Range(LDD).ListObject.DataBodyRange(ligne, 8) = cpt
Next
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' récupérer l'heure courante à la fin (pour messure du temps d'exécution)
tempsFin = Timer
' réactiver les MAJ cf affichage & recalcul à la fin
Application.ScreenUpdating = True
Application.DisplayStatusBar = True
Application.EnableEvents = True
ActiveSheet.DisplayPageBreaks = True
Application.Calculation = xlCalculationAutomatic
' affichage de fin pour prévenir l'utilisateur (avec ou sans mesure du temps d'exécution)
MsgBox "FIN - " & tempsFin - tempsDebut & "s"
'MsgBox "FIN"
End Sub |