Pas de QueryClose pour ma UserForm

Bonjour,

Afin d'empêcher une fermeture de ma UserForm par la "croix", j'ai décidé de mettre un place un gestionnaire pour l'evt QueryClose.

Problème le gestionnaire n'est jamais appelé !

Pensant que je n'avais peut être pas utilisé le bon nom pour désigner cette fenêtre, j'ai ajouté pour tester un gestionnaire Click, lui il est appelé !

Donc je me retrouve avec les 2 gestionnaires suivants :

Private Sub fpr_userForm_QueryClose(Cancel As Integer, CloseMode As Integer)

Cancel = True

End Sub

Private Sub fpr_userForm_Click()

Dim i As Integer

i = 1

End Sub

Le click est appelé, pas le QueryClose ...

Dans mon éditeur j'ai sélectionné "fpr_userForm" et c'est vrai que dans la liste des événements QueryClose n'y figure pas.

Est ce que c'est ma version d'excel (2010) est en cause, ou faut il chercher ailleurs ?

Cordialement

Bonjour,

Il faut toujours utiliser UserForm quelque soit son nom. Prend l'habitude de choisir les événement dans la liste déroulante, plus d'erreur possible.

Et il faut tester closemode si tu veux que ton programme puisse le fermer, ou que ça ne bloque pas la fermeture de windows.

Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
    If CloseMode = vbFormControlMenu Then Cancel = True
End Sub

eric

Désolé mais UserForm_QueryClose ne marche pas chez moi, en plus on ne souhaite pas forcément gérer toutes les userform de la même façon.

Sélectionner dans la liste oui, sauf que chez moi cet événement n'y est pas (voir liste_evt.png)

J'ai joint le fichier xlsm, le but des composants est de faciliter la génération d'une boîte de dialogue pour saisir les critères de sélection d'une requête.

La userForm est créée statiquement sans aucun control, ces dernier devant être créés dynamiquement en fonction des paramètres de la requête.

Le module de classe "FormParaReq" contient les gestionnaires d'evt en question, cette classe est sensée encapsuler la userForm, l'ajout des controles et la vérification de saisie.

Le module AppelForTest contient la procédure main3() qui est un test d'utilisation elle fonctionne bien jusqu'au show inclus, le reste étant à finaliser, la résolution du problème actuel étant nécessaire.

Merci pour vos interventions

liste evt
18modelclient.xlsm (68.31 Ko)

Désolé mais UserForm_QueryClose ne marche pas chez moi, en plus on ne souhaite pas forcément gérer toutes les userform de la même façon.

Bah désolé aussi mais il va falloir que tu t'y plies.

UserForm_QueryClose s'appelera toujours UserForm_QueryClose un point c'est tout.

Et qui t'a dit que c'était le même pour tous les UF ? Ils ont chacun leur module...

Maintenant comment aurait-on pu deviner que tu te faisais ton propre module de classe de userform ?

Ton problème est donc tout autre.

C'est comment programmer correctement un module de classe. Là, je ne sais pas.

eric

désolé eriiic mais suite à ton intervention précédente j'ai essayé et CA NE MARCHE PAS.

C'est peut être pas habituel mais c'est comme ça.

J'ai édité, après avoir lu complètement...

Je viens d'essayer sur un exemple simple sans passer par un module de classe pour intercepter les evt du userForm et là j'ai bien au niveau du module du userForm QueryClose qui apparait dans la liste

En fait j'ai lu ces derniers temps que pour intercepter des evt de controles créés dynamiquement il faut passer par un module de classe.

Mais ma userForm est créée statiquement et ma tentative d'interception dans un module de classe n'est peut être pas adaptée (bien que ça marche pour le click).

La semaine prochaine je vais tenter de la créer dynamiquement des fois que ça résoudrait le pb.

Je vous dirai ce que ça a donné lundi ou mardi soir.

Cordialement

Bonjour,

Dans un module de classe, tous les événements ne sont pas repris que se soit pour un UserForm ou pour des contrôles.

Si ton UserForm n'est pas créé de façon dynamique, je ne vois pas l'intérêt d'utiliser un module de classe !


Re,

Tu peux savoir si la Form est fermée dans la classe mais tu ne peux plus agir dessus. Un exemple :

Dans le module de classe :

Dim MaForm As Object
Public WithEvents FrmEvent As MSForms.UserForm

Private Sub Class_Initialize()

    Set MaForm = ThisWorkbook.VBProject.VBComponents("UserForm1")

End Sub

Private Sub Class_Terminate()

    Set MaForm = Nothing

    MsgBox "On a fermé la Form !"

End Sub

Private Sub FrmEvent_Click()

    MsgBox "OK, le Clic marche bien !"

End Sub

et dans le module de la Form :

Dim Frm As New Classe1

Private Sub UserForm_Initialize()

        Set Frm.FrmEvent = Me

End Sub

Merci Theze pour ta réponse qui me situe bien les choses.

En fait dans le module de classe je crée tous les contrôles dynamiquement mais j'avais trouvé plus simple de créer la userForm statiquement ( pb de conversion du type Object en UserForm notamment, mais pas que).

En fait j'ai trouvé une solution, je gère le QueryClose dans le module (auquel je ne savais pas accéder la semaine dernière !) de la userform et les autres evt (en fait ceux des controles) dans le module de classe.

Le module de classe étant sensé encapsuler la userform ça aurait été logique de gérer tous les evt dedans, mais bon ça marche comme ça.

Dans le QueryClose je mets simplement un "Cancel = True", donc pas besoin d'accéder aux infos du module de classe.

Etant débutant en VBA il est probable que j'ai fait un certain nombre de trucs de façon non optimale.

Enfin maintenant je considère mon problème comme résolu.

Merci à tous

Rechercher des sujets similaires à "pas queryclose userform"