Stopper une macro avec une userform non modale

sylv1loop Messages postés 5 Date d'inscription vendredi 16 avril 2010 Statut Membre Dernière intervention 20 avril 2010 - 16 avril 2010 à 15:53
NHenry Messages postés 15113 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 22 avril 2024 - 20 avril 2010 à 16:34
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
A voir également:

9 réponses

NHenry Messages postés 15113 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 22 avril 2024 159
19 avril 2010 à 19:27
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.

1
NHenry Messages postés 15113 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 22 avril 2024 159
16 avril 2010 à 19:18
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.

0
sylv1loop Messages postés 5 Date d'inscription vendredi 16 avril 2010 Statut Membre Dernière intervention 20 avril 2010
19 avril 2010 à 10:36
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
0
NHenry Messages postés 15113 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 22 avril 2024 159
19 avril 2010 à 14:21
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 :)

0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
sylv1loop Messages postés 5 Date d'inscription vendredi 16 avril 2010 Statut Membre Dernière intervention 20 avril 2010
19 avril 2010 à 15:28
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
0
sylv1loop Messages postés 5 Date d'inscription vendredi 16 avril 2010 Statut Membre Dernière intervention 20 avril 2010
20 avril 2010 à 11:02
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
0
NHenry Messages postés 15113 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 22 avril 2024 159
20 avril 2010 à 13:44
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

0
sylv1loop Messages postés 5 Date d'inscription vendredi 16 avril 2010 Statut Membre Dernière intervention 20 avril 2010
20 avril 2010 à 16:04
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
0
NHenry Messages postés 15113 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 22 avril 2024 159
20 avril 2010 à 16:34
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.

0
Rejoignez-nous