Application.screenupdating = True ne fonctionne pas sur tous les PC

jlnpruvost -  
eriiic Messages postés 24603 Date d'inscription   Statut Contributeur Dernière intervention   -
Bonjour,

J'ai créé une macro qui permet de modifier les valeurs d'un tableau au fur et à mesure du temps, pour que l'on puisse voir le phénomène physique (la courbe) évoluer dans le temps sur le graphe associé.

J'utilise la formule Application.ScreenUpdating à chaque boucle.
Cela fonctionne très bien sur mon PC. Mais quand je teste sur un autre PC, cela ne fonctionne plus.


Configuration: Windows / Chrome 84.0.4147.105

10 réponses

Mike-31 Messages postés 18405 Date d'inscription   Statut Contributeur Dernière intervention   5 135
 
Bonjour,

application.screenupdating est utiliser pour arrêter ou rétablir le rafraîchissement écran afin d'éviter le scintillement ou les déplacement pendant l’exécution d'un code macro ce qui permet de raccourcir le temps d’exécution du code.

pour cela en début de code on écrit
application.screenupdating=false


et en fin de code ne pas oublier de rétablir les fonctions d'Excel avec
application.screenupdating=True
avant ton End Sub
0
Patrice33740 Messages postés 8561 Date d'inscription   Statut Membre Dernière intervention   1 780
 
Bonjour,

« Mais quand je teste sur un autre PC, cela ne fonctionne plus. »
C'est-à-dire ?
Pour avoir une réponse, il faut le contexte et des précisions ....
Que se passe-t'il (ou pas) ??
Quelles versions d'Excel sur chaque PC ?
Combien de fenêtres ouvertes ?
Quelle est le code utilisé ???
Il n'y a pas besoin de screenupdating pour voir une courbe évoluer temporellement !
Éventuellement une gestion des calculs ....
0
Yoyo01000 Messages postés 1639 Date d'inscription   Statut Membre Dernière intervention   168
 
Bonjour le fil,

Là comme c'est dit dans le sujet de base, pour moi il s'agirait plutôt de

ActiveWorbook.RefreshAll


?!
0
eriiic Messages postés 24603 Date d'inscription   Statut Contributeur Dernière intervention   7 275
 
Bonjour,

là où ça ne fonctionne pas correctement, ça ne serait pas sur excel >=2013 et sa nouvelle interface SDI des fois ?
A la place de ScreenUpdating essaie de jouer sur la visibilité de la fenêtre :
ThisWorkbook.Windows(1).Visible = False
' ton code que tu veux accélerer
ThisWorkbook.Windows(1).Visible = True

Contrôle que tu aies sensiblement le même gain en calcul.
Les résultats devraient être à jour au final.
eric

0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
jlnpruvost Messages postés 5 Date d'inscription   Statut Membre Dernière intervention  
 
Bonjour,

Et merci pour vos réponses.

