Attendre qu'une sub soit fini pour en executer une autre.

lemarcheurfou

XLDnaute Nouveau
Bonjour à tous,

J'ai une question, j'ai plusieurs macro dans mon fichier excel. Donc je veux toute les executer mais dans un ordre précis et en attendant que la marco qui est avant soit fini. C'est possible?

J'ai fais ça comme code mais un moment donnée il m'exécute deux en même temps et ça plante :confused::confused:

Code:
Sub execute()

Application.Run ThisWorkbook.Name & "!Formattxt"
Application.Run ThisWorkbook.Name & "!Fusiondi40diref41chorus"
Application.Run ThisWorkbook.Name & "!SupDoublon"
Application.Run ThisWorkbook.Name & "!Import"
Application.Run ThisWorkbook.Name & "!RemplacerNA"
Application.Run ThisWorkbook.Name & "!ComparaisonType"
Application.Run ThisWorkbook.Name & "!ComparaisonCardinalite"
Application.Run ThisWorkbook.Name & "!ComparaisonSegAcceuil"
Application.Run ThisWorkbook.Name & "!ComparaisonNumOrdre"
Application.Run ThisWorkbook.Name & "!ComparaisonNbOccu"
Application.Run ThisWorkbook.Name & "!CouleurRougeFalse"

End Sub

Je vous remercie d'avance pour vos réponses.
 

Paf

XLDnaute Barbatruc
Re : Attendre qu'une sub soit fini pour en executer une autre.

bonjour,

a priori les macros sont lancées depuis le classeur qui les contient.

pour les lancer il suffit de les nommer et d'insérer DoEvents entre chaque:

Formattxt
DoEvents
Fusiondi40diref41chorus
DoEvents
SupDoublon
...



Bonne suite
 

lemarcheurfou

XLDnaute Nouveau
Re : Attendre qu'une sub soit fini pour en executer une autre.

C'est bon j'ai réussi à le faire marcher avec le DoEvent:

Voilà le code:

DoEvents
Application.Run ThisWorkbook.Name & "!Formattxt"
Application.Run ThisWorkbook.Name & "!Fusiondi40diref41chorus"
Application.Run ThisWorkbook.Name & "!SupDoublon"
Application.Run ThisWorkbook.Name & "!Import"
Application.Run ThisWorkbook.Name & "!RemplacerNA"
DoEvents
Application.Run ThisWorkbook.Name & "!ComparaisonType"
Application.Run ThisWorkbook.Name & "!ComparaisonCardinalite"
Application.Run ThisWorkbook.Name & "!ComparaisonSegAcceuil"
Application.Run ThisWorkbook.Name & "!ComparaisonNumOrdre"
Application.Run ThisWorkbook.Name & "!ComparaisonNbOccu"
DoEvents
Application.Run ThisWorkbook.Name & "!CouleurRougeFalse"
DoEvents

Merci à tous les deux.
 

Dranreb

XLDnaute Barbatruc
Re : Attendre qu'une sub soit fini pour en executer une autre.

Bonjour.
Je ne vois pas de raison, à priori, pour que les procédures ne soient pas exécutées l'une après l'autre, chacune démarrant seulement lorsque la précédente est terminée.
Toutefois, il est possible que certaines instructions dans certaines procédures fassent appel à des requêtes empilées parmi les tâches à exécuter de façon asynchrone, et dont le résultat stable, conditionnant le déroulement d'une procédure suivante, ne serait atteint que si elles avaient l'occasion de s'exécuter ! Ce serait derrière ces instructions sensibles qu'il conviendrait de faire des DoEvents.
Par ailleurs il me parait inutile d'utiliser Application.Run ThisWorkbook.Name & "!. Mettez simplement en guise d'instruction le nom de la procédure.
 

KenDev

XLDnaute Impliqué
Re : Attendre qu'une sub soit fini pour en executer une autre.

Bonjour,

A priori
VB:
Sub execute()
    Formattxt
    Fusiondi40diref41chorus
    SupDoublon
    Import
    RemplacerNA
    ComparaisonType
    ComparaisonCardinalite
    ComparaisonSegAcceuil
    ComparaisonNumOrdre
    ComparaisonNbOccu
    CouleurRougeFalse
