Tache cyclique, toutes les 5s - A l'aide

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

Tortue Géniale

XLDnaute Nouveau
Bonjour

Je viens de passer ma journée au boulot à essayer de créer une tache cyclique qui s’exécute toutes les 5s.
Je ne souhaite pas utiliser la fonction worksheetscalculate car j'ai des calculs dans ma feuille et le programme boucle indéfiniment.
Je ne souhaite pas utiliser le fonction application.ontime car j'ai plein d'autre chose qui tourne dans le classeur.
Je souhaite tout simplement trouver un événement qui exécute ma macro toutes les 5s.
Évidement je n'ai pas internet au boulot et je suis en train de peter les plombs.
Merci de votre aide.
 
Re : Tache cyclique, toutes les 5s - A l'aide

Bonsoir.
Je saurais vous écrire très précisément un vrai timer qui s'exécute quoi qu'il arrive toutes les 5 secondes.
Mais je vous préviens: si, au lieu de n'agir que sur des objets MsForms ou des variables VBA, il dérange Excel pendant l'exécution de ses routines d'évaluations de formules, c'est la terminaison silencieuse et brutale d'Excel assurée.
Cordialement
 
Re : Tache cyclique, toutes les 5s - A l'aide

Bonjour Tortue Géniale

Et si tu nous expliquais le but du jeu 😕.

Vous êtes prêt ? Alors c'est parti.
- J'utilise un système d'acquisition préhistorique qui me renvoie des mesures par des liens DDE ainsi que l'heure (hh:mm:ss), cela toutes les secondes.
- Je dois convertir mes mesures par un bête calcul (Je fait ça sur une feuille appelée "Mesures").
- Je souhaite faire des courbes en temps réel avec ces mesures.
- Dans une feuille appelée "Tableau Dynamique" j'ai à la ligne 4327 et sur plusieurs colonnes la recopie des mesures de la feuille "Mesures" avec dans la colonne A le temps.
- De la ligne 6 à 4325 j'ai mon tableau avec tout mes points de mesures. Pour remplir mon tableau j'ai crée une macro appelée "Tableau Dynamique" qui copie mes colonnes de la ligne 7 à 4325 à la ligne 6 (je copie tous mes points d'une cellule dans la cellule du dessus) puis je copie ma ligne 4327 (la mesure en cours) à la ligne 4325. Ma macro "Tableau Dynamique" est lancée par la fonction "WorksheetsCalculate" et conditionnée par un écart entre la ligne 4327 et 4325 > 5s.

Jusque la tout va bien, mais les choses se compliquent, j'ai une deuxième feuille "Tableau Dynamique 5s" qui fait une moyenne glissante sur 6 points (6*5=30s) des mesures de la feuille "Tableau Dynamique". Avec ces données je souhaite faire des graphiques qui se rafraichissent tout seul (ça fonctionne avec 720 points).

Le problème que j'ai est que quand tout cela fonctionne Excel ne s'en sort pas et la fonction WorksheetsCalcule s’exécute en boucle.

Je souhaite donc trouver une fonction qui s’exécute toutes les 5s pour m'affranchir de la fonction WorksheetsCalculate.

J'ai testé dans la journée la fonction Application.Ontime dans une macro "A" qui en appelle une macro "B". La routine "B" fait la macro "Tableau Dynamique" puis rappelle "A" mais mes graphiques ne se mettent plus à jour.


Et voila vous savez tout, je peux même envoyer un fichier mais il est un peut lourd.

Mon pc vous remercie de votre aide car il a peur de passer par la fenêtre du 2eme étage.
 
Dernière édition:
Re : Tache cyclique, toutes les 5s - A l'aide

Bonsoir.
Je saurais vous écrire très précisément un vrai timer qui s'exécute quoi qu'il arrive toutes les 5 secondes.
Mais je vous préviens: si, au lieu de n'agir que sur des objets MsForms ou des variables VBA, il dérange Excel pendant l'exécution de ses routines d'évaluations de formules, c'est la terminaison silencieuse et brutale d'Excel assurée.
Cordialement

Pourquoi pas je pourrait tester avec mon programme. Merci
 
Re : Tache cyclique, toutes les 5s - A l'aide

Tout d'abord, ceci à mettre en tête d'un module dédié à tous les problèmes de temps réels:
VB:
Option Explicit
Public Declare Function GetTickCount Lib "kernel32.dll" () As Long
Public Declare Function SetTimer Lib "user32.dll" _
(ByVal hwnd As Long, ByVal nIDEvent As Long, ByVal uElapse As Long, ByVal lpTimerFunc As Long) As Long
Rem. Sub MonTimer(ByVal hwnd As Long, ByVal uMsg As Integer, ByVal idEvent As Integer, ByVal dwTime As Long)
Public Declare Function KillTimer Lib "user32.dll" _
(ByVal hwnd As Long, ByVal nIDEvent As Long) As Long
GetTickCount n'a pas de rapport direct avec le problème, mais j'ai bien l'impression qu'il vous sera utile aussi: il donne le nombre de millisecondes écoulées depuis le lancement de Windows.

Un peu plus bas dans ce module:
VB:
Sub Évènements()
Application.EnableEvents = Not Application.EnableEvents
BoutonMsg Application.EnableEvents, _
"Traiter évènements", "Prise en charge des évènements RÉACTIVÉE", 6852, _
"Ignorer évènements", "Prise en charge des évènements DÉSACTIVÉE", 1019
If Not UfÉvènements.Visible Then
UfÉvènements.Afficher
SetTimer 0, 0, 40, AddressOf TimerÉvèn
End If
End Sub
Private Static Sub TimerÉvèn(ByVal hwnd As Long, ByVal uMsg As Integer, ByVal idEvent As Integer, ByVal dwTime As Long)
Dim ÉtatNoté As Boolean
If Application.EnableEvents Xor ÉtatNoté Then
ÉtatNoté = Application.EnableEvents
BoutonMsg ÉtatNoté, "Traiter évènements", "", 6852, "Ignorer évènements", "", 1019
End If
If Not UfÉvènements.Visible Then KillTimer 0, idEvent Else UfÉvènements.MàJParTimer
End Sub
BoutonMsg est une procédure à moi qui échange le "FaceId" et le libellé d'un bouton de barre d'outil.
UfÉvènements est un Userform montrant juste un gros voyant vert qui peut s'allumer ou s'éteindre ...progressivement ! (étais je défoncé quand j'ai décidé ça ?...). La cadence de cette animation est pilotée depuis le timer TimerÉvèn qui s'exécute toutes les 40 millisecondes.
Recommandations importantes:
1) - Testez d'abord votre timer comme une procédure ordinaire depuis une boucle de test. ELIMINEZ TOUT RISQUE DE PLANTAGE.
2) - Avant les premiers essais comme timer (par SetTimer 0, 0, Cadence_ms, AddressOf MaProcureTimer), SAUVEGARDEZ LE CLASSEUR.
Autres conseils:
Écrivez le timer aussi court que possible. Ne le "tuez" pas de l'extérieur, laissez lui une consigne de se faire Harakiri quand il s'exécutera.
Cordialement.

