Stopper une macro avec une userform non modale

Signaler
Messages postés
5
Date d'inscription
vendredi 16 avril 2010
Statut
Membre
Dernière intervention
20 avril 2010
-
Messages postés
14764
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
26 janvier 2021
-
Bonjour,

Je me decide a poster pour demander de l'aide car malgres de nombreuses recherche sur mon probleme, je n'ai rien trouve.

Voila :

je recherche a ouvrir une boite de dialogue (msgbox ou userform) qui me demande de faire une action qui n'est pas dans excel (activation d'un element d'une autre application).
Une fois que j'ai fais cette action : le click sur OK me permetrait de continuer la macro sous excel.

Mes premieres recherches m'orientent vite sur l'emploi de la fonction userform en non modale (c'est exactement ce que j'ai besoin).
Or quand on utilise cette fonction, la macro continu de tourner et je me retrouve a la fin alors que je n'ai pu faire l'action demandee par la boite de dialogue.

J'ai vu que d'autres personnes avaient eu ce probleme, mais je n'ai pas eu la reponse finale, et je n'ai rien trouvait qui fonctionnait (pause,doevents, wait, sleep...).

des conseils ou idees ?

merci bien.

SM

pour info : voici un code simplifier que je voudrais faire fonctionner en non modale, mais avec un genre de pause tant que je n'ai pas clicker sur OK ou cancel :

Private Sub test()
UserForm1.Show False
End Sub

Private Sub CommandButton1_Click()
MsgBox "ok"
Unload Me
End Sub

Private Sub CommandButton2_Click()
MsgBox "cancel"
Unload Me
End Sub

9 réponses

Messages postés
14764
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
26 janvier 2021
151
Bonjour,

Normal, tu l'affiche à chaque fois, donc elle ne se termine jamais.

Et pour information, If n'est pas une boucle.

Public Drapeau As Boolean

Sub Test()
    Drapeau = True
    UserForm1.Show
    Do While Drapeau = True
        DoEvents
    Loop

'If UserForm1.Drapeau Then
'msg box("ok1")
'Else
'MsgBox ("cancel1")
'End If

End Sub

'pour les boutons :

Private Sub CommandButton1_Click()
    Drapeau = False
    MsgBox "ok"
    Hide
End Sub

Private Sub CommandButton2_Click()
    Drapeau = False
    MsgBox "cancel"
    Hide
End Sub


ça devrait mieux fonctionner.

Messages postés
14764
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
26 janvier 2021
151
Bonjour,

Tu peux mettre un drapeau pour indiquer l'état d'ouverture et jouer avec DoEvents

Pour interrompre l'execution d'une boucle, tu peux faire pareil.

Messages postés
5
Date d'inscription
vendredi 16 avril 2010
Statut
Membre
Dernière intervention
20 avril 2010

Bonjour;

est-ce que tu peux devellopper un 'tit peu STP, car je ne comprend pas bien ta notion de drapeau.

merci d'avance.

SM
Messages postés
14764
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
26 janvier 2021
151
Bonjour,

1) mettre un attribut public dans la form :
Public CaTourne as Boolean

2) dans l'event Activate de la form :
CaTourne=True

3) dans le code des boutons :
CaTourne=False

Ensuite, ne pas oublier de faire
Hide
et pas
Unload Me
(pour conserver la valeur et éviter le rechargement de la form)

Ensuite dans ton code pour savoir si la fenêtre est ouverte :
If MaForm.CaTourne Then
'La form est ouverte
Else
'La form est fermée
End if

J'espère que c'est plus clair maintenant :)

Messages postés
5
Date d'inscription
vendredi 16 avril 2010
Statut
Membre
Dernière intervention
20 avril 2010

Bonjour,

en effet, cela est un peu plus claire, mais malheureusement j'ai quelques petits soucis :

1- tout d'abord la variable public n'est plus reconnue quand on passe aux macros des boutons.
j'ai essaye en les declarants dans les macros bouton, mais inversement, elle disparait lors de l'activation de la macro principale; du coup ma boucle est sans fin.

2- a priori VBA ne comprend pas la commande : UserForm1.Drapeau

3- je ne vois pas trop l'utilité de la boucle if.
que cela apporte t'il ?

je te met ci joint les codes que j'ai fais a partir de tes indications....

merci pour tes infos.

SM


Public Drapeau As Boolean
Sub Test()
Drapeau = True
Do While Drapeau = True
UserForm1.Show
DoEvents
Loop

'If UserForm1.Drapeau Then
'msg box("ok1")
'Else
'MsgBox ("cancel1")
'End If

End Sub


pour les boutons :

Private Sub CommandButton1_Click()
MsgBox "ok"
Drapeau = False
Hide
End Sub

Private Sub CommandButton2_Click()
Drapeau = False
MsgBox "cancel"
Hide
End Sub
Messages postés
5
Date d'inscription
vendredi 16 avril 2010
Statut
Membre
Dernière intervention
20 avril 2010

Bonjour,

en effet, pour le if je voulais parler de la condition et non de boucle.

sinon j'ai essayer avec le changement de position des codes; et ca ne fonctionne toujours pas.

Si je met la UF en non modale : la boucle do tourne sans fin, il ne se passe rien quand je click sur les boutons.
Les sous-macros ne sont pas activees.

si je met la UF en modale : tout d'abord je n'ai pas mes acces aux feuilles excel, mais par contre les sous-macros s'activent bien quand je click sur le bouton.
Ensuite j'ai un message d'erreure de compilation : Nom ambigue détecté : Drapeau; et la ca plante.

Selon moi, je dois rester en non modale.
Dans ce cas : pourquoi les sous-macros ne s'activent pas ?

en tout cas merci de prendre du temps pour me repondre.

SM
Messages postés
14764
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
26 janvier 2021
151
Bonjour,

Le problème est clair :
Nom ambigue détecté : Drapeau

Drapeau est déclaré 2 fois (au moins), vire une des 2 déclarations.

Sinon, penses toujours à mettre "Option Explicit" en haut des tes modules de code

Messages postés
5
Date d'inscription
vendredi 16 avril 2010
Statut
Membre
Dernière intervention
20 avril 2010

decidement, je n'y arrive pas.

j'ai bien mis l'option explicit, mais je ne vois pas ou ma variable est declaree 2 fois.
j'ai fais differents essais en declarant ou non les variables en les placant en differents endroit, mais c'est toujours pas OK.

Je dois bien mettre ma UF en non modale ?
comment faire pour activer mes sous macro ?

@+

SM
Messages postés
14764
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
26 janvier 2021
151
Bonjour,

J'ai souvent procédé comme cela et j'ai toujours réussi.

essaye en recherchant toutes le occurences de "drapeau" et en vérifiant bien qu'elle n'est déclarée qu'un seule fois.
Au besoin, déclare-la dans un Module (en laissant la visibilité publique) et comme ça plus besoin de mettre le nom de la form devant.