Une solution à Doevens

Matysek35 Messages postés 1 Date d'inscription mardi 2 février 2016 Statut Membre Dernière intervention 2 février 2016 - 2 févr. 2016 à 12:26
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 - 2 févr. 2016 à 12:47
Le problème que je souhaite soumettre à la communauté concerne le fonctionnement de l’instruction Doevents

Dans un logiciel complexe utilisant 3 classeurs simultanément (les liaisons de l’un à l’autre étant effectuées), l’objectif est de configurer automatiquement le nombre max d’itérations qui sera différent d’une séquence de fonctionnement à une autre (souvent fonction de la longueur d’un texte – Il y a 5 séquences différentes au total). Le N° de séquence en cours (de 0 à 4) peut être automatique ou manuel lors d’une simulation ; pour chaque N° de séquence en cours, un nombre d’itérations max est envoyé à la macro. La macro en liaison avec des cellules d’une feuille Excel se trouvent dans le classeur A

Le N° de séquence peut être introduit au choix à partir d’une commande similaire située dans 2 emplacements différents :
Emplacement 1 : Dans la feuille active du classeur A (celle où se trouvent les cellules en liaison avec la macro)
Emplacement 2 : Dans une autre feuille d’un autre classeur B ouvert

Pas question de laisser la boucle d’une séquence se dérouler de manière continue sans rendre les commandes à Excel pour qu’il teste l’écriture de la commande du N° de séquence suivante.

La macro, et donc la configuration du bon nombre d’itérations, fonctionne très bien en simulation si la commande de choix de séquence s’effectue dans l’emplacement 1
La macro ne fonctionne pas (pas d’avancement de séquence) en simulation ou en fonctionnement automatique si la commande de choix d’effectue dans l’emplacement 2

La macro reste bloquée sur Doevens qui rend les commandes au système d’exploitation (Dans mon cas Excel pour y lire le N° de séquence suivant). Je sais que cette instruction pose des problèmes et je pense que j’en suis dans ces limites d’emploi.

Je recherche donc une solution pour qu’en fonctionnement automatique à partir d’un autre classeur, les N° de séquences soient bien prises en compte par la macro. (A noter que le classeur B possède sa propre macro pour un enregistrement du classeur par Mot de Passe exclusivement). J’ai bien lu qu’il existait d’autres possibilités que d’utiliser Doevents mais cela me semble complexe à mon niveau de pratique en VBA. Merci d’avance de votre aide.



Extrait du programme de la Macro Excel classeur A
Rem: Dans une feuille Excel d’un classeur A se trouvent les cellules suivantes :
Rem: BW62-44 = N° de séquence en cours de fonctionnement (0 à 4 pour 5 séquences)
Rem: BX61-26 = Nbre d'itérations max configurées par séquence (Nbre variable)
Rem: BU63-BV44 = Affichage dans Excel du Nbre d'itérations max configurées
Rem: a0-a1-a2-a3-a4: Ne recevoir qu'une seule fois le Nbre d'itérations dans les boucles Do Loop
Rem: BU46-34:a0-BU47-35:a1-BU48-36:a2-BU49-37:a3-BU50-38:a4:Affichage de la séquence en cours dans la macro
Rem: BZ42-30 = RAZ séquences

Rem: séquence 0
Do While [Envoi!BW62] = ""
If a0 = 1 Then GoTo suite0
With Application
.MaxIterations = [Envoi!BX61].Value
a0 = 1: a4 = 0: [Envoi!BU46] = a0: [Envoi!BU50] = a4
[Envoi!BU63] = .MaxIterations
End With
suite0:
If [Envoi!BZ42] <> "" Then a0 = 0 Else DoEvents
Loop

Rem: séquence suivante (écrite 4 fois mais Do While [Envoi!BW62] = 1 à 4 d'une séquence à l'autre puis saut à la séquence 0)

1 réponse

ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
Modifié par ucfoutu le 2/02/2016 à 18:06
Bonjour,
Je ne vais pas y aller (excuse-moi) par quatre chemins :
Déjà :
- Une boucle While concernant la valeur d'un [Envoi!BW62] qui, lui, n'évolue pas ... Euh ...
Ensuite :
- Ce genre de code (communément appelé "spaghetti" du fait notamment du goto) est très peu "lisible" et ressemble fort à une farce que j'ai faite un jour : écxrire un code tel que si toto = True alors toto = false et si = false, alors = true, le tout en boucle
Pour résumer : tout à re-concevoir de A à Z.



________________________
Nul ne saurait valablement coder ce qu'il ne saurait exposer clairement.
0
Rejoignez-nous