Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Affichage curseur dans un textbox

23 views
Skip to first unread message

ThierryP

unread,
May 9, 2022, 7:40:44 AM5/9/22
to
Bonjour le forum et Denis,

Je fais un contrôle de saisie de données dans un TextBox sur un USF, comme ceci :
Private Sub Txt_Nom_Exit(ByVal Cancel As MSForms.ReturnBoolean)
If IsNull(Txt_Nom) Or Txt_Nom = "" Then MsgBox "Saisie obligatoire": Txt_Nom.SetFocus: Cancel = True
End Sub

Je pensais que le SetFocus postionnait le curseur clignotant dans le TextBox... Eh ben non ! Et si je tente de saisir une donnée dès après le Cancel=True, le TextBox ne se remplit pas, d'où ma question : Où est le focus ????????

Qu'est-ce que je ne fais pas correctement ?

Merci d'avance,

ThierryP

ThierryP

unread,
May 9, 2022, 8:06:04 AM5/9/22
to
Je viens de trouver un post où il est dit que SetFocus ne fonctionne pas avec _Exit.......
Du coup j'essaie avec _BeforeUpdate, mais si le TextBox reste vide, on ne passe pas dans la Sub, pareil avec le _AfterUpdate, snifff........

Je pourrais laisser le curseur dans le TextBox, mais je souhaite un message d'alerte et c'est ça qui pose problème : la MessageBox prend le focus ....

MichD

unread,
May 9, 2022, 8:29:08 AM5/9/22
to
Le 09/05/22 à 07:40, ThierryP a écrit :
Bonjour,

Ceci fonctionne très bien!
Tu devrais éviter d'écrire du code comme si c'était une dictée.
Cela rend la lecture de ce dernier plus difficile...

'--------------------------------
Private Sub Txt_Nom_Exit(ByVal Cancel As MSForms.ReturnBoolean)
If IsNull(Txt_Nom) Or Txt_Nom = "" Then
MsgBox "Saisie obligatoire"
Txt_Nom.SetFocus: Cancel = True
With Me.Txt_Nom
.SetFocus
.SelStart = 0
End With
End If
End Sub
'--------------------------------

MichD

MichD

unread,
May 9, 2022, 8:52:12 AM5/9/22
to

Le 09/05/22 à 08:28, MichD a écrit :
> Le 09/05/22 à 07:40, ThierryP a écrit :
>> Bonjour le forum et Denis,
>>
>> Je fais un contrôle de saisie de données dans un TextBox sur un USF,
>> comme ceci :
>> Private Sub Txt_Nom_Exit(ByVal Cancel As MSForms.ReturnBoolean)
>> If IsNull(Txt_Nom) Or Txt_Nom = "" Then MsgBox "Saisie obligatoire":
>> Txt_Nom.SetFocus: Cancel = True
>> End Sub
>>
>> Je pensais que le SetFocus postionnait le curseur clignotant dans le
>> TextBox... Eh ben non ! Et si je tente de saisir une donnée dès après
>> le Cancel=True, le TextBox ne se remplit pas, d'où ma question : Où
>> est le focus ????????
>>
>> Qu'est-ce que je ne fais pas correctement ?
>>
>> Merci d'avance,
>>
>> ThierryP
>
> Bonjour,
>
> Ceci fonctionne très bien!
> Tu devrais éviter d'écrire du code comme si c'était une dictée.
> Cela rend la lecture de ce dernier plus difficile...
>
> '--------------------------------
> Private Sub Txt_Nom_Exit(ByVal Cancel As MSForms.ReturnBoolean)
> If IsNull(Txt_Nom) Or Txt_Nom = "" Then
>     MsgBox "Saisie obligatoire"
>     Cancel = True
>     With Me.Txt_Nom
>         .SetFocus
>         .SelStart = 0
>     End With
> End If
> End Sub
> '--------------------------------
>
> MichD

Enlève ce que j'ai oublié, nullement nécessaire.

Txt_Nom.SetFocus:

MichD

ThierryP

unread,
May 9, 2022, 8:53:14 AM5/9/22
to
Bonjour Denis,

