Application Screen Updating

Bonjour à tous,

Je suis en train de réaliser une macro qui va me permettre de remettre mon fichier utilisé à zéro (vierge de toutes données). Pour ce faire, je fais appel de nombreuses fois à des macros que j'utilise pour naviguer dans mes différents onglets tous les jours pour remplir mon fichier, sauf que ici je les utilise pour supprimer les données insérées.

Exemple: je fais appel à la macro qui va se rendre directement sur mercredi et après je vais créer un code pour supprimer toutes les données que j'ai préalablement inséré ce jour là.

Mon problème, c'est que chacune de ces macro que j'utilise régulièrement contiennent l'Application ScreenUpdating = false au début puis true à la fin, afin de suspendre l'actualisation de l'écran lors de mes navigations.

Sauf que quand j'appelle l'une de ces macros lors de ma procédure de remise à zéro, l'écran se met automatiquement à jour à la fin de la réalisation de l'une de ces macros ce qui a pour effet de "crasher" Excel quelques minutes.

Ainsi, existe-t-il un moyen de désactiver tous les Application ScreenUpdating des macros appelées pour ne garder qu'une seule fois l'application dans ma procédure de remise à zéro, sans devoir tout réactiver?

Je met un bout de code de la procédure de remise à zéro (clear) et une macro appelée (précédent). Merci d'avance,

Viox

Sub Clear()

Application.ScreenUpdating = False

[...]

Do Until Range("B1") = 1
     Application.Run ("Feuil2.précédent")
Loop

[...]

Application.ScreenUpdating = True

End Sub
Sub précédent()
ActiveSheet.Unprotect
Application.ScreenUpdating = False

    variable = Range("A1")
    If variable < 12 Then Exit Sub
    debut = variable - 11
    fin = debut + 10
    ActiveSheet.ScrollArea = ""
    ActiveWindow.SmallScroll ToLeft:=11
    ActiveCell.Offset(0, -11).Select
    ActiveSheet.ScrollArea = ActiveSheet.Range(Columns(debut), Columns(fin)).Address
    Range("A1") = debut
    Range("B1") = Range("B1") - 1

Application.ScreenUpdating = True
ActiveSheet.Protect 
End Sub

Bonjour,

Tu dis "ce qui a pour effet de "crasher" Excel quelques minutes"

Que veux tu dire ? Excel se ferme ou se fige ?

Ce que tu peux essayer c'est de remettre le Screenupdating à TRUE juste avant d'exécuter la boucle DO et le remettre à FALSE juste après le LOOP

A te relire pour bien comprendre ton souci

Excel ne répond plus pendant quelques minutes..

J'ai bien essayé ta méthode, mais cela actualisera qu'en même ton écran après la réalisation de la macro précédent car celle-ci contient Application.ScreenUpdating = True.

Et ce que je souhaite c'est que mon écran soit figé du début de la procédure de remise à zéro jusqu'à la fin. Il ne doit y avoir aucun changement d'onglets ou tableau apparents à l'écran.

Bonjour,

Excel ne répond plus pendant quelques minutes..

Ce n'est pas 'crasher' ça...

Peut-être doit-il ré-évaluer des formules dépendantes, ce qui prend du temps.

Essaie en ajoutant Application.Calculation = xlCalculationManual au début.

Remettre Application.Calculation = xlCalculationAutomatic à la fin.

Et tu auras du mal à mettre Application.ScreenUpdating = True sur demande en fin de procédure puisque de toute façon il est exécuté d'office, que tu l'aies mis ou pas, sur le End Sub

eric

salut, j'ai eu le soucis pour un fichier que j'ai utilisé, j'ai gagné beaucoup de temps en suivant la remarque de Eriic concernant xlcalculation.

toutefois comme te le fait remarquer dan, tu peux essayer ceci:

Sub Clear()

Application.ScreenUpdating = False

[...]

Do Until Range("B1") = 1

     Application.Run ("Feuil2.précédent")

     Application.ScreenUpdating = False ' tu le met ici comme ça à chaque fois que tu sort de la macro il le remet à false

Loop

[...]

Application.ScreenUpdating = True

End Sub

Bonjour rvtoulon,

' tu le met ici comme ça à chaque fois que tu sort de la macro il le remet à false

