XL 2019 Gestion "pseudo-évènements" sur un userform

ThierryP

XLDnaute Occasionnel
Bonjour le forum,

Je bute sur un truc (sûrement) tout bête.... J'ai créé un USF pour que l'utilisateur puisse entrer un horaire, avec deux TextBox (Heures et Minutes), un bouton "Confirmer" et un bouton "Annuler".
J'ai mis un contrôle de saisie sur les horaires, mon souci est que si je clique sur le bouton "Annuler", le programme va directement sur le contrôle de saisie sans passer par le code du bouton "Annulation"..... De même, si je clique sur la croix de fermeture, il passe par le contrôle de saisie, qui renvoie une erreur bien sûr, puisque le champ est vide !
J'ai tenté de passer par un booléen, mais vu que je ne passe pas par le code du bouton "Annulation"... ben ça marche pas !
Voici mon code :
VB:
Option Explicit

Public Annulation As Boolean

Private Sub CB_Annul_Click()
Annulation = True
TB_Heures.Text = ""
TB_Minutes.Text = ""
CB_Motif = ""
Me.Hide
End Sub

Private Sub CB_OK_Click()
If IsEmpty(Me.CB_Motif) Then
    MsgBox "La saisie d'un motif est obligatoire."
    Me.CB_Motif.SetFocus
End If
With Feuil1
    .Unprotect Range("Securite")
    With ActiveCell
        .value = TB_Heures.Text & ":" & TB_Minutes
        If .Comment Is Nothing Then
            .AddComment Text:="Modifié le : " & Date & " par " & Utilisateur & vbCrLf & _
                "Motif : " & Me.CB_Motif
            .Comment.Shape.TextFrame.AutoSize = True
            .Comment.Shape.OLEFormat.Object.Font.Name = "Arial"
            .Comment.Shape.OLEFormat.Object.Font.Size = 9
        Else
            .Comment.Text Text:="Modifié le : " & Date & " par " & Utilisateur & vbCrLf & .Comment.Text
        End If
    End With
    .Protect Range("Securite")
End With
TB_Heures.Text = ""
TB_Minutes.Text = ""
CB_Motif = ""
Me.Hide
End Sub

Private Sub TB_Heures_Exit(ByVal Cancel As MSForms.ReturnBoolean)
If Annulation Then Annulation = False: GoTo fin
If TB_Heures = "" Then MsgBox "Vous n'avez pas entré d'heure, veuillez corriger.": Cancel = True: GoTo fin
If Not IsNumeric(TB_Heures) Then TB_Heures.Text = "": MsgBox "Saisie incorrecte": Cancel = True
fin:
End Sub

Private Sub TB_Minutes_Exit(ByVal Cancel As MSForms.ReturnBoolean)
If Annulation Then Annulation = False: GoTo fin
If TB_Minutes = "" Then MsgBox "Vous n'avez pas entré de minutes, veuillez corriger": Cancel = True: GoTo fin
If Not IsNumeric(TB_Minutes) Then TB_Minutes.Text = "": MsgBox "Saisie incorrecte": Cancel = True
fin:
End Sub

Private Sub UserForm_Activate()
TB_Heures.SetFocus
End Sub

Private Sub UserForm_Initialize()
Dim Plage As Range

Me.Left = Application.Left + Application.Width / 2 - Me.Width / 2
Me.Top = Application.Top + Application.Height / 2 - Me.Height / 2
Set Plage = Feuil2.Range(Range("Motifs").Address)
Me.CB_Motif.List = Plage.value
End Sub

Si une âme charitable passe dans le coin et m'explique comment on gère ce genre de truc, je lui en serais éternellement (ou presque...) reconnaissant !

Merci d'avance !
 
Solution
Perso, le controle de la présence des données necessaires, je le fais toujours dans le bouton "valider"
l'exit peut par contre servir à controler la validité des données saisies (et encore.. j'utilise plutot l'évènement _change, ou _afterupdate)...

Gégé-45550

XLDnaute Accro
Bonjour le forum,

