XL 2016 Un chronomètre qui affiche TOUTES les secondes pendant la durée d'un traitement

crocrocro

XLDnaute Occasionnel
Bonjour,
Je cherche à afficher un chronomètre, par exemple ici dans la cellule A1 (nommée CHRONO) qui affiche TOUTES les secondes pendant que se déroule un traitement (Macro "Go" activé par le bouton GO). La macro "Go" déclenche le chronomètre et appelle la macro "MaMacroQuiPrendDuTemps" . Le chronomètre est arrêté avec le bouton STOP.
Mon problème : L'affichage du chronomètre ne se produit qu'après la fin de la macro "MaMacroQuiPrendDuTemps", c'est à dire environ 3 ou 4 secondes après le déclenchement du traitement.
Mon traitement réel est une suite de macros pour lesquelles :
- il n'y a aucune intervention utilisateur,
- le traitement ne comporte que des instructions séquentielles (pas de boucles qui auraient éventuellement permis tous les x itérations de reprendre la main pour afficher la valeur courante du chronomètre).
Ici, dans la macro "MaMacroQuiPrendDuTemps" j'ai mis des boucles, juste pour faire durer artificiellement le traitement.
Peut-être une solution en utilisant le chronomètre de windows avec un paramétrage du mode "Chronomètre" ou "Compte à rebours" serait possible, mais là encore, je ne sais pas faire.
Merci à ceux qui se pencheront sur mon problème.
Le code VBA

VB:
Public ProchainChrono, Start
Sub Go()
    Start = Timer()
    majChrono
    MaMacroQuiPrendDuTemps
End Sub
Sub MaMacroQuiPrendDuTemps()
Dim Cellule As Range

    'Du code bidon qui dure et pendant lequel le chrono doit continuer à s'afficher toutes les secondes
    For Each Cellule In Range("MA_PLAGE")
        Cellule.Value = Int((1000 - 1 + 1) * Rnd + 1)
    Next Cellule
    For Each Cellule In Range("MA_PLAGE")
        Cellule.Value = Cellule.Value * 3
    Next Cellule
        
End Sub
Sub majChrono()
    Sheets("Chrono").Range("CHRONO") = Format((Timer() - Start) / 3600 / 24, "hh:mm:ss")
    ProchainChrono = Now + TimeValue("00:00:1")
    Application.OnTime ProchainChrono, "majChrono"
End Sub
Sub Arret()
    On Error Resume Next
    Application.OnTime ProchainChrono, Procedure:="majChrono", Schedule:=False
End Sub
 

Pièces jointes

  • Chronometre.xlsm
    184.3 KB · Affichages: 8

crocrocro

XLDnaute Occasionnel
Bonjour Draneb et merci pour le fichier.
je n'ai pas tout essayé mais, par exemple sur la feuille Histoire du Temps, j'ai testé le bouton "Lancer un Chronomètre après avoir ajouté ma macro dans le traitement comme indiqué dans le code ci-dessous
VB:
Sub DémoChronomètre()
   With New UFmChrono: .Lancer Format(Now, "• hh:mm:ss")
      .PositNorm 6, 4: End With
    'ma macro perso
    MaMacroQuiPrendDuTemps
   End Sub
Sub MaMacroQuiPrendDuTemps()
Dim Cellule As Range

    'Du code bidon qui dure et pendant lequel le chrono doit continuer à s'afficher toutes les secondes
    For Each Cellule In Range("A2:A1000")
        Cellule.Value = Int((1000 - 1 + 1) * Rnd + 1)
    Next Cellule
    For Each Cellule In Range("A2:A1000")
        Cellule.Value = Cellule.Value * 3
    Next Cellule
    MsgBox "MaMacroQuiPrendDuTemps fini"
        
End Sub

Le décompte du chrono ne s'affiche que lorsque ma macro est terminée et ne résout donc pas mon problème.

1703838664341.png
 

Dranreb

