Microsoft 365 Macro excécutant successivement plusieurs macros avec une temporisation pour chaque macro

OBM

XLDnaute Nouveau
Bonjour tout le monde.
J'ai 4 macros : Phase0, Phase1, Phase3 et Phase4. J'aimerais les exécuter de la manière suivante :
Etape 1 : Exécuter "Phase0"
Etape 2 : Exécuter "Phase1" pendant 20s
Etape 3 : Exécuter "Phase2" pendant 5s
Etape 4 : Exécuter "Phase3" pendant 20s
Et je veux relancer cette procédure pendant 2 minutes.
Votre aide me sera d'une grande utilité et merci d'avance.
 

dysorthographie

XLDnaute Accro
La fonction Application.OnTime a pourtant bien fonctionner puisque les phases sont antagonistes. Si l'action a ne débute qu'au bout 20s et b qu'au bout de 40s donc l'action a aura durée 20s.
Et ça fonctionne parfaitement.
Le seul soucis c'est d'arrêter l'application au bout de 2 minutes. Quand je mets While...Wend ou Do Until ... Loop Excel arrête de fonctionner !!!
J'en suis intimement convaincu, ma question portait sur le pourquoi insérer des temporisation sachant qu'une méthode ne peut s'exécuter qu'après l'exécution de la précédente !

mais il est possible que la démarche soit justifié mais pour l'instant je ne la comprend pas!
 

Dranreb

XLDnaute Barbatruc
Bonjour.
La fonction Application.OnTime a pourtant bien fonctionner puisque les phases sont antagonistes. Si l'action a ne débute qu'au bout 20s et b qu'au bout de 40s donc l'action a aura durée 20s.
Si une des tâches comporte un DoEvents dans une boucle qui a besoin tourner jusqu'à plus tard que l'heure prévue du lancement d'une autre par un Application.OnTime, il lui donne l'opportunité de démarrer avant qu'elle ne soit terminée. Sinon effectivement ça ne sert à rien non plus de les lancer ainsi: elles durent de toute façon le temps qu'il leur faut à moins qu'elles surveillent le temps et s'arrêtent d'elles mêmes s'il dépasse un seuil.
Vous feriez mieux de nous dire en quoi consistent exactement vos tâches 'antagonistes' pour qu'on puisse vous dire comment gérer tout ça.
 

OBM

XLDnaute Nouveau
Bonjour.Si une des tâches comporte un DoEvents dans une boucle qui a besoin tourner jusqu'à plus tard que l'heure prévue du lancement d'une autre par un Application.OnTime, il lui donne l'opportunité de démarrer avant qu'elle ne soit terminée. Sinon effectivement ça ne sert à rien non plus de les lancer ainsi: elles durent de toute façon le temps qu'il leur faut à moins qu'elles surveillent le temps et s'arrêtent d'elles mêmes s'il dépasse un seuil.
Vous feriez mieux de nous dire en quoi consistent exactement vos tâches 'antagonistes' pour qu'on puisse vous dire comment gérer tout ça.
Au fait il s'agit d'une simulation de flux de véhicules et de piétons dans un carrefour de feux tricolores à deux temps.
 

jmfmarques

XLDnaute Accro
J'ignore tout du mécanisme que tu veux mettre en place.
Une chose demeure certaine, quoi qu'il puisse en être : elle est la nécessité de définir convenablement les choses.
Ceci, par exemple :
La fonction Application.OnTime a pourtant bien fonctionner puisque les phases sont antagonistes. Si l'action a ne débute qu'au bout 20s et b qu'au bout de 40s donc l'action a aura durée 20s.
ne signifie absolument pas que l'action A a duré 20 secondes, sauf si cette action est une instruction en boucle pouvant durer plus de 20 secondes et dont l'on a interrompu les itérations au bout de 20 secondes. Si tel n'est pas le cas (interruption volontaire), le fait que l'action B est exécutée au bout de 40 secondes ne fait absolument pas que l'action A a duré, elle, 20 secondes.
Elle a par exemple pu ne durer que 10 secondes et être suivie d'instructions d'attente de lancement de l'action B
Commence par cette discipline rigoureuse de pensée et tu y verras plus clair.
 

jmfmarques

XLDnaute Accro
juste un petit coup de main de bon matin (en ce qui concerne uniquement la pensée du mécanisme)
il s'agit d'une simulation de flux de véhicules et de piétons dans un carrefour de feux tricolores à deux temps.
en matière de flux, les "états" (tous les états) sont modifiés en permanence et aucune action de gestion de l'un d'entre eux ne saurait interrompre la modification, dans le même temps, des autres "états".
Que cela signifie-t-il pour ce qui t'intéresse ? -->> tout simplement qu'est donc à proscrire un traitement par "choix de macro active".... au bénéfice d'une seule macro gérant à la fois tous les "états", démarche très éloignée, comme tu le vois, du mécanisme que tu as envisagé.
La mise en oeuvre de ce genre de mécanisme est aisée avec certains langages (dont VB6) dotés d'un véritable composant Timer. Elle est également possible sous VBA, mais au prix d'une très grande précision d'instructions au sein d'une procédure commune à tous les "états".
Excel, qui est un tableur, n'est certes pas l'outil le mieux adapté à de tells fins.;)
Le reste est ton affaire.
 

patricktoulon