Je bute sur un truc (sûrement) tout bête.... J'ai créé un USF pour que l'utilisateur puisse entrer un horaire, avec deux TextBox (Heures et Minutes), un bouton "Confirmer" et un bouton "Annuler".
J'ai mis un contrôle de saisie sur les horaires, mon souci est que si je clique sur le bouton "Annuler", le programme va directement sur le contrôle de saisie sans passer par le code du bouton "Annulation"..... De même, si je clique sur la croix de fermeture, il passe par le contrôle de saisie, qui renvoie une erreur bien sûr, puisque le champ est vide !
J'ai tenté de passer par un booléen, mais vu que je ne passe pas par le code du bouton "Annulation"... ben ça marche pas !
Voici mon code :
VB:
Option Explicit

Public Annulation As Boolean

Private Sub CB_Annul_Click()
Annulation = True
TB_Heures.Text = ""
TB_Minutes.Text = ""
CB_Motif = ""
Me.Hide
End Sub

Private Sub CB_OK_Click()
If IsEmpty(Me.CB_Motif) Then
    MsgBox "La saisie d'un motif est obligatoire."
    Me.CB_Motif.SetFocus
End If
With Feuil1
    .Unprotect Range("Securite")
    With ActiveCell
        .value = TB_Heures.Text & ":" & TB_Minutes
        If .Comment Is Nothing Then
            .AddComment Text:="Modifié le : " & Date & " par " & Utilisateur & vbCrLf & _
                "Motif : " & Me.CB_Motif
            .Comment.Shape.TextFrame.AutoSize = True
            .Comment.Shape.OLEFormat.Object.Font.Name = "Arial"
            .Comment.Shape.OLEFormat.Object.Font.Size = 9
        Else
            .Comment.Text Text:="Modifié le : " & Date & " par " & Utilisateur & vbCrLf & .Comment.Text
        End If
    End With
    .Protect Range("Securite")
End With
TB_Heures.Text = ""
TB_Minutes.Text = ""
CB_Motif = ""
Me.Hide
End Sub

Private Sub TB_Heures_Exit(ByVal Cancel As MSForms.ReturnBoolean)
If Annulation Then Annulation = False: GoTo fin
If TB_Heures = "" Then MsgBox "Vous n'avez pas entré d'heure, veuillez corriger.": Cancel = True: GoTo fin
If Not IsNumeric(TB_Heures) Then TB_Heures.Text = "": MsgBox "Saisie incorrecte": Cancel = True
fin:
End Sub

Private Sub TB_Minutes_Exit(ByVal Cancel As MSForms.ReturnBoolean)
If Annulation Then Annulation = False: GoTo fin
If TB_Minutes = "" Then MsgBox "Vous n'avez pas entré de minutes, veuillez corriger": Cancel = True: GoTo fin
If Not IsNumeric(TB_Minutes) Then TB_Minutes.Text = "": MsgBox "Saisie incorrecte": Cancel = True
fin:
End Sub

Private Sub UserForm_Activate()
TB_Heures.SetFocus
End Sub

Private Sub UserForm_Initialize()
Dim Plage As Range

Me.Left = Application.Left + Application.Width / 2 - Me.Width / 2
Me.Top = Application.Top + Application.Height / 2 - Me.Height / 2
Set Plage = Feuil2.Range(Range("Motifs").Address)
Me.CB_Motif.List = Plage.value
End Sub

Si une âme charitable passe dans le coin et m'explique comment on gère ce genre de truc, je lui en serais éternellement (ou presque...) reconnaissant !

Merci d'avance !
Bonjour,
Ne croyez-vous pas que vous auriez plus de chance d'obtenir de l'aide en joignant un fichier plutôt qu'un extrait de code ?
Cordialement,
 

ThierryP

XLDnaute Occasionnel
Bonjour Gégé,

Certes, mais mon fichier fonctionne en liaison avec d'autres fichiers, plus des données confidentielles, un peu long à anonymiser. Tout le code de mon USF est là.... J'ai créé un fichier avec juste cet USF dedans, si c'est cela qui doit permettre d'obtenir une explication ;);)

Cet USF est "autonome", il n'a pas besoin de données de feuille (sauf la plage "Motifs").
 

