XL 2019 Redonner le focus à un TextBox

ThierryP

XLDnaute Occasionnel
Bonjour le forum,

Je bute sur un truc (sûrement tout bête....) :
Sur un USF, j'ai un TextBox sur lequel je fais un contrôle de saisie :

VB:
Private Sub TB_Ref_BCF_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
If KeyCode = 13 Then
    If Not TB_Ref_BCF.Text = "" Then
        If (Len(TB_Ref_BCF.Text) <> 6 And Len(TB_Ref_BCF.Text) <> 5) Or Not IsNumeric(TB_Ref_BCF.Text) Then
            MsgBox "Mauvais code affaire"
            With Soupapes.TB_Ref_BCF
                .Text = ""
                .SetFocus
            End With
            Exit Sub
        End If
        Application.EnableEvents = False
        Range("Cde_BCF") = TB_Ref_BCF.Text
        Application.EnableEvents = True
    End If
End If
End Sub

Je pensais naïvement que le .SetFocus allait remettre le curseur dans mon Textbox..... Eh ben non ! Le focus passe au contrôle suivant (un Combobox). Donc je me suis dit que je pouvais tenter ceci avec mon Combobox :
Code:
Private Sub CB_Technicien_Enter()
If Me.TB_Ref_BCF.Text = "" Then Me.TB_Ref_BCF.SetFocus
End Sub

Si mon Textbox est vide, alors je lui redonne la main... Eh ben, non plus !

Alors là, je sèche....
Donc, si une âme charitable pouvait me dire ce qui cloche, ça m'éviterait de mettre le feu à mon PC !!!
 

patricktoulon

XLDnaute Barbatruc
bonjour
peu être en annulant la touche keycode si les conditions ne sont pas remplies tout simplement
VB:
Private Sub TB_Ref_BCF_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
If KeyCode = 13 Then
    If Not TB_Ref_BCF.Text = "" Then
        If (Len(TB_Ref_BCF.Text) <> 6 And Len(TB_Ref_BCF.Text) <> 5) Or Not IsNumeric(TB_Ref_BCF.Text) Then
            keycode=0
            MsgBox "Mauvais code affaire"
            With Soupapes.TB_Ref_BCF
                .Text = ""
                End With
            Exit Sub
        End If
        Application.EnableEvents = False
        Range("Cde_BCF") = TB_Ref_BCF.Text
        Application.EnableEvents = True
    End If
End If
End Sub
 

ThierryP

XLDnaute Occasionnel
Bonsoir Deadpool,

Te lancer dans quoi ??? Je demande juste pourquoi le .SetFocus ne fonctionne pas, je ne veux pas que quelqu'un écrive le code à ma place !
Je n'ai pas joint le fichier parce qu'il n'y a rien dans mon code qui puisse venir "parasiter" le fonctionnement entre mes deux contrôles et que ça me prendrait trop de temps d'anonymiser mon fichier, mais voici le code complet de mon USF :

VB:
Option Explicit

Private Sub CB_Choix_Client_Click() 'ComboBox alimenté par une plage dynamique
If Not CB_Choix_Client.Text = "" Then Range("CodeClient") = CB_Choix_Client.Text
TB_Ref_Client.SetFocus
End Sub

Private Sub CB_Choix_Soupape_Click() 'ComboBox alimenté par une plage dynamique
If Not CB_Choix_Soupape.Text = "" Then Range("ChoixSoupape") = CB_Choix_Soupape.Text
CB_Choix_Client.SetFocus
End Sub

Private Sub CB_Technicien_Click() 'ComboBox alimenté par une plage
Range("Technicien") = CB_Technicien.Text
End Sub

Private Sub CMB_Edition_Click() 'CommandButton
Call Edition_Certificat
End Sub

Private Sub TB_Num_Soupape_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
If KeyCode = 13 Then
    If Not TB_Num_Soupape.Text = "" Then
        If Range("Fin_Numeros").End(xlUp).Row < Range("Fin_Numeros").Row - 1 Then
            Application.EnableEvents = False
            Range("C" & Range("Fin_Numeros").End(xlUp).Row).Offset(1, 0) = TB_Num_Soupape.Text
        Else
            MsgBox "5 numéros seulement"
        End If
        TB_Num_Soupape.Text = ""
    End If
