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?

16
demandé sur ashleedawg 2012-09-12 19:37:36

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

  1. Éviter Select,Activate et ActiveCell/Sheet/Workbook autant que possible. Au lieu de cela, déclarez et assignez des variables et référez-les.
  2. 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.
  3. Utiliser Range.SpecialCells,Range.Find et Range.AutoFilter pour limiter le nombre de cellules référencées.

Il y a beaucoup d'exemples de ces techniques.

30
répondu chris neilsen 2016-04-05 15:45:39

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.

6
répondu Elysian Fields 2012-09-12 16:09:52

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!

3
répondu Alistair Weir 2012-09-12 15:37:36

je sais que c'est un vieux thread, mais:

  1. Set ScreenUpdating = true, mais n'oubliez pas de revenir à son ancienne valeur.
  2. la modification des Cahiers de travail va aussi réinitialiser ScreenUpdating.
1
répondu Frank 2018-04-05 15:55:46

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.

0
répondu Sekory 2014-04-09 21:06:46