UserForm_QueryClose ne fonctionne qu'une fois

Bonjour à toutes et à tous,

J'ai un problème concernant la fermeture d'un UserForm avec l'évènement UserForm_QueryClose.

Voici le code utilisé :

Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
    If CloseMode = 0 Then
        Me.Hide
        Unload Me
        UF_Choix_Maintenance.Show
    End If
End Sub

Ce code me permet de fermer l'userform en question et d'ouvrir un autre Userform se nommant "UF_Choix_Maintenance".

Le problème réside dans le fait que UF_Choix_Maintenance que j'affiche, comporte plusieurs boutons dont un, qui permet de réouvrir le Userform fermé. Or dès que je le réouvre, j'ai remarqué que la croix de fermeture de celui-ci était inactive ... (je clique dessus mais rien ne se passe). Au final, la fermeture de ce Userform ne fonctionne qu'une seule fois.

Ce sujet doit être assez connu mais je n'arrive pas à trouver de solution.

N'hésitez pas à me dire si je ne suis pas clair ou qu'il manque des informations de compréhension.

Merci par avance,

A+

Bonjour MPETIT,

Lorsque vous utilisez Unload Me dans votre événement UserForm_QueryClose, vous déchargez effectivement l'UserForm de la mémoire. Cela signifie que toutes les informations associées à l'UserForm sont perdues, y compris l'état du bouton de fermeture.
Lorsque vous réaffichez l'UserForm, vous créez une nouvelle instance de celui-ci, ce qui pourrait expliquer pourquoi le bouton de fermeture ne fonctionne pas correctement.
Une solution consiste à simplement cacher l'UserForm au lieu de le décharger, vous conservez l'état de l'UserForm et pouvez le réafficher sans problème.
Le code :

Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
    If CloseMode = 0 Then
        Cancel = True
        Me.Hide
        UF_Choix_Maintenance.Show
    End If
End Sub

L'ajout de Cancel = True cela annule l'action de fermeture en cours, ce qui vous permet de simplement cacher l'UserForm sans le décharger.
A tester bien évidemment

Bonjour,

Le "Unload Me" ne termine pas votre procédure "Userform_Queryclose" qui restera active tant que tout le code de "UF_Choix_Maintenance" n'aura pas été entièrement exécuté.

Une solution est d'utiliser une procédure d'affichage pour votre UserForm

Sub affichage_UF_Choix_Maintenance()
    UF_Choix_Maintenance.Show
End Sub

via l'instruction ci-dessous qui permettra de clore votre procédure.

Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
    If CloseMode = 0 Then
        Cancel = True
        Me.Hide
        Application.OnTime Now + TimeValue("00:00:01"), "affichage_UF_Choix_Maintenance"
    End If
End Sub

Merci Benali & thev pour vos réponses respectives.

La solution de @thev fonctionne parfaitement quand j'intègre Sub affichage_UF_Choix_Maintenance() dans un module.

Je clôture le sujet.

A+

Rechercher des sujets similaires à "userform queryclose fonctionne fois"