A voir également:
- Application.screenupdating = false ne fonctionne pas
- Application.ScreenUpdating ✓ - Forum VB / VBA
- Application.ScreenUpdating = False ne fonctionne pas - Forum Excel
- Initialize atkacpi device returns false ✓ - Forum Javascript
- Reagentc.exe set os image false ✓ - Forum Windows 10
- USB Charger + - Forum Pilotes (drivers)
10 réponses
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
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
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 ....
« 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 ....
Bonjour le fil,
Là comme c'est dit dans le sujet de base, pour moi il s'agirait plutôt de
?!
Là comme c'est dit dans le sujet de base, pour moi il s'agirait plutôt de
ActiveWorbook.RefreshAll
?!
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 :
Contrôle que tu aies sensiblement le même gain en calcul.
Les résultats devraient être à jour au final.
eric
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
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
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..
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..
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 ?
tu ne te sers même pas de i dans ta boucle, pas étonnant que rien ne change...
Idem pour j.
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.
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.
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.
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.
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.
Bonjour,
Remplaces
Par un recalcul de la feuille qui contient le graphique (je suppose que c'est Alerte) :
Autre part, tes déclarations en Static sont inutiles vu que tu calcule la valeur à chaque fois
Remplaces Static par Dim
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
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 :)
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 :)
Bonjour,
Finalement, j'ai opté pour un DoEvents à la place
Comme c'est trop rapide je l'ai mis dans une boucle :
Exemple : https://mon-partage.fr/f/7MJHL71i/
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/