Inutile, le =true aura été exécuté lors du End Sub de la macro appelée et donc le rafraichissement chronophage lancé.

Si empêcher le recalcul n'est pas suffisant, le plus efficace serait la suppression des feuilles et leur recréation à partir de feuilles modèle vierges (cachées éventuellement)

eric

Merci eriiic et rvtoulon,

Je ne savais pas qu'il n'était pas nécessaire de remettre Application.ScreenUpdating = True à la fin de la macro.

Du coup, si je comprend bien, cela veut dire que si je supprime toutes mes Application.ScreenUpdating = True à la fin de chacune des macros appelées, ma procédure de remise à zéro sera figée jusqu'au bout, c'est bien cela?

En tout cas, j'ai fait le test et ça a l'air de marcher.

Sub Clear()

Application.ScreenUpdating = False

[...]

Do Until Range("B1") = 1
     Application.Run ("Feuil2.précédent")
Loop

[...]

[barrer]Application.ScreenUpdating = True[/barrer] ' je supprime cette application car le "End Sub" sert de remise à jour de l'écran

End Sub
Sub précédent()
ActiveSheet.Unprotect
Application.ScreenUpdating = False

    variable = Range("A1")
    If variable < 12 Then Exit Sub
    debut = variable - 11
    fin = debut + 10
    ActiveSheet.ScrollArea = ""
    ActiveWindow.SmallScroll ToLeft:=11
    ActiveCell.Offset(0, -11).Select
    ActiveSheet.ScrollArea = ActiveSheet.Range(Columns(debut), Columns(fin)).Address
    Range("A1") = debut
    Range("B1") = Range("B1") - 1

[barrer]Application.ScreenUpdating = True[/barrer] ' je supprime car cela va remettre à jour mon écran lorsque cette dernière est appelée.
ActiveSheet.Protect 
End Sub

Du coup, si je comprend bien, cela veut dire que si je supprime toutes mes Application.ScreenUpdating = True à la fin de chacune des macros appelées, ma procédure de remise à zéro sera figée jusqu'au bout, c'est bien cela?

Si elles sont juste avant le End Sub elles ne servent à rien mais tu peux les laisser, ça ne change strictement rien.

eric

Je dis peut-être une bêtise, mais j'ai l'impression que ça change de le laisser ou non.

Dans le cas où j'utilise la macro "précédent" uniquement, on est d'accord qu'il n'y aucun changement Application.ScreenUpdating = True à la fin ou pas, étant donné que le "End Sub" agit comme tel de toute manière.

Par contre, si on appelle une macro via Application.run et que celle-ci contient Application.ScreenUpdating = True à la fin ou pas, cela change tout.

Car dans le cas où il n'y a pas l'application=true à la fin de la procédure appelée, cela ne va pas actualiser mon écran, alors que si on rajoute l'application=true à la fin de la procédure appelée, qu'il y ait Application.ScreenUpdating = False ou non après Application.run, cela actualisera qu'en même mon écran.

Etant donné que je ne suis pas un expert VBA, j'aimerais être sûr de ce que j'avance.

Dans le cas où j'utilise la macro "précédent" uniquement, on est d'accord qu'il n'y aucun changement Application.ScreenUpdating = True à la fin ou pas, étant donné que le "End Sub" agit comme tel de toute manière.

Tout à fait

Car dans le cas où il n'y a pas l'application=true à la fin de la procédure appelée, cela ne va pas actualiser mon écran, alors que si on rajoute l'application=true à la fin de la procédure appelée, qu'il y ait Application.ScreenUpdating = False ou non après Application.run, cela actualisera qu'en même mon écran.

Effectivement la feuille active sera ré-évaluée et rafraichie, donc tu peux les enlever.

Si tu passes en calcul manuel, plus aucun calcul (inutiles jusqu'à la fin de la raz) ne s'effectuera. Tu gagnes sur les 2 tableaux.

Et si tu as des MFC avec des formules lourdes (matricielles par exemple), tu peux aussi bloquer leur recalcul avec ActiveSheet.EnableFormatConditionsCalculation = False

Celles-ci sont à rétablir à la fin (=true) par contre.

eric

Super merci beaucoup Eric!!

Rechercher des sujets similaires à "application screen updating"