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.
 

sylvanu

XLDnaute Barbatruc
Supporter XLD
Bonjour Obm,
Sans un petit fichier test, et sans l'architecture de vos macros, difficile de répondre.
Une possibilité :
VB:
Sub Boucle()
Call Phase0
Tdeb = Timer
While Timer - Tdeb < 120
    T0 = Timer
    While Timer - T0 < 20
        Call Phase1
    Wend
    T0 = Timer
    While Timer - T0 < 5
        Call Phase2
    Wend
    T0 = Timer
    While Timer - T0 < 20
        Call Phase3
    Wend
Wend
End Sub
 
Dernière édition:

OBM

XLDnaute Nouveau
Merci de votre aide.
Je l'ai finalement fait avec le code suivant:
Sub Start()
Dim a, b, c, d As Date
a = Now
b = Now + TimeValue("00:00:20")
c = Now + TimeValue("00:00:25")
d = Now + TimeValue("00:00:45")
Phase0
Application.OnTime a, "Phase1"
Application.OnTime b, "Phase2"
Application.OnTime c, "Phase3"
Application.OnTime d, "Start"
End Sub

Sub Fermer()
ActiveWorkbook.Save
Application.Quit
ActiveWorkbook.Close
End Sub
 

patricktoulon

XLDnaute Barbatruc
bonjour
il y a un moyen très simple de gérer les temporisations entre plusieurs macro
c'est de ne pas les gérer du tout ;) :p

il faut tout simplement de les transformer en fonction
de cette manière dans une sub d'appel les lignes sont exécutées uniquement si la fonction précédente a renvoyé son résultat
A méditer
 

patricktoulon

XLDnaute Barbatruc
coucou Robert ;)
je me suis posé la même question
toujours est il que si un travail de fond exige autant de temps que cela entre chaque étape les gestions d'attente avec des wait et app.ontime et doevents et compagnie seront toujours soit trop longues soit trop courtes et resterons incertaines et seront loin de mettre a l'abris d'un temps trop court qui déclenchera de ce fait une erreur ou méprise dans l'exécution du code
n'ayant pas plus de renseignements sur ses dite sub je ne peux en dire plus quand a l'objet déterminant de la gestion d'attente
 
Dernière édition:

OBM

XLDnaute Nouveau
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 !!!
 

patricktoulon

XLDnaute Barbatruc
re
demonstration avec des fonctions qui ont une durée indeterminée a chaque tours
le résultat est parlant je crois le msgbox donne les 5 résultats
VB:
Sub appel()
Dim a&, b&, c&
a = phase1
b = phase2
c = phase3
d = phase4
e = phase5

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

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

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

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

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

Function phase5()
For i = 1 To Round(Rnd * 100000000): Next: phase5 = i
End Function
voila comment on gere des attente entre macro heu ..fonctions ;)
on ne le gère tout simplement pas
 

patricktoulon

XLDnaute Barbatruc
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
 

jmfmarques

XLDnaute Accro
Euh ....
Que faire face à l'énoncé d'un si grand nombre d'inexactitudes aussi diverses que variées mais assurément déprimantes ?
-1) se lancer dans non pas une, mais plusieurs rédactions pour les démonter une après l'autre ?
-2) laisser se perpétrer certaines convictions injustifiées ?

Je crois bien que je vais préférer la seconde attitude, la première étant au dessus de mes forces.
 

jmfmarques

XLDnaute Accro
Sieste terminée et quelques forces récupérées pour au moins rappeler à l'essentiel , au fondamental et à la raison ceux qui s'égarent à je ne sais quels types d'échafaudages :
- En VBA : les procédures (qu'elles soient des routines ("sub") ou des fonctions , sont exécutées en ordre synchrone. ce qui veut dire qu'une procédure procédure2 appelée après une procédure procédure1, ne saurait être exécutée tant que l'exécution de procéduye1 n'est pas terminée.
Et aucune "manoeuvre", aucune "élucubration", aucune "gymnastique" ne viendra bouleverser cet aspect fondamental du langage lui-même.
- utiliser des fonctions plutôt que des routines ne change absolument rien (et pour cause) à ce traitement synchrone des procédures appelées

- Lorsqu'au sein d'une procédure est lancé un processus pouvant, lui, être asynchrone, la fin de la procédure elle-même peut éventuellement intervenir avant celle du processus asynchrone lancé.
Je vous laisse sur ces mots.
 
Dernière édition:

Statistiques des forums

Discussions
311 725
Messages
2 081 949
Membres
101 851
dernier inscrit
vaiata