P.S. Évitez d'engager des modifications de plages directement par le timer.
Vous faites beaucoup d'autres opérations en permanence à des moments où vous êtes sûr qu'Excel est en état de les faire. Vous pourriez simplement tester si une variable piblic As Boolean a été mise True par le timer. Je réfléchit à haute voie (heu... à clavier sous la main) Étudiez toutes façons d'utiliser GetTickCount. Peut être n'avez vous plus besoin de timer. Utilisez aussi DoEvents de temps à autre, notamment là ou vos graphiques paraissent n'avoir plus le temps de se mettre à jour.
 
Dernière édition:
Re : Tache cyclique, toutes les 5s - A l'aide

Bonjour

Pourquoi pas ceci
Une boucle de 5s dans une boucle infinie


Code:
Function Lancer()
Do While a = a
    DoEvents: d = Timer
    Do While f - d < 5: f = Timer: DoEvents: Loop
    Feuil1.Range("A1") = Feuil1.Range("A1").Value + 1 'ton appel de fonction ici
Loop
End Function

Code:
Private Sub Worksheet_Change(ByVal Target As Range)
Lancer
End Sub

Code:
Private Sub Workbook_Open()
Lancer
End Sub
 
Re : Tache cyclique, toutes les 5s - A l'aide

Bonsoir

Merci à tous de votre participation.
J'ai trouvé aujourd'hui une solution qui m'a permise de simplifier mon programme. Je dois encore la tester.
Je testerai aussi vos propositions :
- Dranreb : j'ai lu ta solution et j'ai rien compris car je ne suis pas assez fort, je testerai quand même pour comprendre
- Habitude : j'ai aussi lu ta solution et elle me semble plus abordable, je la testerai également si j'ai le temps demain

En tout cas merci de m'avoir aider, j'étais désespéré hier soir.
 
Re : Tache cyclique, toutes les 5s - A l'aide

Bonjour.
Ce n'étais pas une solution mais un exemple de programmation d'un timer qui n'a rien à voir.
Pour une solution il m'aurai fallu un fichier joint. Comment aurais je pu imaginer comment ça doit s'articuler dans ton fichier ?
Cordialement.
 
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

Retour