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

jlnpruvost -  
eriiic Messages postés 24581 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

  1. Mike-31 Messages postés 18405 Date d'inscription   Statut Contributeur Dernière intervention   5 147
     
    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
  2. Patrice33740 Messages postés 8400 Date d'inscription   Statut Membre Dernière intervention   1 784
     
    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
  3. Yoyo01000 Messages postés 1720 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
  4. eriiic Messages postés 24581 Date d'inscription   Statut Contributeur Dernière intervention   7 281
     
    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
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. jlnpruvost Messages postés 5 Statut Membre
     
    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
  7. eriiic Messages postés 24581 Date d'inscription   Statut Contributeur Dernière intervention   7 281
     
    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
    1. jlnpruvost Messages postés 5 Statut Membre
       
      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
      1. jlnpruvost Messages postés 5 Statut Membre > jlnpruvost Messages postés 5 Statut Membre
         
        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
      2. eriiic Messages postés 24581 Date d'inscription   Statut Contributeur Dernière intervention   7 281 > jlnpruvost Messages postés 5 Statut Membre
         
        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
  8. Patrice33740 Messages postés 8400 Date d'inscription   Statut Membre Dernière intervention   1 784
     
    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
  9. jlnpruvost Messages postés 5 Statut Membre
     
    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
  10. Patrice33740 Messages postés 8400 Date d'inscription   Statut Membre Dernière intervention   1 784
     
    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
  11. jlnpruvost Messages postés 5 Statut Membre
     
    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
    1. eriiic Messages postés 24581 Date d'inscription   Statut Contributeur Dernière intervention   7 281
       
      tu peux remarquer qu'il se sert de i et j dans les boucles...
      0