Controles lors sortie de texbox ne fonctionne pas

donpopo

XLDnaute Occasionnel
Bonjour le forum,
Jusqu'à présent, j'ai bien avancé sur mon programme en cherchant sur les forums et les tutoriels.
Cependant, je bloque depuis quelques temps sur un problème avec un userform.

J'ai un userform avec 6 textbox dont une qui doit renfermer du numérique.
Pour la gestion du numérique, OK.

Mais où cela pose problème, je voudrais que, chaque fois que l'on quitte un textbox, on s'assure que celui-ci n'est pas vide et que le focus reste sur celui-ci tant qu'il est vide avec apparition d'un label d'information tant que la condition n'est pas remplie. Pour le moment, le controle se fait lorsque je pousse le bouton "Encoder".

J'ai programmé une bonne partie, mais le résultat n'est pas à la hauteur souhaitée.
J'ai joint un petit fichier exemple pour une meilleure compréhension.

Si une bonne âme avait une idée pour me démêler ces procédures?
Merci d'avance
donpopo
 

Pièces jointes

  • Classeur1.xlsm
    23.8 KB · Affichages: 36

CHALET53

XLDnaute Barbatruc
Bonjour,

Peut-être comme ceci : (à généraliser)

Private Sub TextBox2_Exit(ByVal Cancel As MSForms.ReturnBoolean)
If TextBox2 = "" Then MsgBox ("Saisir avant de quitter Textbox2"): Cancel = True: TextBox2.SetFocus
End Sub


Private Sub TextBox3_Exit(ByVal Cancel As MSForms.ReturnBoolean)
If TextBox3 = "" Then MsgBox ("Saisir avant de quitter Textbox3"): Cancel = True: TextBox3.SetFocus
End Sub

a+
 

donpopo

XLDnaute Occasionnel
Bonjour,
Merci pour la réponse; je l'ai intégrée pour la textbox 1 qui ne doit comporter que des nombres de 5 à 17 et de 20 à 30; cela fonctionne bien, mais lorsque je veux quitter le formulaire avec cette textbox à vide, le message d'affiche sans arrêt et refuse la fermeture du formulaire! Même chose lorsque j'écris la procédure pour textbox2, le focus se met direct sur textbox2 et me mets déjà le message et impossible de quitter.
J'ai remis le fichier exemple avec mes modifications.
Georges
 

Pièces jointes

  • Classeur1.xlsm
    21 KB · Affichages: 40

job75

XLDnaute Barbatruc
Bonjour donpopo, CHALET53, Laetitia,

Dans l'UserForm modifier ainsi le code des TextBox :
Code:
Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean) ' Vérifie la sélection de lignes adequates.(4 à 17 et 20 à 30) et met le numero de ligne dans NrLigEnc
    If TextBox1 >= 4 And TextBox1 <= 17 Or TextBox1 >= 20 And TextBox1 <= 30 Then
        NrLigEnc = TextBox1
    Else
        TextBox1 = ""
        Application.OnTime 1, "Quitter_TextBox1"
    End If
End Sub

Private Sub TextBox2_Exit(ByVal Cancel As MSForms.ReturnBoolean)
    If TextBox2 = "" Then Application.OnTime 1, "Quitter_TextBox2"
End Sub
Et placer dans un module standard (Module1) :
Code:
Sub Quitter_TextBox1()
    On Error Resume Next
    With UserForm3
        If .ActiveControl.Name = "Bout_Quitter" Then Exit Sub
        MsgBox "Saisir un nombre compris de 4 à 17 ou de 20 à 30 !"
        .TextBox1.SetFocus
    End With
End Sub

Sub Quitter_TextBox2()
    On Error Resume Next
    With UserForm3
        If .ActiveControl.Name = "Bout_Quitter" Then Exit Sub
        MsgBox "Saisir avant de quitter Textbox2"
        .TextBox2.SetFocus
    End With
End Sub
A+
 
Dernière édition:

donpopo

XLDnaute Occasionnel
Bonjour Laetitia, CHALET53, job75 et le forum.

je viens de tester les deux propositions. Toutes deux fonctionnent.
Au niveau compréhension de la programmation, j'ai plus facile de saisir les procédure de job75.

