Out, l'évènement "Exit"…

BenHarber

XLDnaute Occasionnel
Bonjour mes Excel-liens préférés,
Je rencontre un nouveau pb lié aux contrôles d'usf.

Soit un usf qui contient 2 contrôles Frame (cadre).
Le 1er frame contient lui même 2 textbox que j'ai liés à l'événement "Exit" qui est censé se déclencher lorsque l'utilisateur clique dans le textbox1 ou textbox2 et en "sorte" sans le renseigner.
(cf. fichier joint)

Ma question est : pourquoi, lorsque je "sors" du textbox1 pour cliquer directement dans le textbox3 du frame 2, l'événement "Exit" ne se déclenche pas ? Idem lorsque je passe du textbox2 au textbox3 en tabulant ou en cliquant directement dans textbox3 : l'événement "Exit" ne se déclenche pas !

On dirait que les contrôles sont inopérants quand il y a des Frame dans l'usf et que l'on passe directement d'un Frame à l'autre ? Quelqu'un parmi vous voit-il un moyen de contourner ce "bug" ?

Merci d'avance pour vos suggestions,

Cordialement,
 

Pièces jointes

  • Exit marche pas.xls
    34 KB · Affichages: 46

MichelXld

XLDnaute Barbatruc
Re : Out, l'évènement "Exit"…

bonsoir

ça fait un peu (beaucoup) usine à gaz mais j'espère que ça pourra t'aider à gérer les évènements "Focus" dans les TextBox/Frames.

Par contre, évite les MsgBox car la macro ne va pas trop apprécier (Tu pourrais par exemple le remplacer par un Label)

la source utilisée :
MrExcel Message Board :: View topic - Controling colors of controls in userform
Masaru Kaji aka Colo [MVP]

La procédure garde le focus sur le TextBox tant qu'il est vide.

Code:
'---- dans un module de classe nommé Classe1
Option Explicit

Public Event GetFocus()
Public Event LostFocus(ByVal Txtbx As String)
Public nomObjActif As String
 
Public Sub cibleFocus(USF As MSForms.UserForm)
With USF
    If TypeName(.ActiveControl) = "Frame" Then
        If TypeName(.Controls(.ActiveControl.Name).ActiveControl) = "TextBox" Then
        nomObjActif = .Controls(.ActiveControl.Name).ActiveControl.Name
        
        On Error GoTo errorHandler
        Do
            DoEvents
            If .ActiveControl.Name <> nomObjActif Then
                If TypeName(.Controls(.ActiveControl.Name).ActiveControl) = "TextBox" Then
                    If TypeName(.ActiveControl) = "Frame" Then
                        RaiseEvent LostFocus(nomObjActif)
                        nomObjActif = .Controls(.ActiveControl.Name).ActiveControl.Name
                        RaiseEvent GetFocus
                    End If
                End If
            End If
        Loop
       End If
    End If
End With

errorHandler:
Exit Sub
End Sub


Code:
'---  dans l'UserForm  ---
Option Explicit
Private WithEvents USF As Classe1

Private Sub UserForm_Activate()
    Set USF = New Classe1
    
    TextBox1.SetFocus
    Me.Controls(Me.ActiveControl.Name).ActiveControl. _
        Object.BackColor = RGB(225, 225, 125)
        
    USF.cibleFocus Me
End Sub

Private Sub USF_GetFocus()
    Me.Controls(Me.ActiveControl.Name).ActiveControl. _
        Object.BackColor = RGB(225, 225, 125)
End Sub

Private Sub USF_LostFocus(ByVal Txtbx As String)
    Me.Controls(Txtbx).BackColor = RGB(255, 255, 255)
    
    If Me.Controls(Txtbx).Value = "" Then _
        Me.Controls(Txtbx).SetFocus
End Sub

Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
    Set USF = Nothing
End Sub
'----------------


Bonne soirée
MichelXld
 

BenHarber

XLDnaute Occasionnel
Re : Out, l'évènement "Exit"…

Bonjour JMPS et Michel et merci pour vos réponses.
Le + simple pour moi sera dans l'immédiat de mettre en oeuvre ta solution jmps. Glisser un controle Frame_Exit m'apparait comme le + simple moyen d'arriver à mes fins.

Par contre, je vois bien que ta solution, Michel, est très aboutie (comme d'hab !) mais il me faut passer par un module de classe, méthode que je viens à peine d'appréhender (cf. mon post du 27/10/06 https://www.excel-downloads.com/threads/module-de-classe-help.69322/ et merci encore à Luc que je salue au passage) d'où + de temps à passer pour moi dans sa mise oeuvre. En +, j'ai beaucoup de msgBox en cas d'erreur de saisie : alors, si je dois tout revoir, je n'aurai pas fini au printemps prochain !

Merci pour la qualité de vos réponses qui, une fois de +, me permettent de progresser dans ce monde VBAïstique !

Cordialement,
 

Discussions similaires

H
Réponses
3
Affichages
1 K
HugoB99
H

Statistiques des forums

Discussions
314 017
Messages
2 104 582
Membres
109 083
dernier inscrit
Stef06