End Sub
devrait suffire ?

Ou alors, avec la sub execute dans un module 'normal' (pas dans un module de feuille ou classeur)
VB:
Public bExe As Boolean

Sub execute()
Application.Run ThisWorkbook.Name & "!Formattxt"
If bExe Then bExe = Not bExe: Application.Run ThisWorkbook.Name & "!Fusiondi40diref41chorus"
If bExe Then bExe = Not bExe: Application.Run ThisWorkbook.Name & "!SupDoublon"
If bExe Then bExe = Not bExe: Application.Run ThisWorkbook.Name & "!Import"
If bExe Then bExe = Not bExe: Application.Run ThisWorkbook.Name & "!RemplacerNA"
If bExe Then bExe = Not bExe: Application.Run ThisWorkbook.Name & "!ComparaisonType"
If bExe Then bExe = Not bExe: Application.Run ThisWorkbook.Name & "!ComparaisonCardinalite"
If bExe Then bExe = Not bExe: Application.Run ThisWorkbook.Name & "!ComparaisonSegAcceuil"
If bExe Then bExe = Not bExe: Application.Run ThisWorkbook.Name & "!ComparaisonNumOrdre"
If bExe Then bExe = Not bExe: Application.Run ThisWorkbook.Name & "!ComparaisonNbOccu"
If bExe Then bExe = Not bExe: Application.Run ThisWorkbook.Name & "!CouleurRougeFalse"
End Sub

Et rajouter en fin de traitement de chaque procédure
VB:
bExe = True

Cordialement

KD
 

Paf

XLDnaute Barbatruc
Re : Attendre qu'une sub soit fini pour en executer une autre.

Re,

une autre solution

dans un module standard:
Code:
Public Pret As Boolean




Code:
Sub execute()
Dim lance As Boolean
Pret = False

lance = False

    
Formattxt ' appel macro 

While lance = False
    If Pret = True Then
        lance = True
        Fusiondi40diref41chorus ' appel macro 
    End If
Wend
Pret = False
lance = False

While lance = False
    If Pret = True Then
        lance = True
        SupDoublon ' appel macro 
    End If
Wend
Pret = False
lance = False   
 
While lance = False
    If Pret = True Then
        lance = True
        Import ' appel macro 
    End If
Wend
Pret = False
lance = False   
   
' et ainsi de suite  pour les autres appels macro   
'    RemplacerNA
'    ComparaisonType
'    ComparaisonCardinalite
'    ComparaisonSegAcceuil
'    ComparaisonNumOrdre
'    ComparaisonNbOccu
'    CouleurRougeFalse
End Sub

Iil faut rajouter en fin de chaque macro appelée : Pret=True
 

st007

XLDnaute Barbatruc
Re : Attendre qu'une sub soit fini pour en executer une autre.

Bonjour,
j'essaye d'appliquer la méthode de PAF, j'ai besoin d'un certain délai entre les macro dont la durée est aléatoire.
Mais çà coince, je reste bloqué sur end if alors que la macro en question à terminé.
 

st007

XLDnaute Barbatruc
Re : Attendre qu'une sub soit fini pour en executer une autre.

J'avais donc 5 module contenant chacun une macro dont une utilise une fonction située dans le même module

je voulais en plaçant dans this workbook open le code de paf
j'ai ajouté avant les end sub " Pret=True " dans chacune de mes macro
çà temporise bien pour la première macro, qui me crée des .txt
mais la seconde macro qui renomme ces txt ne demarre pas
il semble que "pret" garde la valeur faux
Quelqu'un ou quelqu'une aurait une idée
 

Paf

XLDnaute Barbatruc
Re : Attendre qu'une sub soit fini pour en executer une autre.

Bonjour st007,

je devais être très très inspiré le jour de ce post #10, parce que aujourd'hui je ne vois pas comment ça peut fonctionner !

et je n'ai pas de solution si ce n'est d'adapter les préconisations de Dranreb du post #8

Bonne suite
 

Statistiques des forums

Discussions
312 493
Messages
2 088 956
Membres
103 989
dernier inscrit
jralonso