XL 2016 revenir dans une textbox après afterUpDate

RENAUDcyrille

XLDnaute Nouveau
Bonjour
Petit soucis. :)
Voici le contexte.
dans une textbox je rentre une date. quand je sort de la textbox (soit par la touche TAB ou par clique sur une autre textebox) il y a un contrôle qui s'effectue. Et s'il y a une erreur (exemple année inférieur à 1900), mon code avertie l'utilisateur, efface la donnée dans la textbox. Mon hic c'est que le curseur va dans la textbox suivante (par la touche TAB ou le clique)
Et je voudrais que le curseur revienne dans cette texte box.
Voici un extrait du code que j'ai mis :
Option Explicit
Dim essais As Integer 'variable pour revenir dans textbox_Date

****
Private Sub TextBox_Date_AfterUpdate() 'textbox date
Dim an As Integer

'vérif si année au dessus de 1901

an = Right(TextBox_Date, 4)
If an < 1901 Then
MsgBox "Veuillez entrée une année après 1901, SVP"
TextBox_Date.Text = ""
essais = 1
Exit Sub

End If

End Sub
*****
Private Sub TextBox_Date_Exit(ByVal Cancel As MSForms.ReturnBoolean)
If essais = 1 Then TextBox_Date.SetFocus
End Sub

Par avance merci pour votre déblocage.
Salutations
 

Phil69970

XLDnaute Barbatruc
Bonjour @RENAUDcyrille

Je pense qu'il faut revoir la conception de ta textbox

A minima :

textbox1.value=format(textbox1.value,"dd/mm/yyyy")

Et un peu plus de contrôle

VB:
Private Sub TextBox1_Change()
Dim Valeur As Byte
TextBox1.MaxLength = 10
Valeur = Len(TextBox1)
'TextBox1.Value = Format(Date, "dd / mm / yyyy")
If Valeur = 2 Or Valeur = 5 Then TextBox1 = TextBox1 & "/"
End Sub

Private Sub UserForm_Initialize()
TextBox1.Value = "00/00/0000"
End Sub

Voir encore plus de contrôle:

Avec le fichier c'est toujours mieux

Si la saisie est valide plus besoin de revenir en arrière ....

@Phil69970
 
Dernière édition:

patricktoulon

XLDnaute Barbatruc
re
Bonjour à tous
@Phil69970 comme je l'ai dis à un autre membre très récemment ce n'est pas une bonne idée de forcer les séparateurs (If Valeur = 2 Or Valeur = 5 Then TextBox1 = TextBox1 & "/")dans l'events change
car si l'on se trompe et que l'on veux revenir on est bloqué a 3 ou 6 caractères ou obligé de tout selectionner et effacer (c'est pas très ergonomique et ça prends la tete un peu quand meme )

c'est dans l'events keydown avec un select case sur les chiffre qu'il faut régler cela

voici un datebox dans le quel il est impossible de taper autre chose qu'une date valide
VB:
'**********************************************************************************
' __        _____  ___   .  ___         _____  ___             ___
'|__|  /\     |   |   |  | |     | /      |   |   | |   | |   |   | |\  |
'|    /__\    |   |---   | |     |/\      |   |   | |   | |   |   | | \ |
'|   /    \   |   |   \  | |___  |  \     |   |___| |___| |__ |___| |  \|

'***********************************************************************************
'                 Fonction de formatage dynamique de textbox avec mask de saisie
'version 3.0
'Date version :17/01/2022
'model :                         DATEBOX format FR "dd/mm/yyyy"
'
'auteur:patricktoulon
'masque de sasie :  "__/__/____" ' il peut etre modifié selon votre souhait
'
'le masque de saisie peut etre visible ou pas
'***********************************************************************************

Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
     DateBoxMasK TextBox1, KeyCode, False              ' le mask de saisie sera invisible
End Sub
Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
    With TextBox1: Cancel = Not IsDate(.Value) And .Value <> "": End With
End Sub


Private Sub TextBox2_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
     DateBoxMasK TextBox2, KeyCode                     ' le mask de saisie sera visible
End Sub
Private Sub TextBox2_Exit(ByVal Cancel As MSForms.ReturnBoolean)
    With TextBox2: Cancel = Not IsDate(.Value) And .Value <> "": End With
End Sub


Private Sub DateBoxMasK(ByVal TbX As Object, ByVal KeyCode As MSForms.ReturnInteger, Optional MaskVisible As Boolean = True)
Dim V$, K&, Mask$, X&, Pos&
    Mask = "__/__/____"
    With TbX
        V = .Value & Mid(Mask, Len(.Value) + 1)       'on prend la valeur actuelle du textbox
        Pos = .SelStart + 1:

        Select Case KeyCode
            Case 96 To 105, 48 To 57
                If Pos = 3 Or Pos = 6 Then Pos = Pos + 1
                K = KeyCode:
                If K >= 96 Then K = K - 48:
                If Pos > 10 Then KeyCode = 0: Exit Sub
                Mid(V, Pos, 1) = Chr(K)
                If Pos = 2 Or Pos = 5 Then Pos = Pos + 1

                '*******Contrôle de la validité de la date*********
                If Val(V) > 31 Or Val(Mid(V, 1, 1)) > 3 Then V = Mask: Pos = 0
                If Val(Mid(V, 4, 1)) > 1 Or Val(Mid(V, 4, 2)) > 12 Then Mid(V, 4, 2) = Mid(Mask, 4, 2): Pos = 3
                If Mid(V, 7, 4) Like "####" Then an = Mid(V, 7, 4) Else an = "2004"
                If Mid(V, 1, 5) Like "##/##" Then If Not IsDate(Mid(V, 1, 6) & an) Then Mid(V, 4) = Mid(Mask, 4): Pos = 3
                '****fin de Contrôle de la validité de la date*****
                KeyCode = 0
            Case 8:
                If Pos = 7 Or Pos = 4 Then Pos = Pos - 1
                If Pos > 1 Then Mid(V, Pos - 1, 1) = Mid(Mask, Pos - 1, 1)
                Pos = Application.Max(0, Pos - 2)
                KeyCode = 0

            Case 13, 9
                If .Value <> "" Then If Len(.Value) < 10 Or InStr(1, V, "_") > 0 Then KeyCode = 0

            Case 27
                V = "": KeyCode = 0


            Case Else: KeyCode = 0                    'toutes les autres touches sont automatiquement annulées
        End Select
        If V = Mask Then V = ""
        If V <> "" And Not MaskVisible Then V = Split(V, Mid(Mask, 1, 1))(0)
        .Value = V
        .SelStart = Application.Min(10, Pos)
    End With


End Sub
 

RENAUDcyrille

XLDnaute Nouveau
Bonsoir
Effectuez le contrôle dans la Private Sub TextBox_Date_Exit(ByVal Cancel As MSForms.ReturnBoolean)
et pour empêcher d'en sortir mettez simplement Cancel = True
Merci pour la solution.

Pour Phil69970, désolé mais ta réponse était Hors sujet :). J'ai déjà mis en place un contrôle de date. Sauf si la l'année était avant 1900 car cela pose des soucis de calcul dans mon fichier excel après. mon soucis était vraiment de revenir dans la textbox après se contrôle.

mais merci quand même car j'ai appris des choses pour les prochaines fois.

Bonnes fêtes de fin d'année à tous.
 

Discussions similaires

Statistiques des forums

Discussions
312 115
Messages
2 085 453
Membres
102 890
dernier inscrit
selkis