End If
Application.EnableEvents = True
End Sub

Private Sub TB_Ref_BCF_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
If KeyCode = 13 Then
    If Not TB_Ref_BCF.Text = "" Then
        If (Len(TB_Ref_BCF.Text) <> 6 And Len(TB_Ref_BCF.Text) <> 5) Or Not IsNumeric(TB_Ref_BCF.Text) Then
            MsgBox "Mauvais code affaire"
            With Soupapes.TB_Ref_BCF
                .Text = ""
                .SetFocus
            End With
            Exit Sub
        End If
        Application.EnableEvents = False
        Range("Cde_BCF") = TB_Ref_BCF.Text
        Application.EnableEvents = True
    End If
End If
End Sub

Private Sub TB_Ref_Client_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
If KeyCode = 13 Then If Not TB_Ref_Client.Text = "" Then Range("CdeClient") = TB_Ref_Client.Text
End Sub

Private Sub UserForm_Initialize()
Dim Controle As Control
For Each Controle In Me.Controls
    Select Case TypeName(Controle)
        Case "ComboBox", "TextBox"
            Controle.Text = ""
        Case Else
    End Select
Next
End Sub
 

Deadpool_CC

XLDnaute Accro
Le code du userform sans le userform pour tester et comprendre pourquoi, voir trouver une solution ... pas certain mais bon ...
Après tu veux pas fournir de fichier d'exemple ... pas de soucis ... moi ca me dérange pas ... je vis très bien sans.

Dans tout les cas, bon courage à toi :)
 

ThierryP

XLDnaute Occasionnel
Bonjour,

Ce n'est pas que je ne veux pas, mais en faisant du pas à pas, à aucun moment je ne passe par quelque chose qui pourrait influer sur le comportement de mes contrôles, je pensais donc plus à un problème situé entre la chaise et l'écran !
Ci-joint un fichier exemple. L'USF est fonctionnel, le souci est sur le TextBox TB_Ref_BCF
 

Pièces jointes

  • Test.xlsm
    82.3 KB · Affichages: 6
C

Compte Supprimé 979

Guest
Bonjour le fil

@ThierryP, perso j'utiliserais plutôt cet évènement 🤔
VB:
Private Sub TB_Ref_BCF_Exit(ByVal Cancel As MSForms.ReturnBoolean)
  If Not TB_Ref_BCF.Text = "" Then
    If (Len(TB_Ref_BCF.Text) <> 6 And Len(TB_Ref_BCF.Text) <> 5) Or Not IsNumeric(TB_Ref_BCF.Text) Then
        MsgBox "Mauvais code affaire"
        Me.TB_Ref_BCF.Text = ""
        Cancel = True
    Else
      Application.EnableEvents = False
      Range("Cde_BCF") = TB_Ref_BCF.Text
      Application.EnableEvents = True
    End If
  End If
End Sub

A+
 

ThierryP

XLDnaute Occasionnel
Bonjour Bruno,

Effectivement, c'est beaucoup plus judicieux..... J'ai recyclé un vieux code sans prendre le temps de réfléchir....

Par contre, ça ne change rien à mon souci initial, qui est de redonner le focus à ma TextBox si la saisie est incorrecte mais que VBA refuse obstinément d'appliquer😥
 
C

Compte Supprimé 979

Guest
Re,

Le focus doit bien être mis sur la TB_Ref_BCF en cas de mauvaise saisie ?

Donc il n'y a pas lieu que ça ne fonctionne pas 🤔

Avec le fichier joint cela fonctionne puisque le Exit est Cancel s'il s'agit d'une mauvaise valeur

A+
 

Pièces jointes

  • ThierryP_Test.xlsm
    83.3 KB · Affichages: 4

patricktoulon

XLDnaute Barbatruc
RE
Bonjour a tous
dans le keydown 13 ou 9 (enter ou tab) le keycode=0 si des conditions ne sont pas respectées

VB:
Private Sub TB_Ref_BCF_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
If KeyCode = 13 or keycode =9 Then
    If Not TB_Ref_BCF.Text = "" Then
        If (Len(TB_Ref_BCF.Text) <> 6 And Len(TB_Ref_BCF.Text) <> 5) Or Not IsNumeric(TB_Ref_BCF.Text) Then
            keycode=0
            MsgBox "Mauvais code affaire"
            With Soupapes.TB_Ref_BCF
                .Text = ""
                End With
            Exit Sub
        End If
        Application.EnableEvents = False
        Range("Cde_BCF") = TB_Ref_BCF.Text
        Application.EnableEvents = True
    End If