Pièces jointes

  • Test_USF.xlsm
    22.5 KB · Affichages: 5

ThierryP

XLDnaute Occasionnel
Bonjour vgendron,

Merci pour le retour, effectivement cela fonctionne une première fois, sauf que je ne passe pas par le code du bouton "annulation" (en pas à pas je vais directement sur le textbox_exit, sans passer par le code du bouton mais pourquoi ???)). Même comportement si je clique sur la croix de fermeture (qui sera inhibée quand tout ceci fonctionnera !!), je vais directement sur le code du premier textbox.

Quelque chose m'échappe..... Sinon, je ne serais pas là ;)
 

vgendron

XLDnaute Barbatruc
pourquoi une première fois??

moi, quand je fais annuler, ca quitte directement le formulaire..
donc à chaque fois que je le relance, je peux à chaque fois recliquer sur annuler...

Comment as tu initialisé ta variable??
 

vgendron

XLDnaute Barbatruc
j'ai juste fait ca
VB:
Private Sub UserForm_Initialize()
Dim Plage As Range

Me.Left = Application.Left + Application.Width / 2 - Me.Width / 2
Me.Top = Application.Top + Application.Height / 2 - Me.Height / 2
Set Plage = Feuil1.Range(Range("Motifs").Address)
Me.CB_Motif.List = Plage.Value
Annulation = True 'initialisation du boolean
End Sub
 

Gégé-45550

XLDnaute Accro
Bonjour vgendron,

Merci pour le retour, effectivement cela fonctionne une première fois, sauf que je ne passe pas par le code du bouton "annulation" (en pas à pas je vais directement sur le textbox_exit, sans passer par le code du bouton mais pourquoi ???)). Même comportement si je clique sur la croix de fermeture (qui sera inhibée quand tout ceci fonctionnera !!), je vais directement sur le code du premier textbox.

Quelque chose m'échappe..... Sinon, je ne serais pas là ;)
Re bonjour,
Tout ça me paraît normal car tu initialises ton USF en donnant la main au contrôle Textbox dont tu testes la valeur dès que tu en sors :
VB:
If TB_Heures = "" Then MsgBox "Vous n'avez pas entré d'heure, veuillez corriger.": GoTo fin
De ce fait, où que tu cliques ailleurs, tu auras le message si le TB est vide.
À mon avis, il faut trouver un autre moyen de tester la valeur des TB.
Cordialement,
 

ThierryP

XLDnaute Occasionnel
Effectivement, dans le fichier test, cela fonctionne, mais pas dans mon fichier complet😰😰😰
Il doit y avoir une interaction quelque part, que je n'arrive pas à identifier...
Malheureusement, comme je l'ai dit à Gégé, ça va être un peu compliqué d'anonymiser le fichier, surtout qu'il fonctionne en liaison avec d'autres fichiers, plus avec l'Active Directory du serveur....
 

ThierryP

XLDnaute Occasionnel
Re bonjour,
Tout ça me paraît normal car tu initialise ton USF en donnant la main au contrôle Textbox dont tu testes la valeur dès que tu en sors :
VB:
If TB_Heures = "" Then MsgBox "Vous n'avez pas entré d'heure, veuillez corriger.": GoTo fin
De ce fait, où que tu cliques ailleurs, tu auras le message si le TB est vide.
À mon avis, il faut trouver un autre moyen de tester la valeur des TB.
Cordialement,
Re,
Oui, je suis en train de me rendre compte que quelque chose cloche quelque part entre la chaise et l'écran.....
Je n'ai jamais été très à l'aise avec la gestion des USF !!!

Merci de m'aider à garder quelques neurones opérationnels !
 

vgendron

XLDnaute Barbatruc
Perso, le controle de la présence des données necessaires, je le fais toujours dans le bouton "valider"
l'exit peut par contre servir à controler la validité des données saisies (et encore.. j'utilise plutot l'évènement _change, ou _afterupdate)...
 

Discussions similaires

Réponses
2
Affichages
369
Réponses
32
Affichages
694

Statistiques des forums

Discussions
314 017
Messages
2 104 579
Membres
109 081
dernier inscrit
Vio21