Mais chez Laetitia, ce que je n'ai pas avec job75, c'est que, lorsque je lance le userform, le focus se place sur le textbox1 'N° de ligne'; chez job75, le focus se place a première vue, sur le Textbox2.
y a t'il un moyen d'y remédier?

Merci d'avance,
Georges
 

job75

XLDnaute Barbatruc
Re,
Mais chez Laetitia, ce que je n'ai pas avec job75, c'est que, lorsque je lance le userform, le focus se place sur le textbox1 'N° de ligne'; chez job75, le focus se place a première vue, sur le Textbox2.
y a t'il un moyen d'y remédier?

C'est élémentaire, mettez la propriété TabIndex de TextBox1 à 0.

Et revoir peut-être l'ordre de tabulation des autres contrôles.

A+
 

job75

XLDnaute Barbatruc
Re,

Du coup il y a problème si l'on quitte TextBox1 par la touche de tabulation.

Pour y remédier modifiez la 2ème macro dans Module1 :
Code:
Sub Quitter_TextBox2()
    On Error Resume Next
    With UserForm3
        If .ActiveControl.Name = "TextBox1" Or .ActiveControl.Name = "Bout_Quitter" Then Exit Sub
        MsgBox "Saisir avant de quitter Textbox2"
        .TextBox2.SetFocus
    End With
End Sub
Fichier joint.

A+
 

Pièces jointes

  • Classeur(1).xlsm
    33.5 KB · Affichages: 37

donpopo

XLDnaute Occasionnel
Dernière question, je promets.
pour le 3eme texbox et suivants, je procède comme suit?

Sub Quitter_TextBox3()
On Error Resume Next
With UserForm3
If .ActiveControl.Name = "TextBox2" Or .ActiveControl.Name = "Bout_Quitter" Then Exit Sub
MsgBox "Saisir la dénomination de la valeur"
.TextBox3.SetFocus
End With
End Sub
 

job75

XLDnaute Barbatruc
Re,

On va maintenant faire plus subtil, dans l'UserForm :
Code:
Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean) ' Vérifie la sélection de lignes adequates.(4 à 17 et 20 à 30) et met le numero de ligne dans NrLigEnc
    If TextBox1 >= 4 And TextBox1 <= 17 Or TextBox1 >= 20 And TextBox1 <= 30 Then
        NrLigEnc = TextBox1
    Else
        TextBox1 = ""
        message = "Saisir un nombre compris de 4 à 17 ou de 20 à 30 !"
        Set ctrl = TextBox1
        Application.OnTime 1, "Quitter_TextBox"
    End If
End Sub

Private Sub TextBox2_Exit(ByVal Cancel As MSForms.ReturnBoolean)
    If flag Or TextBox2 <> "" Then Exit Sub
    message = "Saisir avant de quitter Textbox2"
    Set ctrl = TextBox2
    Application.OnTime 1, "Quitter_TextBox"
End Sub

Private Sub TextBox3_Exit(ByVal Cancel As MSForms.ReturnBoolean)
    If flag Or TextBox3 <> "" Then Exit Sub
    message = "Saisir la dénomination de la valeur"
    Set ctrl = TextBox3
    Application.OnTime 1, "Quitter_TextBox"
End Sub
Une seule macro dans Module1 mais avec des variables Public :
Code:
Public message$, ctrl As Control, flag As Boolean

Sub Quitter_TextBox()
    On Error Resume Next
    If UserForm3.ActiveControl.Name = "Bout_Quitter" Then Exit Sub
    MsgBox message
    flag = True: ctrl.SetFocus: flag = False
End Sub
Fichier (2).

A+
 

Pièces jointes

  • Classeur(2).xlsm
    32.1 KB · Affichages: 33

donpopo

XLDnaute Occasionnel
Bonjour job75, le forum,
cette dernière proposition est idéale; en effet, les messages alourdissaient un peu le formulaire.
J'ai adapté les procédure à mes autres textbox et tout fonctionne parfaitement.
Encore merci.
Bonne fin de journée.
 

Discussions similaires

Statistiques des forums

Discussions
311 735
Messages
2 082 024
Membres
101 873
dernier inscrit
excellllll