Effet de la mise à jour de L'écran
j'ai essayé de mesurer les temps d'exécution de code pour évaluer les différences entre l'exécution de mes scripts localement et sur mon serveur. A un moment j'ai oublié de désactiver!--0-- > et j'ai été reconnaissant de ne pas être sensible aux lumières clignotantes avant d'y réfléchir plus en détail:
quand j'ai commencé à utiliser VBA
j'ai toujours supposé qu'il était juste utilisé pour ne pas effrayer les utilisateurs finaux en pensant que leur PC était sur le point de s'écraser. Lorsque j'ai commencé à lire davantage dans l'amélioration de la efficacité de votre code j'ai compris ce qu'il était pour mais combien d'un effet fait screen updating
vraiment sur votre codes temps d'exécution?
5 réponses
désactiver la mise à jour de l'écran ne fera une différence dans le temps d'exécution que si le code interagit avec Excel d'une manière qui provoque des changements dans le contenu de l'écran. Plus l'écran est gros, plus l'impact sera important. Les autres réponses bien le démontrer.
les autres paramètres d'application qui peuvent faire une différence dans le temps d'exécution sont le calcul et la gestion des événements. Utilisez ce modèle de code comme point de départ (le gestionnaire d'erreurs s'assure que les propriétés sont tourné le dos à la fin de la sous -, même si des erreurs)
Sub YourSub()
On Error GoTo EH
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
Application.EnableEvents = False
' Code here
CleanUp:
On Error Resume Next
Application.ScreenUpdating = True
Application.Calculation = xlCalculationAutomatic
Application.EnableEvents = True
Exit Sub
EH:
' Do error handling
GoTo CleanUp
End Sub
il existe D'autres techniques qui peuvent améliorer encore davantage la vitesse d'exécution.
Le plus utile include
- Éviter
Select
,Activate
etActiveCell/Sheet/Workbook
autant que possible. Au lieu de cela, déclarez et assignez des variables et référez-les. - lorsque vous faites référence à de grandes plages, copiez les données de plage à un tableau variant pour le traitement et copiez le résultat en arrière à la plage après.
- Utiliser
Range.SpecialCells
,Range.Find
etRange.AutoFilter
pour limiter le nombre de cellules référencées.
Il y a beaucoup d'exemples de ces techniques.
si vous voulez voir un exemple assez drastique de pourquoi ScreenUpdating
est important, exécutez le code suivant. Il me faut environ 45 fois plus de temps dans Excel 2011 pour exécuter ce swap sans ScreenUpdating = false
! C'est un énorme différence de temps.
Sub testScreenUpdating()
Dim i As Integer
Dim numbSwitches As Integer
Dim results As String
'swap between sheets this number of times
numbSwitches = 1000
'keep track of time
Dim startTime As Double
startTime = Time
'swap between sheets 1/2 (need both sheets or this will crash)
For i = 1 To numbSwitches
Sheets(1 + (i Mod 2)).Select
Next i
'get results
results = "Screen Updating not disabled: " & Format(Time - startTime, "hh:mm:ss") & " seconds"
startTime = Time
'scenario 2 - screenupdating disabled
Application.ScreenUpdating = False
'swap between sheets 1/2 (need both sheets or this will crash)
For i = 1 To numbSwitches
Sheets(1 + (i Mod 2)).Select
Next i
Application.ScreenUpdating = True
'get results for part two
results = results & vbCrLf & "Screen Updating IS disabled: " & Format(Time - startTime, "hh:mm:ss") & " seconds"
'show results
MsgBox results
End Sub
en outre, pendant que nous parlons des moyens d'accroître l'efficacité, un autre point clé est que Select
,Selection
et Activate
sont rarement (si jamais) nécessaires. Lorsque vous enregistrez des macros, il utilise toujours ces mais il y a très peu de situations où vous devez réellement les utiliser en code. De même, quoi que ce soit avec Active
dans le titre (ActiveCell
) est normalement une indication que vous aurez un code plus lent parce que vous êtes probablement en train de sélectionner des cellules.
vous pouvez presque toujours vous référer aux cellules/feuilles de travail spécifiquement et éviter select. Par exemple:
msgbox (Worksheets(1).Range("A1").value)
fonctionne que vous soyez ou non sur la première feuille de travail. Une nouvelle erreur commune de VBA est de faire quelque chose de plus comme:
Worksheets(1).Select
msgbox (Range("A1").value)
ce qui est une étape inutile.
cela ajoute beaucoup de temps aux durées d'exécution du code.
tout D'abord j'ai utilisé le script écrit par Richie (UK) Post #7 Ici
simplement, Il parcourt une boucle en changeant la valeur de i dans une cellule. Je l'ai légèrement modifié pour qu'il boucle 10.000 fois et je l'exécute 10 fois pour la taille de l'échantillon.
Quel est l'effet de la mise à jour de l'écran sur la vitesse d'exécution de mes codes?
ce sont les durées d'exécution quand Screen Updating
était invalide et activé:
Disabled Enabled
0.61909653 2.105066913
0.619555829 2.106865363
0.620805767 2.106866315
0.625528325 2.102403315
0.625319976 2.0991179
0.621287448 2.105103142
0.621540236 2.101392665
0.624537531 2.106866716
0.620401789 2.109004449
comme vous pouvez le voir, il faut presque 3,5 fois plus de temps pour exécuter le code quand Screen Updating
n'est pas désactivé.
ces deux codes ont été excités à l'aide du bouton Exécuter dans L'éditeur VB, au lieu de "regarder" la feuille de calcul.
2 lignes simples au début et à la fin de votre code:
Application.ScreenUpdating = False
Application.ScreenUpdating = True
mais, ils peuvent avoir un grand effet sur l'efficacité de votre exécution!
Remarque: Évidemment le avantages de l' Screen Updating
sera bien connu de beaucoup ici, mais cela peut être utile pour les débutants et je trouve intéressant de voir les chiffres!
je sais que c'est un vieux thread, mais:
- Set
ScreenUpdating = true
, mais n'oubliez pas de revenir à son ancienne valeur. - la modification des Cahiers de travail va aussi réinitialiser
ScreenUpdating
.
il y a une chose importante à savoir sur la mise à jour d'écran que je n'ai pas vu dans aucune réponse précédente. À partir de mon propre test, je découvre que la mise à jour de l'écran d'arrêt et on prend environ 15ms (testé en C# via Excel Interop). Gardez cela à l'esprit si vous exécutez quelque chose qui prendrait moins de temps. Et après tout, n'activez pas la mise à jour de l'écran plusieurs fois dans une boucle. Ce serait un vrai tueur de performance.
et encore une note (que vous ne voulez probablement pas entendre) si vous voulez rapide de l'utilisation de C++. Il est généralement 5 à 10 fois plus rapide (ne me rattrapez pas ici cela dépend de ce que vous faites vraiment) que VBA.