End If
End Sub
 

patricktoulon

XLDnaute Barbatruc
re
oserais je dire aussi qu'avant de batailler pour garder le focus sur un textbox en sortie( enter / tab / ou exit )
si la valeur tapée ne respecte pas des conditions , il est tres facile de le forcer a ne pouvoir recevoir que des touche numériques
cela peut se faire aussi dans le keydown en convertissant le keycode en asc (keyascii)
faut il que je fasse un exemple ?
c'est vrai que quand j'ai recopier le code pour y mettre le keycode=0 je n'ai pas regarder la co triple condition
d'ailleurs il y a un bellugue dans le raisonnement
VB:
If (Len(TB_Ref_BCF.Text) <> 6 And Len(TB_Ref_BCF.Text) <> 5)
il faudra m'expliquer le but de cette double condition 😂 sachant que de toute manière l'une va contre l'autre

je me pose une question
que se passe t il si pas différent de 6 mais =5
ou encore = 6 et donc différent de 5 ce qui déjà en soit est assez comique
je dis ca moi je dis rien

bon d'accords je sort
Its Friday Animation GIF by Universal Kids
 
Dernière édition:

patricktoulon

XLDnaute Barbatruc
c'est pas du vba mal écrit
le vba c'est la traduction du raisonnement rien de plus

voici un exemple de textbox contraint a 6 caractères et uniquement numériques
tout en gardant la touche back et suppr pour revenir éventuellement sur la saisie
et annule la touche enter ou tab si pas 6 caractères
j'ajoute l'event Exit au cas ou ça se ferait par la sélection d'un autre textbox
essaie donc de taper autre chose qu'un nombre de 6 chiffre avec ceci
ou de sortir avant

VB:
Private Sub TB_Ref_BCF_Exit(ByVal Cancel As MSForms.ReturnBoolean)
    With TB_Ref_BCF
        Cancel = Len(.Value) <> 6
        If Not Cancel Then
            Application.EnableEvents = False
            Range("Cde_BCF") = TB_Ref_BCF.Text
            Application.EnableEvents = True
        End If
    End With
End Sub

Private Sub TB_Ref_BCF_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
    With TB_Ref_BCF
        Select Case KeyCode
                'on laisse les touches numeiques du pavé fonctionnelles
            Case 96 To 105: If Len(.Value) = 6 Then KeyCode = 0

                'converti le keycode des touches  du haut du clavier
            Case 48 To 57: KeyCode = KeyCode + 48
                If Len(.Value) = 6 Then KeyCode = 0

                'on annule la touche enter  et tab si pas 6 chiffre mais on peut sortir si vide
            Case 13, 9 'case ENTER ou tab
                If .Value <> "" Then
                    If Len(.Value) < 6 Then
                        KeyCode = 0
                    Else
                        Application.EnableEvents = False
                        Range("Cde_BCF") = TB_Ref_BCF.Value
                        Application.EnableEvents = True
                    End If
                End If

                'on laisse l'utilisation des touches back et suppr fonctionnelles
            Case 8, 46

                'annule toute autres touches
            Case Else: KeyCode = 0
        End Select
    End With
End Sub
maintenant tu sais ce que veut dire "KeyCode =0" ;)
 

ThierryP

XLDnaute Occasionnel
Mea culpa ! Pour la double (triple !) condition, j'avais fait un copier/coller vite fait suite à une urgence, et je n'ai pas vraiment relu !

Ta solution est très propre d'un point de vue programmation, je vais juste ajouter un message d'avertissement, pour ne pas être appelé toutes les 10 minutes par les utilisateurs : "Thierry, j'comprends pas, je tape dans le rectangle blanc, là devant moi, mais y s'passe rien ! Tu peux venir ?":mad::mad::mad:
 

Discussions similaires

Réponses
2
Affichages
89

Statistiques des forums

Discussions
315 095
Messages
2 116 166
Membres
112 675
dernier inscrit
Tazra_IMOU