Désolé, un copier/coller non relu !
... Et encore plus désolé que ce que tu me proposes ne fonctionne pas chez moi :-(
J'avais également tenté le SelStart, mais pas mieux...
Après le click sur le OK du msgbox, le focus revient bien sur l'USF, mais le curseur n'est toujours pas dans le TextBox contrôlé et pas dans le suivant non plus...
Je pense que je vais remplacer le MSgBox par un label avec un message d'erreur, comme ça le focus ne changera pas !

Merci de t'intéresser à mon souci !

ThierryP

ThierryP

unread,
May 9, 2022, 9:11:44 AM5/9/22
to
ça fonctionne en passant par un Label :
Private Sub Txt_Nom_Exit(ByVal Cancel As MSForms.ReturnBoolean)
If Txt_Nom = "" Then
With Lbl_MSgErreur
.Visible = True
.Caption = "Champ obligatoire"
End With
Cancel = True
With Me.Txt_Nom
.SetFocus
.SelStart = 0
End With
Else
With Lbl_MSgErreur
.Visible = False
.Caption = ""
End With
End If
End Sub

mais du coup, cela amène une autre question !
Comme j'ai plusieurs textbox à contrôler, est-il possible d'écrire une fonction / sub en passant en paramètres le nom du textbox et le label et en retournant l'état du Cancel ? (mon premier essai n'est pas concluant, mais je n'ai encore jamais essayé ce genre de choses !!!) ?

ThierryP

ThierryP

unread,
May 9, 2022, 10:42:36 AM5/9/22
to
Finalement, .... et après quelques recherches, j'ai trouvé mon bonheur !

Merci Denis pour ton aide !

ThierryP

MichD

unread,
May 9, 2022, 11:56:22 AM5/9/22
to

Le 09/05/22 à 10:42, ThierryP a écrit :
> Finalement, .... et après quelques recherches, j'ai trouvé mon bonheur !
>
> Merci Denis pour ton aide !
>
> ThierryP


Le code soumis fait ce que tu demandes, place le curseur de la souris
clignotant dans le textbox. (tester avec Excel 2016)

'.----------------------
Private Sub Txt_Nom_Exit(ByVal Cancel As MSForms.ReturnBoolean)
If IsNull(Txt_Nom) Or Txt_Nom = "" Then
MsgBox "Saisie obligatoire"
Txt_Nom.SetFocus: Cancel = True
With Me.Txt_Nom
.SetFocus
.SelStart = 0
End With
End If
End Sub
'.----------------------

P.S. Si tu as trouvé une solution qui convient, pourquoi ne pas la
publier pour les autres en profite?

MichD

ThierryP

unread,
May 10, 2022, 2:29:50 AM5/10/22
to
Bonjour Denis !

Effectivement, ce code fonctionne aussi chez moi (Excel 2019) sur un fichier neuf..... mais pas sur mon fichier en cours, et je ne vois pas pourquoi !
Mais finalement, afficher un label à côté du textbox est plus ergonomique, on évite de cliquer sur le msgbox.
Hier, je n'avais pas le temps de publier mon code, que voici :

Avec chaque TextBox :
Private Sub Txt_Nom_Exit(ByVal Cancel As MSForms.ReturnBoolean)
Cancel = Controle_Saisie(Txt_Nom)
End Sub

et la fonction qui va bien :

Private Function Controle_Saisie(T As MSForms.TextBox) As Boolean
If T = "" Then
With Lbl_MSgErreur ' Label qui signale l'erreur
.Visible = True
.Caption = "Champ obligatoire"
.Top = T.Top
.Left = T.Left + T.Width + 10
.ForeColor = 255
End With
With T
.SetFocus
.SelStart = 0
End With
Controle_Saisie = True
Else
With Lbl_MSgErreur
.Visible = False
.Caption = ""
End With
Controle_Saisie = False
End If
End Function

ThierryP

ThierryP

unread,
May 10, 2022, 10:15:56 AM5/10/22
to
Bonjour Denis,

Ma fonction fonctionne bien !
Ma question du jour..... Sur mon USF, j'ai aussi des combobox dont je voudrais également contrôler la saisie.
Y a-t-il un moyen dde dire à ma fonction d'agir soit sur un TextBox, soit sur un ComboBox ?
Le but étant d'éviter d'écrire deux fois la même fonction.......

Merci d'avance,

ThierryP

MichD

unread,
May 10, 2022, 9:15:41 PM5/10/22
to
Le 10/05/22 à 10:15, ThierryP a écrit :
La ligne de déclaration de ta fonction :

Remplace ceci :

Private Function Controle_Saisie(T As MSForms.TextBox) As Boolean


PAR :

Private Function Controle_Saisie(T As Object) As Boolean

Voilà!

MichD

ThierryP

unread,
May 11, 2022, 3:01:10 AM5/11/22
to
Bonjour Denis,

Dit comme çà, ça a l'air tout bête !!!
Encore merci,
0 new messages