Affichage curseur dans un textbox

11 réponses
Avatar
ThierryP
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

10 réponses

1 2
Avatar
ThierryP
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 ....
Avatar
MichD
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"
Txt_Nom.SetFocus: Cancel = True
With Me.Txt_Nom
.SetFocus
.SelStart = 0
End With
End If
End Sub
'--------------------------------
MichD
Avatar
MichD
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
Avatar
ThierryP
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
Avatar
ThierryP
ç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
Avatar
ThierryP
Finalement, .... et après quelques recherches, j'ai trouvé mon bonheur !
Merci Denis pour ton aide !
ThierryP
Avatar
MichD
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
Avatar
ThierryP
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
Avatar
ThierryP
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
Avatar
MichD
Le 10/05/22 Í  10:15, ThierryP a écrit :
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

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
1 2