XLDnaute Barbatruc
re
Bonjour a tous
je maintient et persiste quand au fait qu'utiliser des fonctions en mode responsive serait mieux adaptées
et malgré tout ce que peut dire jmfmarques a propos de de l’exécution "syncrone"
si c’était le cas la question principale de ce post n'aurait pas lieu d’être
et je le répète les wait , application.ontime, ou bien encore un timer voir même avec l'api set timer ne seront qu'approximatives
et ne feront que faire ramer ton applicatif car il faudrait laisser un certain temps de façon a ce que ça fonctionne sur tout pc de puissance différente
la méthode responsive d'une fonction est tout indiqué


sub j'appelleblablabla()
x=blablabla(arguments ou pas )
end sub

function blablabla(arguments ou pas)
'du code faisant quelque chose
blablabla="ok"
end function
et je l'affirme de toute mes forces
IL N'Y A pas DE BESOINS DE GESTION D'ATTENTE

0, nada,rien du tout, aucune gestion d'attentes !!!!!!!!!


on peut même des l'ors de l'utilisation de cette stratégie
faire des conditions sur l’exécution

sub j'appelleblablabla()
x=blablabla(arguments ou pas )
if x=ok then y = blobloblo(arguments ou pas )
if y=ok then z = blublublu(arguments ou pas )
etc...etc...
end sub
les lignes sont exécutées uniquement si la ligne précédente a eu le retour de la fonction appelée

PAS DE GESTION D'ATTENTE!!!!!!
c'est la différence avec des sub dans les quelles un travail long quel qu'il soit n'aurait pas de gestion d'attente
avec l'utilisation de composant externe par exemple ce qui est très souvent la raison d'une telle demande

et puis finalement VB n'est il pas un langage pour la programmation orientée objet


pffffiuuu!!!!! :rolleyes: :rolleyes: :rolleyes: :rolleyes:


 

jmfmarques

XLDnaute Accro
je le répète les wait , application.ontime, ou bien encore un timer voir même avec l'api set timer ne seront qu'approximatives
Et où et quand aurais-je préconisé de telles "choses" ?????
Chacun étant libre de maintenir ce qu'il a exposé, je maintiens centuplement tout ce ce que j'ai exposé, à commencer par la réaffirmation de ce que l'utilisation de fonctions en lieu et place de routines ne change absolument rien à l'exécution en mode synchrone en VBA :cool:
 

patricktoulon

XLDnaute Barbatruc
re
oui bien sur
la question qui est posé ici n'a pas lieu d’être hein
et combien de fois avons nous des questions similaires hein
c'est la ""propriété"" responsive qui change tout jacques

x=mafonction(..)

les gestions d'attente ne doivent concerner que des éventuels composants externes comme IE par exemple (bien connu d'ailleurs)et bien d'autre encore et cela se gère dans la fonction !!! mais n'a plus rien a voir avec le mode "synchrone"


application.ontime now+20,30,45 secondes
vraiment pas sérieux de laisser le demandeur sur ce chemin là :rolleyes:
moi ce que j'en dis :rolleyes:
 

jmfmarques

XLDnaute Accro
Bonjour Robert
Nous savons maintenant que c'est la totalité de la stratégie et des mécanismes qui est à revoir, s'agissant de flux.
Qu'y a-t-il devant nous en arrivant à un croisement ? --> un feu qui libère ou arrête la circulation, tant des véhicules que des piétons, sans pour autant empêcher (circulation bloquée ou non) l'arrivée de nouveaux véhicules et/ou piétons.
Exit donc (me relire plus haut) tout mécanisme séquentiel de macros à tour de rôle. ;)
 

farid

XLDnaute Occasionnel
re
une autre démonstration avec des fonction plus longue et la récupération du moment ou elle démarre et toujours sans gestion d'attente
(voir le résultat dans le msgbox )
le texte prouve bien qu'une ne démarre pas tant que la précédente n'a pas fait le job
VB:
Sub appel()
Dim a&, b&, c&
a = phase1
texte = texte & "phase1 a démarré a" & Format(Time, "hh:nn:ss") & vbCrLf
b = phase2
texte = texte & "phase2 a démarré a" & Format(Time, "hh:nn:ss") & vbCrLf
c = phase3
texte = texte & "phase3 a démarré a" & Format(Time, "hh:nn:ss") & vbCrLf
d = phase4
texte = texte & "phase4 a démarré a" & Format(Time, "hh:nn:ss") & vbCrLf
e = phase5
texte = texte & "phase5 a démarré a" & Format(Time, "hh:nn:ss") & vbCrLf

MsgBox texte & vbCrLf & vbCrLf & a & vbCrLf & b & vbCrLf & c & vbCrLf & d & vbCrLf & e
End Sub

Function phase1()
For i = 1 To Round(Rnd * 1000000000): Next: phase1 = i
End Function

Function phase2()
For i = 1 To Round(Rnd * 1000000000): Next: phase2 = i
End Function

Function phase3()
For i = 1 To Round(Rnd * 1000000000): Next: phase3 = i
End Function

Function phase4()
For i = 1 To Round(Rnd * 1000000000): Next: phase4 = i
End Function

Function phase5()
For i = 1 To Round(Rnd * 100000000): Next: phase5 = i
End Function
merci
 

Membres actuellement en ligne

Statistiques des forums

Discussions
312 196
Messages
2 086 101
Membres
103 116
dernier inscrit
kutobi87