Je mets en PJ un graphe descriptif. (PS : je n'ai pas réussi à joindre le graphe finalement…)
En haut à gauche on a le graphe de départ de la température, qui est renseignée dans les cellules N2 à N11 de la feuille "Listes". Les valeurs sont obtenues aléatoirement pour simuler l'acquisition de données par un capteur, avec 36,6°C et 38,8°C comme température extrémales.
En cliquant sur le bouton refroidir/réchauffer, le sub Refroidir() s'exécute.

Voici le code :


Static TemperatureRel As Single 'Différence entre température actuelle et Température cible 37,5.
Static n As Integer
TemperatureRel = Worksheets("Listes").Range("N11").Value - 37.5
n = TemperatureRel * 10 * Sgn(TemperatureRel) 'n est le nombre de fois que l'on va devoir incrémenter la température (par tranche de 0,1°C) pour obtenir la température finale 37,5°C.


If n = 0 Then
MsgBox "Le patient n'a pas besoin d'être refroidi ni réchauffé"
Else
Worksheets("Alerte").Range("K13") = "Action en cours" 'Message pour que l'utilisateur patiente pendant l'exécution du code


For j = 1 To n 'Boucle faisant évoluer le graphique comme si on avait une acquisition en temps réel du refroidissement, jusqu'à ce que le point tout ? droite du graphe atteigne 37,5°C
Worksheets("Listes").Range("N11").Value = Worksheets("Listes").Range("N11").Value - Sgn(TemperatureRel) * 0.1
Worksheets("Listes").Range("N2").Value = Worksheets("Listes").Range("N3").Value
Worksheets("Listes").Range("N3").Value = Worksheets("Listes").Range("N4").Value
Worksheets("Listes").Range("N4").Value = Worksheets("Listes").Range("N5").Value
Worksheets("Listes").Range("N5").Value = Worksheets("Listes").Range("N6").Value
Worksheets("Listes").Range("N6").Value = Worksheets("Listes").Range("N7").Value
Worksheets("Listes").Range("N7").Value = Worksheets("Listes").Range("N8").Value
Worksheets("Listes").Range("N8").Value = Worksheets("Listes").Range("N9").Value
Worksheets("Listes").Range("N9").Value = Worksheets("Listes").Range("N10").Value
Worksheets("Listes").Range("N10").Value = Worksheets("Listes").Range("N11").Value
Application.ScreenUpdating = True
Next j

For i = 1 To 8 'Permet d'atteindre le régime stable : tous les points du graphe sont à 37,5°C
Worksheets("Listes").Range("N2").Value = Worksheets("Listes").Range("N3").Value
Worksheets("Listes").Range("N3").Value = Worksheets("Listes").Range("N4").Value
Worksheets("Listes").Range("N4").Value = Worksheets("Listes").Range("N5").Value
Worksheets("Listes").Range("N5").Value = Worksheets("Listes").Range("N6").Value
Worksheets("Listes").Range("N6").Value = Worksheets("Listes").Range("N7").Value
Worksheets("Listes").Range("N7").Value = Worksheets("Listes").Range("N8").Value
Worksheets("Listes").Range("N8").Value = Worksheets("Listes").Range("N9").Value
Worksheets("Listes").Range("N9").Value = Worksheets("Listes").Range("N10").Value
Worksheets("Listes").Range("N10").Value = Worksheets("Listes").Range("N11").Value
Application.ScreenUpdating = True

Next i
End If
EffacerConvergence 'autre sub qui permet d'effacer les messages type "Action en cours"

End Sub

@Mike-31 :
Excel 2007 est installé sur mon PC1 et Excel 2016 sur mon PC2.
Sur la version 2007, si je ne mets pas "Application.ScreenUpdating = True" comme ci-dessus, le graphe ne se mets à jour qu'à la fin du code. Mais si je le mets, ça fonctionne bien, on voit le graphe qui se modifie pendant le code (comme le graphe en bas à droite)
Sur la version 2016, qu'on mette ou pas ScreenUpdating = True, ça ne change pas le résultat, le graphe ne se met à jour qu'à la fin de lexécution du sub. Dans ce cas, autant que je fasse un sub en disant "Remplacer toutes les cellules de N2 à N11 par 37,5°C", ça sera plus rapide à s'exécuter… mais c'est pas ce que je souhaiterais avoir..

@Patrice33740 : Le bouton refroidir/réchauffer est situé sur la feuille "Alerte", sur laquelle le graphe est également présent (si on peut updater que la feuille alerte, l'exécution du sub sera peut-être plus rapide que si on update tout le classeur)

@Yoyo01000 et @Eriiic: J'ai essayé d'abord ActiveWorbook.RefreshAll ouis ThisWorkbook.Windows(1).Visible = True en les disposant à la place des Application.ScreenUpdating = True ci-dessus, aucun des deux ne fonctionne. on n'a une mise à jour du graphe qu'après l'exécution du sub Refroidir()

Je ne parviens pas à vous joindre ni la l'image explicative ni le fichier Excel par contre..
0
eriiic Messages postés 24603 Date d'inscription   Statut Contributeur Dernière intervention   7 275
 
Bonjour,

on y voit un peu plus clair sur ton besoin.
Essaie en mettant un DoEvents avant le Next.
eric

PS :
Ce sont mes yeux qui me jouent un tour ?
For i = 1 To 8

tu ne te sers même pas de i dans ta boucle, pas étonnant que rien ne change...
Idem pour j.

0
jlnpruvost Messages postés 5 Date d'inscription   Statut Membre Dernière intervention  
 
J'ai essayé avec le DoEvents, malheureusement cela ne fonctionne pas. Le graphique se met à jour après la macro.
D'ailleurs quand le graphique (qui est un graphique courbes) se met à jour, il y a une sorte de fondu entre la courbe initiale et la courbe finale. Peut-être que ça a un rapport avec mon soucis?
Du coup j'ai modifié le type de graphique en mettant nuage de points, mais ça n'a pas résolu le problème..

Pour i=1 To 8, c'est fait exprès, ca décale la courbe de droite à gauche.
Par exemple avec une courbe à 4 points :
i=1 :
Point 1= 37,8
Point 2=37,7
Point 3=37,6
Point 4 = 37,5

i=2 :
Point 1= 37,7
Point 2=37,6
Point 3=37,5
Point 4 = 37,5

i=3 :
Point 1= 37,6
Point 2=37,5
Point 3=37,5
Point 4 = 37,5

i=4 :
Point 1= 37,5
Point 2=37,5
Point 3=37,5
Point 4 = 37,5

C'est pour qu'on voit la courbe devenir plate, comme un trait que l'on trace, pour simuler le capteur qui atteint le régime stable.
0
jlnpruvost Messages postés 5 Date d'inscription   Statut Membre Dernière intervention   > jlnpruvost Messages postés 5 Date d'inscription   Statut Membre Dernière intervention  
 
Ca n'aurait pas un rapport avec une macro cachée d'Excel 2016 qui veut absolument que mon sub soit fini pour qu'il puisse faire son fondu entre la courbe initiale et la courbe finale?
Sur Excel 2007, j'ai pas de fondu enchaîné. C'est genre je modifie une valeur dans mon tableau et la courbe est remplacée par la nouvelle en instantané, sans transition visuelle.
0
eriiic Messages postés 24603 Date d'inscription   Statut Contributeur Dernière intervention   7 275 > jlnpruvost Messages postés 5 Date d'inscription   Statut Membre Dernière intervention  
 
Je réitère :
tu ne te sers même pas de i dans ta boucle, pas étonnant que rien ne change...
Idem pour j.
0
Patrice33740 Messages postés 8561 Date d'inscription   Statut Membre Dernière intervention   1 780
 
Bonjour,

Remplaces
    Application.ScreenUpdating = True

Par un recalcul de la feuille qui contient le graphique (je suppose que c'est Alerte) :
    Worksheets("Alerte").Calculate


Autre part, tes déclarations en Static sont inutiles vu que tu calcule la valeur à chaque fois
Remplaces Static par Dim


0
jlnpruvost Messages postés 5 Date d'inscription   Statut Membre Dernière intervention  
 
Patrice33740,

Tu as raison, le graphe est bien dans Worksheets(Alerte).
J'ai essayé Worksheets("Alerte").Calculate mais ça ne fonctionne toujours pas.
Toutes les valeurs de mon tableau se mettent à jour en temps réel. Seul le graphe se met à jour qu'après la fin de l'exécution de la macro sur Excel 2016

Merci pour Dim à la place de Static :)
0
Patrice33740 Messages postés 8561 Date d'inscription   Statut Membre Dernière intervention   1 780
 
Bonjour,

Finalement, j'ai opté pour un DoEvents à la place
Comme c'est trop rapide je l'ai mis dans une boucle :
Option Explicit
Sub Test()
Dim TemperatureRel As Double 'Différence entre température actuelle et Température cible 37,5.
Dim n As Integer, i As Integer, j As Integer, t As Variant, r As Range
Const delai% = 400
  Set r = Worksheets("Listes").Range("N2:N11")
  TemperatureRel = Worksheets("Listes").Range("N11").Value - 37.5
  n = TemperatureRel * 10 * Sgn(TemperatureRel)
  If n = 0 Then
    MsgBox "Le patient n'a pas besoin d'être refroidi ni réchauffé"
  Else
    Worksheets("Alerte").Range("K13") = "Action en cours"
    t = r.Value
    For i = 1 To n
      For j = LBound(t) To UBound(t) - 1
        t(j, 1) = t(j + 1, 1)
      Next j
      t(UBound(t), 1) = t(UBound(t), 1) - Sgn(TemperatureRel) * 0.1
      r.Value = t
      For j = 1 To delai: DoEvents: Next j
    Next i
    For i = 1 To UBound(t) - 1
      For j = LBound(t) To UBound(t) - 1
        t(j, 1) = t(j + 1, 1)
      Next j
      r.Value = t
      For j = 1 To delai: DoEvents: Next j
    Next i
  End If
  Worksheets("Alerte").Range("K13") = ""

End Sub


Exemple : https://mon-partage.fr/f/7MJHL71i/
0
jlnpruvost Messages postés 5 Date d'inscription   Statut Membre Dernière intervention  
 
Merci beaucoup Patrice33740 !!!!

Cela fonctionne très bien grâce à ton code, c'est exactement ce que je cherchais à faire !
Ca faisait un bon moment que je bloquais ! Merci !
0
eriiic Messages postés 24603 Date d'inscription   Statut Contributeur Dernière intervention   7 275
 
tu peux remarquer qu'il se sert de i et j dans les boucles...
0