XLDnaute Barbatruc
Pourquoi ne voulez-vous pas d'une barre de progression ?
Bien sûr ce serait mieux avec des boucles, mais même avec un code qui descend tout droit, vous pourriez exécuter des UFmProg.Avance entre chaque instruction.
Mettez au Début UFmProg.Tâche , N le nombre d'appels à UFmProg.Avance
Tout ça dans votre Sub MaMacroQuiPrendDuTemps, bien sûr.
Sinon il y faut au moins plein de DoEvents pour que le Rythmeur du l'UFmChrono ait des occasions de se déclencher ! Regardez ma Sub LeTraitementDontOnVeutSurveuillerLAvancement. C'est aussi une Sub avec une boucle faite pour perdre du temps. J'y ai mis un DoEvents, sinon elle ne peut rien laisser s'exécuter d'autre, de temps à autres, que son propre code. Elle est utilisée pour deux démos, une de l'UFmProg l'autre de l'UFmChrono.
 
Dernière édition:

Modeste geedee

XLDnaute Barbatruc
Bonjour,
Je cherche à afficher un chronomètre, par exemple ici dans la cellule A1 (nommée CHRONO) qui affiche TOUTES les secondes pendant que se déroule un traitement (Macro "Go" activé par le bouton GO). La
Bonsour®
c'est "Mamacroquiprendutemps" qui doit informer le chrono de l'état d'avancement !!
en cas de processus externe à Excel , point de salut
hormis un message d'attente non quantifié
VB:
Public Start
Sub Go()
    Start = Now()  
    MaMacroQuiPrendDuTemps
End Sub

Sub MaMacroQuiPrendDuTemps()
Dim Cellule As Range
    'Du code bidon qui dure et pendant lequel le chrono doit continuer à s'afficher toutes les secondes
    Application.Speech.Speak "1ere partie"
    [chrono].Offset(0, 1) = "C'est en cours 1ere phase": beep
    For Each Cellule In Range("MA_PLAGE")
        Cellule.Value = Int((1000 - 1 + 1) * Rnd + 1)
        [chrono] = Now - Start
        DoEvents
    Next Cellule

     Application.Speech.Speak "2eme partie"
       [chrono].Offset(0, 1) = "C'est en cours 2eme phase": beep  
For Each Cellule In Range("MA_PLAGE")
        Cellule.Value = Cellule.Value * 3
         [chrono] = Now - Start
         DoEvents
    Next Cellule

[chrono].Offset(0, 1) = "C'est fini": beep
 Application.Speech.Speak "Terminé": beep
End Sub
 
Dernière édition:

crocrocro

XLDnaute Occasionnel
Pourquoi ne voulez-vous pas d'une barre de progression ?
Bien sûr ce serait mieux avec des boucles, mais même avec un code qui descend tout droit, vous pourriez exécuter des UFmProg.Avance entre chaque instruction.
Mettez au Début UFmProg.Tâche , N le nombre d'appels à UFmProg.Avance
Tout ça dans votre Sub MaMacroQuiPrendDuTemps, bien sûr.
Sinon il y faut au moins plein de DoEvents pour que le Rythmeur du l'UFmChrono ait des occasions de se déclencher ! Regardez ma Sub LeTraitementDontOnVeutSurveuillerLAvancement. C'est aussi une Sub avec une boucle faite pour perdre du temps. J'y ai mis un DoEvents, sinon elle ne peut rien laisser s'exécuter d'autre, de temps à autres, que son propre code. Elle est utilisée pour deux démos, une de l'UFmProg l'autre de l'UFmChrono.
Justement, comme je l'ai indiqué, pas de boucle, pas de DoEvents possible.
Certaines instructions durent plusieurs secondes, donc incompatibles avec DoEvents.
Une autre précision, je veux que le chronomètre (Cellule , userform ou autre) soit visible dans la feuille à partir de laquelle je lance le traitement.
 

crocrocro

XLDnaute Occasionnel
Bonsour®
c'est "Mamacroquiprendutemps" qui doit informer le chrono de l'état d'avancement !!
en cas de processus externe à Excel , point de salut
hormis un message d'attente non quantifié
VB:
Public Start
Sub Go()
    Start = Now() 
    MaMacroQuiPrendDuTemps
End Sub

Sub MaMacroQuiPrendDuTemps()
Dim Cellule As Range
    'Du code bidon qui dure et pendant lequel le chrono doit continuer à s'afficher toutes les secondes
    Application.Speech.Speak "1ere partie"
    [chrono].Offset(0, 1) = "C'est en cours 1ere phase": beep
    For Each Cellule In Range("MA_PLAGE")
        Cellule.Value = Int((1000 - 1 + 1) * Rnd + 1)
        [chrono] = Now - Start
        DoEvents
    Next Cellule

     Application.Speech.Speak "2eme partie"
       [chrono].Offset(0, 1) = "C'est en cours 2eme phase": beep 
For Each Cellule In Range("MA_PLAGE")
        Cellule.Value = Cellule.Value * 3
         [chrono] = Now - Start
         DoEvents
    Next Cellule

[chrono].Offset(0, 1) = "C'est fini": beep
 Application.Speech.Speak "Terminé": beep
End Sub
Non, comme je l'ai écrit dans ma demande initiale , pas de boucle For, donc pas de DoEvents. Voir ma réponse à Dranreb
 

crocrocro

XLDnaute Occasionnel
Bonsoir Dranreb,
je vais essayer d'être un peu plus précis en ce qui concerne les contraintes :
Le chrono affiché doit être à jour à chaque seconde écoulée (après 1" doit afficher 1", après 2", 2" etc...), pas d'approximation, 1 seconde = 1 seconde.
Dans le code, certaines lignes traitent (1 ligne de code) une plage de 100 000 lignes, dont l'exécution peut durer plus d'1 seconde, d'où mon "pas de DoEvents"
Il faut donc considérer que le traitement "Mamacroquiprendutemps" est une boite noire sur laquelle on ne peut pas intervenir.
 

Dranreb

XLDnaute Barbatruc
S'il y a dans votre procédure des traitements sur lesquels vous n'avez aucune prise et qui durent plus d'une seconde en mobilisant toutes les ressources CPU sans jamais permettre, comme le fait DoEvents, à d'autres tâches en attente de s'exécuter, c'est mort, on ne peut absolument rien y faire, c'est tout.
 

Bernard_XLD

XLDnaute Barbatruc
Membre du Staff
Bonjour Patty58, Dranreb, Modeste geedee, le forum

@crocrocro , il y a cette fonction personnalisée conçue pour cela à l'origine
https://excel-downloads.com/threads/temps-ecoule-chrono.20056274/
voici un exemple d'application avec une barre de progression minutes, secondes et centièmes, sur un userform non modal
https://excel-downloads.com/threads...oulement-dun-programme.20057535/post-20432864
Vous pouvez aussi utiliser une deuxième instance Excel pilotée par la première, contenant le chrono déclenché par une boucle d'attente comme le propose Dranreb ou par un ontime, pour mettre à jour une cellule dans la première instance, l'important étant de séparer les deux processus macro et chrono pour qu'ils soient indépendants et puissent s'exécuter simultanément tout en restant interactifs.

Mais le problème principal vient peut être de votre "macro qui prend du temps", la réviser pourrait supprimer le besoin d'un chrono. Sur ce forum, nous avons déjà réduit des durées d'exécution de plusieurs minutes, voire plusieurs dizaines de minutes, à quelques centièmes de secondes, mais sans le code posant problème, impossible de proposer une évolution.

Cordialement,
Bernard_XLD
 

crocrocro

XLDnaute Occasionnel
Bonjour à tous,
Le but n'est pas de réduire le temps d'exécution de ma macro qui, en fonction du contexte (valeurs, paramètres saisis dans la feuille) peut durer jusqu'à plus de 20 secondes mais moins d'une minute. Le chronomètre doit rester affiché pendant une minute, à la fin de quoi, l'utilisateur reprend la main, la macro est alors terminée depuis longtemps.
Le chronomètre doit être affiché dans un coin de la feuille active.
J'ai compris, suite aux réponses de Dranreb et Modeste qu'il n'y avait pas de solution Excel (chronomètre dans cellule comme dans mon fichier Test ou userform).
Il resterait donc l'utilisation d'un chronomètre externe (horloge de windows ou l'un des nombreux chronomètres en ligne).
Dans ce cas pouvoir le piloter un minimum par du code : Déclenchement bien sûr, durée, mode chrono ou compte à rebours, position et dimensions dans la feuille.
Comme je l'ai dit plus haut, je ne sais pas faire mais je continue à chercher.
Merci Bernard pour ta contribution, Dranreb et Modeste de continuer à m'aider
 

Discussions similaires

Réponses
8
Affichages
660

Statistiques des forums

Discussions
312 207
Messages
2 086 247
Membres
103 163
dernier inscrit
Pelaez