IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

[RESOLU] Masque de saisie format date [XL-2010]


Sujet :

Macros et VBA Excel

  1. #1
    Membre averti
    Homme Profil pro
    Contrôleur de gestion
    Inscrit en
    Octobre 2017
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Contrôleur de gestion

    Informations forums :
    Inscription : Octobre 2017
    Messages : 17
    Par défaut [RESOLU] Masque de saisie format date
    Bonjour à tous,

    Je suis actuellement en train de créer un Userform contenant une Textbox à laquelle je voudrais donner un masque de saisie.

    Je suis arrivé tout seul à réaliser un aperçu en donnant une valeur de base à la textbox puis en réinitialisant cette valeur à la saisie avec un masque.

    Même si je suis satisfait du résultat obtenu, il n'en est que le perfectionniste que je suis n'est pas totalement heureux du fait que la valeur qui en ressort n'est pas en format date...

    En réalisant quelques recherches je suis tombé sur la discussion suivante : https://www.developpez.net/forums/d5...xtbox-datebox/

    J'avoue que je suis un peu perdu en lisant cela, ayant appris le codage VBA sur le tas et ne sachant réaliser que ce que j'ai produit auparavant (via des morceaux de codes trouvés et adaptés).

    Cependant, j'avoue que l'idée de structurer un peu plus mon codage me tente plutôt pas mal.. j'ai donc parcouru le poste préconisé et j'en ressors encore plus perdu.

    Si j'ai bien compris :

    On définit toutes les variables du fichier et on leur dit comment se comporter, plutot que de laisser la place à l'aléatoire. L'idée me plaît, surtout quand je dois contrôler des valeurs.

    On appelle ces différentes variables, qui ont différentes options, dans l'application.

    Est-ce bien cela ?



    J'aurai pu exporter le module et l'intégrer dans mon fichier avec les paramètres voulus, cela reste assez simple à faire. Cependant, et sur la base du module DateBox créé par Tirex28, j'aurai aimé avoir un masque YYYY-MM.

    J'ai donc rajouté un order et modifié les variables a chaque fois que le dbxXXXXXX était appelé. Vous vous doutez bien que cela a échoué.

    Si une âme charitable trouve le temps de m'expliquer un peu plus simplement le fonctionnement des variables de la DateBox, j'en serai très heureux

    Je ne peux malheureusement fournir de fichier avec ce que j'ai réalisé, puisque je n'ai en réalité fait que modifier la DateBox pour le moment...


    Merci d'avance,

    A vous lire,

    E.

  2. #2
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Billets dans le blog
    8
    Par défaut re
    bonsoir
    juste une question est ce de cela que tu parle en parlant de masque de saisie
    Nom : demo.gif
Affichages : 2487
Taille : 262,1 Ko
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  3. #3
    Membre averti
    Homme Profil pro
    Contrôleur de gestion
    Inscrit en
    Octobre 2017
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Contrôleur de gestion

    Informations forums :
    Inscription : Octobre 2017
    Messages : 17
    Par défaut
    Bonjour,

    C'est bien cela, mais avec un format :

    ____-__

    Je n'arrive pas à comprendre le fonctionnement des property etc.. je pense qu'il faut que je me penche dessus un peu plus en profondeur.

    Merci pour votre réponse !

  4. #4
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Billets dans le blog
    8
    Par défaut re
    re
    ca représente quoi ca "____-__"

    jamais vu un format de date comme ca ?
    dis moi ce que ca représente
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  5. #5
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 83
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Par défaut
    Bonjour Patrick
    je pense que cela correspond à ceci :
    j'aurai aimé avoir un masque YYYY-MM
    .
    Amitiés

  6. #6
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Billets dans le blog
    8
    Par défaut re
    Bonsoir jacques
    ok donc juste l'année et le mois

    je montrerais demain la méthode que j'ai employé

    principe

    1. interception de la touche tapé(keyascii ou/et keycode=0 mais memo de celle ci
    2. utilisation de instr(1,textbox,"-")
    3. utilisation de la FONCTION !! mid avec la position du instr
    4. pareil avec le keycode pour les touche back et suppr
    5. control du nombre pas plus grand que 31 pour la première tranche
    6. control du nombre pas plus grand que 12 pour la 2d
    7. teste de la validité du jour mois selon le mois(31/30/28)( if isdate(xxx....)
    8. repositionnement avec selstart avec le instr+1


    facilement adaptable a tout format
    a demain
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  7. #7
    Membre averti
    Homme Profil pro
    Contrôleur de gestion
    Inscrit en
    Octobre 2017
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Contrôleur de gestion

    Informations forums :
    Inscription : Octobre 2017
    Messages : 17
    Par défaut
    Bonjour Patrick !

    Ok, j'attends ton retour avec impatience !!

    Merci,

    E.

  8. #8
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Billets dans le blog
    8
    Par défaut re
    exemple
    textbox3
    pour la partie mois tu ne peut pas taper plus grand 12

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    Private Sub TextBox3_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
    Dim ind As Long, X As String
        If KeyCode = 8 And Not TextBox3 Like "*0-9*" Then
            KeyCode = 0
            ind = InStr(1, TextBox3, "_")
            If ind = 0 Then
                ind = Len(TextBox3)
            Else
                ind = InStr(1, TextBox3, "_") - 1
                If ind > 0 Then
                    If Mid(TextBox3, ind, 1) = "-" Then ind = ind - 1
                End If
            End If
            If ind <> 0 Then
                X = TextBox3.Text: Mid(X, ind, 1) = "_": TextBox3.Text = X
            End If
        End If
        TextBox3.SelStart = IIf(ind <> 0, ind - 1, Len(TextBox3))
    End Sub
    Private Sub TextBox3_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
        Dim l As String, ind As Long, X As String
        If Not IsNumeric(Chr(KeyAscii)) Then KeyAscii = 0: Exit Sub
        l = Chr(KeyAscii): KeyAscii = 0
        ind = InStr(1, TextBox3, "_")
        If ind = 6 And l > 1 Then KeyAscii = 0: Exit Sub
        If ind = 7 And Mid(TextBox3, 6, 1) = 1 And l > 2 Then KeyAscii = 0: Exit Sub
        If ind <> 0 Then: X = TextBox3.Text: Mid(X, ind, 1) = l: TextBox3.Text = X
        If TextBox3 Like "*_*" Then
            ind = InStr(1, TextBox3, "_")
            TextBox3.SelStart = IIf(ind <> 0, ind - 1, Len(TextBox3))
        End If
    End Sub
    Nom : demo.gif
Affichages : 2816
Taille : 139,4 Ko
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  9. #9
    Membre averti
    Homme Profil pro
    Contrôleur de gestion
    Inscrit en
    Octobre 2017
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Contrôleur de gestion

    Informations forums :
    Inscription : Octobre 2017
    Messages : 17
    Par défaut
    Merci Patrick,

    J'ai essayé d'intégrer ton code à ma TextBox.

    J'avais déjà repris ton code afin d'avoir un aperçu au moment de la saisie, de ce type

    Nom : Capture.PNG
Affichages : 2039
Taille : 732 octets

    Le code était le suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     Const chainevide = "____-__"
    Dim pointeur As Long
    Dim chaine As Variant
     
    Private Sub userform_initialize()
    TextBox1.Text = chainevide
    End Sub
     
    Private Sub TextBox1_Change()
        chaine = ""
        For i = 1 To Len(TextBox1)
            If IsNumeric(Mid(TextBox1, i, 1)) Then chaine = chaine & Mid(TextBox1, i, 1)
            If Len(chaine) = 4 Then chaine = chaine & "-"
        Next
        If Len(chaine) > 7 Then chaine = Left(chaine, 7)
        TextBox1 = chaine & Mid(chainevide, Len(chaine) + 1, 7 - Len(chaine) + 1)
        End Sub
    Du coup quand j'insère les Keydown et Keypress que tu m'as donné ensuite, je ne peux plus rien saisir.

    Je vais lire le bout de code que tu m'as donné un peu plus en profondeur

    Encore merci pour ton aide,

    E.

  10. #10
    Membre confirmé
    Inscrit en
    Septembre 2003
    Messages
    70
    Détails du profil
    Informations forums :
    Inscription : Septembre 2003
    Messages : 70
    Par défaut
    Cette discussion m'intéresse beaucoup car j'essaie de faire plus ou moins la même chose.

    J'ai un champ date dans lequel j'aimerai que lors que j'ouvre mon UserForm, il soit noté __.__.____ (JJ.DD.AAAA) et que lorsque j'entre une date, cela supprime automatiquement chaque _ .

    Je ne sais pas du tout comment faire.

    Merci patricktoulon pour votre aide.

    Serait-il possible d'avoir votre fichier en exemple?

    Salutations

  11. #11
    Membre averti
    Homme Profil pro
    Contrôleur de gestion
    Inscrit en
    Octobre 2017
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Contrôleur de gestion

    Informations forums :
    Inscription : Octobre 2017
    Messages : 17
    Par défaut
    Hello patrick,

    Je me suis un peu plus plongé dans la traduction du code que tu m'as donné, et cela donne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
     
    'Evalue la touche au moment où on appuie dessus.
     
    Private Sub TextBox3_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
    Dim ind As Long, X As String
    'Si le keycode = 8 soit backspace et que le Textox3 n'est pas en chiffres alors
        If KeyCode = 8 And Not TextBox3 Like "*0-9*" Then
        'Le keycode est nul
            KeyCode = 0
        'Ind = recherche de la position du "_" dans la textbox
            ind = InStr(1, TextBox3, "_")
       ' Si "_" est en position 0 alors le dernier "_" est égal à la longueur de la textbox
            If ind = 0 Then
                ind = Len(TextBox3)
            Else
        'sinon ind = emplacement du "_" -1
                ind = InStr(1, TextBox3, "_") - 1
        'Si le "_" est après la position 0 alors
            'si le caractère suivant le "_" est "-", on retourne sur le caractère précédent
        'Si celui ci est égal à "-" alors ind = ind-1
                If ind > 0 Then
                    If Mid(TextBox3, ind, 1) = "-" Then ind = ind - 1
                End If
            End If
            'si "_" n'est pas en position 0 alors X = texte entré, on cherche ensuite le "_" suivant dans X,
            'on passe au caractère suivant
            If ind <> 0 Then
                X = TextBox3.Text: Mid(X, ind, 1) = "_": TextBox3.Text = X
            End If
        End If
        'Si "_" n'est pas en position 0 alors le curseur va se placer sur le caractère précédent le dernier "_",
        'sinon sur le dernier caractère de la textbox
        TextBox3.SelStart = IIf(ind <> 0, ind - 1, Len(TextBox3))
    End Sub
     
     
    'Evalue la touche au moment où on la relache
     
    Private Sub TextBox3_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
        Dim l As String, ind As Long, X As String
    'Si la touche retournée n'est pas numérique,alors elle est nulle et on sort de la fonction
        If Not IsNumeric(Chr(KeyAscii)) Then KeyAscii = 0: Exit Sub
     
    'De base, l renvoie la touche renvoyée. Elle est nulle au début
        l = Chr(KeyAscii): KeyAscii = 0
    'ind est la place du "_" dans la textbox3
        ind = InStr(1, TextBox3, "_")
    'Si le "_" est en position 6 et que la touche renvoyée est supérieure à 1 alors la touche renvoyée est nulle
        If ind = 6 And l > 1 Then KeyAscii = 0: Exit Sub
    'Si le "_" est en position 7, que le 6e caratère est un 1 et que la touche renvoyée est supérieure à 2,
    ' alors la touche est nulle
        If ind = 7 And Mid(TextBox3, 6, 1) = 1 And l > 2 Then KeyAscii = 0: Exit Sub
    'Si le "_" n'est pas en position 0 alors X = textbox, la position du "_" est la touche à renvoyer, le texte est renvoyé
        If ind <> 0 Then: X = TextBox3.Text: Mid(X, ind, 1) = l: TextBox3.Text = X
    'Si le texte est de format "*_*", c'est à dire avec des caractère avant et après un "_" alors
        If TextBox3 Like "*_*" Then
    'On recherche la position du  "_"
            ind = InStr(1, TextBox3, "_")
    'Et si la position du "_" n'est pas 0 alors on place le curseur sur l'emplacement précédent,
    'Sinon sur le dernier emplacement de la textbox3
            TextBox3.SelStart = IIf(ind <> 0, ind - 1, Len(TextBox3))
        End If
    End Sub
    Pourrais-tu m'indiquer si ma "traduction" est correcte ?

    D'avance merci,

    Cordialement,

    E.

  12. #12
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Billets dans le blog
    8
    Par défaut re
    re
    attention au nuances dans ta traduction
    'Evalue la touche au moment où on appuie dessus.
    j'ai repris un peu ta traduction
    attention "null" ne veut pas dire zero en vba c'est pas la meme chose
    et like on pourrait le traduire dans cet exercice par "contient"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
     
    Private Sub TextBox3_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
        Dim ind As Long, X As String
        'Si le keycode = 8 soit backspace et que le Textox3 ne contient pas un chiffre de 0 a 9
        If KeyCode = 8 And Not TextBox3 Like "*0-9*" Then
            'Le keycode est nulnon pas null mais zero
            KeyCode = 0
            'Ind = recherche de la position du "_" dans la textbox non!!!!!
            'Ind = recherche de la position du  1er "_"  dispo dans le texte du textbox
            ind = InStr(1, TextBox3, "_")
            ' Si "_" est en position 0 alors le dernier "_" est égal à la longueur de la textbox non!!!!!!
            'si ind = 0 alors il n'y a plus de "_" donc ind=len(textbox)
            If ind = 0 Then
                ind = Len(TextBox3)
            Else
                'sinon ind = emplacement du "_" -1'oui!!!!
                ind = InStr(1, TextBox3, "_") - 1
                'Si le "_" est après la position 0 alors non!!!!!!!
                'si le caractère suivant le "_" est "-", on retourne sur le caractère précédent!!!!! pas tout a fait comme ca qu'il faut l'interpréter
                If ind > 0 Then    'si la position ind est plus grand 0 oui!!!!
                    'Si celui ci est égal à "-" alors ind = ind-1
                    If Mid(TextBox3, ind, 1) = "-" Then ind = ind - 1
                End If
            End If
            'si "_" n'est pas en position 0 alors X = texte entré, on cherche ensuite le "_" suivant dans X,
            'on passe au caractère suivant
            If ind <> 0 Then
                X = TextBox3.Text: Mid(X, ind, 1) = "_": TextBox3.Text = X
            End If
        End If
        'Si "_" n'est pas en position 0 alors le curseur va se placer sur le caractère précédent le dernier "_",
        'sinon sur le dernier caractère de la textbox
        TextBox3.SelStart = IIf(ind <> 0, ind - 1, Len(TextBox3))
    End Sub
     
    'Evalue la touche au moment où on la relache
    Private Sub TextBox3_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
        Dim l As String, ind As Long, X As String
        'Si la touche retournée n'est pas numérique,alors elle est nulle et on sort de la fonction
        If Not IsNumeric(Chr(KeyAscii)) Then KeyAscii = 0: Exit Sub
        'De base, l renvoie la touche renvoyée. Elle est nulle au début
        l = Chr(KeyAscii): KeyAscii = 0
        'ind est la place du "_" dans la textbox3
        ind = InStr(1, TextBox3, "_")
        'Si le "_" est en position 6 et que la touche renvoyée est supérieure à 1 alors la touche renvoyée est nulle
        If ind = 6 And l > 1 Then KeyAscii = 0: Exit Sub
        'Si le "_" est en position 7, que le 6e caratère est un 1 et que la touche renvoyée est supérieure à 2, oui!!!
        ' alors la touche est nulle non pas null mais zero
        If ind = 7 And Mid(TextBox3, 6, 1) = 1 And l > 2 Then KeyAscii = 0: Exit Sub
        'Si le "_" n'est pas en position 0 alors X = textbox, la position du "_" est la touche à renvoyer, le texte est renvoyé non!!!!
        'si ind est different de zero x=textbox.text:on remplace le  (ind)eme caracterepar un dans la variable x:on met la chaine x dans le textbox
        If ind <> 0 Then: X = TextBox3.Text: Mid(X, ind, 1) = l: TextBox3.Text = X
        'Si le texte est de format "*_*", c'est à dire avec des caractère avant et après un "_" alors non!!!!
        'si le textbox contient un "_"
        If TextBox3 Like "*_*" Then
            'On recherche la position du  "_" oui!!!
            ind = InStr(1, TextBox3, "_")
            'Et si la position du "_" n'est pas 0 alors on place le curseur sur l'emplacement précédent, oui!!!!
            'Sinon sur le dernier caractere de la textbox3
            TextBox3.SelStart = IIf(ind <> 0, ind - 1, Len(TextBox3))
        End If
    End Sub
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  13. #13
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Billets dans le blog
    8
    Par défaut re
    Citation Envoyé par MicKRub Voir le message
    Cette discussion m'intéresse beaucoup car j'essaie de faire plus ou moins la même chose.

    J'ai un champ date dans lequel j'aimerai que lors que j'ouvre mon UserForm, il soit noté __.__.____ (JJ.DD.AAAA) et que lorsque j'entre une date, cela supprime automatiquement chaque _ .

    Je ne sais pas du tout comment faire.

    Merci patricktoulon pour votre aide.

    Serait-il possible d'avoir votre fichier en exemple?

    Salutations
    soit patient je compte présenté une classe complète concernant les textbox avec masque de saisie
    il est vrai que je travaille a temps perdu dessus

    essayez tous les deux de comprendre le principe qui est très simple en fait

    il est énuméré dans une liste dans une de mes réponses précédente
    interception mais memo
    et placement ou remplacement par instr(1,valeur,caractere)pour son emplacement puis mid en passant par like pour divers test
    c'est pas plus compliqué que ca
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  14. #14
    Membre averti
    Homme Profil pro
    Contrôleur de gestion
    Inscrit en
    Octobre 2017
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Contrôleur de gestion

    Informations forums :
    Inscription : Octobre 2017
    Messages : 17
    Par défaut
    Merci pour les précisions,

    Je me comprends aussi quand je dis que si KeyAscii = 0, quand il est lu par la fonction chr() il va renvoyer NULL ? A moins que je ne sois totalement à coté de la plaque ?

    D'autre part, lorsque j'insère ce code à la suite de mon Textbox_Change(), ou dans un nouveau Textbox, je ne peux plus saisir quoi que ce soit.

    Petite question subsidiaire : Quel est l'intérêt de mettre un KeyDown et un KeyPress ?

    Merci pour ton aide,

    E.

  15. #15
    Membre confirmé
    Inscrit en
    Septembre 2003
    Messages
    70
    Détails du profil
    Informations forums :
    Inscription : Septembre 2003
    Messages : 70
    Par défaut
    Merci pour votre réponse. J'essaie de comprendre mais étant débutant ce n'est pas facile.

    J'ai essayé d'adapter votre code mais rien ne se passe.

    Je vais encore travailler pour comprendre.

    Merci

  16. #16
    Membre averti
    Homme Profil pro
    Contrôleur de gestion
    Inscrit en
    Octobre 2017
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Contrôleur de gestion

    Informations forums :
    Inscription : Octobre 2017
    Messages : 17
    Par défaut
    Ok, mea culpa, tout fonctionne.

    Pour info, mon code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
     
    Const chainevide = "____-__"
    Dim pointeur As Long
    Dim chaine As Variant
     
    Private Sub userform_initialize()
    TextBox1.Text = chainevide
    End Sub
     
    Private Sub TextBox1_Change()
        chaine = ""
        For i = 1 To Len(TextBox1)
            If IsNumeric(Mid(TextBox1, i, 1)) Then chaine = chaine & Mid(TextBox1, i, 1)
            If Len(chaine) = 4 Then chaine = chaine & "-"
        Next
        If Len(chaine) > 7 Then chaine = Left(chaine, 7)
        TextBox1 = chaine & Mid(chainevide, Len(chaine) + 1, 7 - Len(chaine) + 1)
     
        End Sub
     
    Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
        Dim ind As Long, X As String
        'Si le keycode = 8 soit backspace et que le Textox3 ne contient pas un chiffre de 0 a 9
        If KeyCode = 8 And Not TextBox1 Like "*0-9*" Then
            'Le keycode est nulnon pas null mais zero
            KeyCode = 0
            'Ind = recherche de la position du "_" dans la textbox non!!!!!
            'Ind = recherche de la position du  1er "_"  dispo dans le texte du textbox
            ind = InStr(1, TextBox1, "_")
     
            'si ind = 0 alors il n'y a plus de "_" donc ind=len(textbox)
            If ind = 0 Then
                ind = Len(TextBox1)
            Else
                'sinon ind = emplacement du "_" -1'oui!!!!
                ind = InStr(1, TextBox1, "_") - 1
                'Si le "_" est après la position 0 alors non!!!!!!!
                'si le caractère suivant le "_" est "-", on retourne sur le caractère précédent!!!!! pas tout a fait comme ca qu'il faut l'interpréter
                If ind > 0 Then    'si la position ind est plus grand 0 oui!!!!
                    'Si celui ci est égal à "-" alors ind = ind-1
                    If Mid(TextBox1, ind, 1) = "-" Then ind = ind - 1
                End If
            End If
            'si "_" n'est pas en position 0 alors X = texte entré, on cherche ensuite le "_" suivant dans X,
            'on passe au caractère suivant
            If ind <> 0 Then
                X = TextBox1.Text: Mid(X, ind, 1) = "_": TextBox1.Text = X
            End If
        End If
        'Si "_" n'est pas en position 0 alors le curseur va se placer sur le caractère précédent le dernier "_",
        'sinon sur le dernier caractère de la textbox
        TextBox1.SelStart = IIf(ind <> 0, ind - 1, Len(TextBox1))
    End Sub
     
    'Evalue la touche au moment où on la relache
    Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
        Dim l As String, ind As Long, X As String
        'Si la touche retournée n'est pas numérique,alors elle est nulle et on sort de la fonction
        If Not IsNumeric(Chr(KeyAscii)) Then KeyAscii = 0: Exit Sub
        'De base, l renvoie la touche renvoyée. Elle est nulle au début
        l = Chr(KeyAscii): KeyAscii = 0
        'ind est la place du "_" dans la TextBox1
        ind = InStr(1, TextBox1, "_")
        'Si le "_" est en position 6 et que la touche renvoyée est supérieure à 1 alors la touche renvoyée est nulle
        If ind = 6 And l > 1 Then KeyAscii = 0: Exit Sub
        'Si le "_" est en position 7, que le 6e caratère est un 1 et que la touche renvoyée est supérieure à 2, oui!!!
        ' alors la touche est nulle non pas null mais zero
        If ind = 7 And Mid(TextBox1, 6, 1) = 1 And l > 2 Then KeyAscii = 0: Exit Sub
        'Si le "_" n'est pas en position 0 alors X = textbox, la position du "_" est la touche à renvoyer, le texte est renvoyé non!!!!
        'si ind est different de zero x=textbox.text:on remplace le  (ind)eme caracterepar un dans la variable x:on met la chaine x dans le textbox
        If ind <> 0 Then: X = TextBox1.Text: Mid(X, ind, 1) = l: TextBox1.Text = X
        'Si le texte est de format "*_*", c'est à dire avec des caractère avant et après un "_" alors non!!!!
        'si le textbox contient un "_"
        If TextBox1 Like "*_*" Then
            'On recherche la position du  "_" oui!!!
            ind = InStr(1, TextBox1, "_")
            'Et si la position du "_" n'est pas 0 alors on place le curseur sur l'emplacement précédent, oui!!!!
            'Sinon sur le dernier caractere de la TextBox1
            TextBox1.SelStart = IIf(ind <> 0, ind - 1, Len(TextBox1))
        End If
    End Sub
    Si tu as des questions MickRub, je laisse le poste ouvert jusqu'à ce soir

    Merci patrick pour ton aide précieuse,

    Cordialement,

    E.

  17. #17
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Billets dans le blog
    8
    Par défaut re
    non!! non!!! et non!!!
    ta traduction n'est pas bonne et meme loin de l'etre
    ici on cherche pas le suivant de quoi que ce soit
    on remplace le (ind)eme caractere par "_" tout simplement par la fonction d'application !!!!!!! mid
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    'si "_" n'est pas en position 0 alors X = texte entré, on cherche ensuite le "_" suivant dans X,
            'on passe au caractère suivant
            If ind <> 0 Then
                X = TextBox1.Text: Mid(X, ind, 1) = "_": TextBox1.Text = X
            End If

    attention a ton interprétation encore une fois !!!!!
    attention aussi a ton interprétation de mid

    il y a mid et la fonction mid ce n'est pas la même chose

    exemple

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    msgbox mid("eccell",2,1) 'ce qui te donnera "c"
    maintenant l'utilisation en fonction

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    chaine="eccell"
    mid(chaine,2,1)="x"
    msgbox chaine ' te donnera "excell"
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  18. #18
    Membre confirmé
    Inscrit en
    Septembre 2003
    Messages
    70
    Détails du profil
    Informations forums :
    Inscription : Septembre 2003
    Messages : 70
    Par défaut
    Oui j'ai toujours des questions car je n'arrive rien a faire

    La je ne peux plus rien écrire dans mon TextBox (nommé MaDate)

    J'ai copier votre code, en changeand tous les TextBox1 en MaDate et Const chainevide = "__.__.____"

    Mais rien ne se passe...

    Je suis perdu.

    Pouvez-vous m'aider?

  19. #19
    Membre confirmé
    Inscrit en
    Septembre 2003
    Messages
    70
    Détails du profil
    Informations forums :
    Inscription : Septembre 2003
    Messages : 70
    Par défaut
    En résumé je suis trop débutant pour cela.. :-(

    J'ai essayé avec ces modifications là mais rien ne se passe et je ne comprends rien.

    Mon TextBox (MaDate) ne veut plus se remplir

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
     
    Const chainevide = "__.__.____"
    Dim pointeur As Long
    Dim chaine As Variant
     
    Private Sub userform_initialize()
    MaDate.Text = chainevide
    Demande_Conge.Bouton_Reset = True
    Me.Label_Nom.Caption = Worksheets("2018").Range("Z14").Value
     
    End Sub
     
    Private Sub MaDate_Change()
    Dim pointeur As Long
    Dim chaine As Variant
        chaine = ""
        For i = 1 To Len(MaDate)
            If IsNumeric(Mid(MaDate, i, 1)) Then chaine = chaine & Mid(MaDate, i, 1)
            If Len(chaine) = 4 Then chaine = chaine & "-"
        Next
        If Len(chaine) > 7 Then chaine = Left(chaine, 7)
        MaDate = chaine & Mid(chainevide, Len(chaine) + 1, 7 - Len(chaine) + 1)
     
        End Sub
     
    Private Sub MaDate_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
        Dim ind As Long, X As String
        'Si le keycode = 8 soit backspace et que le Textox3 ne contient pas un chiffre de 0 a 9
        If KeyCode = 8 And Not MaDate Like "*0-9*" Then
            'Le keycode est nulnon pas null mais zero
            KeyCode = 0
            'Ind = recherche de la position du "_" dans la textbox non!!!!!
            'Ind = recherche de la position du  1er "_"  dispo dans le texte du textbox
            ind = InStr(1, MaDate, "_")
            ' Si "_" est en position 0 alors le dernier "_" est égal à la longueur de la textbox non!!!!!!
            'si ind = 0 alors il n'y a plus de "_" donc ind=len(textbox)
            If ind = 0 Then
                ind = Len(MaDate)
            Else
                'sinon ind = emplacement du "_" -1'oui!!!!
                ind = InStr(1, MaDate, "_") - 1
                'Si le "_" est après la position 0 alors non!!!!!!!
                'si le caractère suivant le "_" est "-", on retourne sur le caractère précédent!!!!! pas tout a fait comme ca qu'il faut l'interpréter
                If ind > 0 Then    'si la position ind est plus grand 0 oui!!!!
                    'Si celui ci est égal à "-" alors ind = ind-1
                    If Mid(MaDate, ind, 1) = "-" Then ind = ind - 1
                End If
            End If
            'si "_" n'est pas en position 0 alors X = texte entré, on cherche ensuite le "_" suivant dans X,
            'on passe au caractère suivant
            If ind <> 0 Then
                X = MaDate.Text: Mid(X, ind, 1) = "_": MaDate.Text = X
            End If
        End If
        'Si "_" n'est pas en position 0 alors le curseur va se placer sur le caractère précédent le dernier "_",
        'sinon sur le dernier caractère de la textbox
        MaDate.SelStart = IIf(ind <> 0, ind - 1, Len(MaDate))
    End Sub
     
    'Evalue la touche au moment où on la relache
    Private Sub MaDate_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
        Dim l As String, ind As Long, X As String
        'Si la touche retournée n'est pas numérique,alors elle est nulle et on sort de la fonction
        If Not IsNumeric(Chr(KeyAscii)) Then KeyAscii = 0: Exit Sub
        'De base, l renvoie la touche renvoyée. Elle est nulle au début
        l = Chr(KeyAscii): KeyAscii = 0
        'ind est la place du "_" dans la MaDate
        ind = InStr(1, MaDate, "_")
        'Si le "_" est en position 6 et que la touche renvoyée est supérieure à 1 alors la touche renvoyée est nulle
        If ind = 6 And l > 1 Then KeyAscii = 0: Exit Sub
        'Si le "_" est en position 7, que le 6e caratère est un 1 et que la touche renvoyée est supérieure à 2, oui!!!
        ' alors la touche est nulle non pas null mais zero
        If ind = 7 And Mid(MaDate, 6, 1) = 1 And l > 2 Then KeyAscii = 0: Exit Sub
        'Si le "_" n'est pas en position 0 alors X = textbox, la position du "_" est la touche à renvoyer, le texte est renvoyé non!!!!
        'si ind est different de zero x=textbox.text:on remplace le  (ind)eme caracterepar un dans la variable x:on met la chaine x dans le textbox
        If ind <> 0 Then: X = MaDate.Text: Mid(X, ind, 1) = l: MaDate.Text = X
        'Si le texte est de format "*_*", c'est à dire avec des caractère avant et après un "_" alors non!!!!
        'si le textbox contient un "_"
        If MaDate Like "*_*" Then
            'On recherche la position du  "_" oui!!!
            ind = InStr(1, MaDate, "_")
            'Et si la position du "_" n'est pas 0 alors on place le curseur sur l'emplacement précédent, oui!!!!
            'Sinon sur le dernier caractere de la MaDate
            MaDate.SelStart = IIf(ind <> 0, ind - 1, Len(MaDate))
        End If
    End Sub

  20. #20
    Membre averti
    Homme Profil pro
    Contrôleur de gestion
    Inscrit en
    Octobre 2017
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Contrôleur de gestion

    Informations forums :
    Inscription : Octobre 2017
    Messages : 17
    Par défaut
    @patrick

    Je n'avais pas enlevé les corrections que tu as faites, j'ai remis le code tel quel et il marche bien. Merci !



    @Mick

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
     
    Const chainevide = "__.__.____"
    Dim pointeur As Long
    Dim chaine As Variant
     
    Private Sub userform_initialize()
    MaDate.Text = chainevide
    Demande_Conge.Bouton_Reset = True
    Me.Label_Nom.Caption = Worksheets("2018").Range("Z14").Value
     
    End Sub
     
    Private Sub MaDate_Change()
     
        chaine = ""
        For i = 1 To Len(MaDate)
            If IsNumeric(Mid(MaDate, i, 1)) Then chaine = chaine & Mid(MaDate, i, 1)
            If Len(chaine) = 2 Or Len(chaine) = 5 Then chaine = chaine & "."
        Next
        If Len(chaine) > 10 Then chaine = Left(chaine, 10)
        MaDate = chaine & Mid(chainevide, Len(chaine) + 1, 10 - Len(chaine) + 1)
     
        End Sub
     
    Private Sub MaDate_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
        Dim ind As Long, X As String
        'Si le keycode = 8 soit backspace et que le Textox3 ne contient pas un chiffre de 0 a 9
        If KeyCode = 8 And Not MaDate Like "*0-9*" Then
            'Le keycode est zero
            KeyCode = 0
     
            'Ind = recherche de la position du  1er "_"  dispo dans le texte du textbox
            ind = InStr(1, MaDate, "_")
     
            'si ind = 0 alors il n'y a plus de "_" donc ind=len(textbox)
            If ind = 0 Then
                ind = Len(MaDate)
            Else
                'sinon ind = emplacement du "_" -1'oui!!!!
                ind = InStr(1, MaDate, "_") - 1
     
                'si le caractère suivant le "_" est "-", on retourne sur le caractère précédent!!!!! pas tout a fait comme ca qu'il faut l'interpréter
                If ind > 0 Then    'si la position ind est plus grand 0 oui!!!!
                    'Si celui ci est égal à "-" alors ind = ind-1
                    If Mid(MaDate, ind, 1) = "-" Then ind = ind - 1
                End If
            End If
            'si "_" n'est pas en position 0 alors X = texte entré, on cherche ensuite le "_" suivant dans X,
            'on passe au caractère suivant
            If ind <> 0 Then
                X = MaDate.Text: Mid(X, ind, 1) = "_": MaDate.Text = X
            End If
        End If
        'Si "_" n'est pas en position 0 alors le curseur va se placer sur le caractère précédent le dernier "_",
        'sinon sur le dernier caractère de la textbox
        MaDate.SelStart = IIf(ind <> 0, ind - 1, Len(MaDate))
    End Sub
     
    'Evalue la touche au moment où on la relache
    Private Sub MaDate_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
        Dim l As String, ind As Long, X As String
        'Si la touche retournée n'est pas numérique,alors elle est nulle et on sort de la fonction
        If Not IsNumeric(Chr(KeyAscii)) Then KeyAscii = 0: Exit Sub
        'De base, l renvoie la touche renvoyée. Elle est nulle au début
        l = Chr(KeyAscii): KeyAscii = 0
        'ind est la place du "_" dans la MaDate
        ind = InStr(1, MaDate, "_")
        'Si le "_" est en position 1 et que la touche renvoyée est supérieure à 3 alors la touche renvoyée est nulle
        If ind = 1 And l > 3 Then KeyAscii = 0: Exit Sub
        If ind = 2 And Mid(MaDate, 1, 1) = 3 And l > 1 Then KeyAscii = 0: Exit Sub
     
        'Le code ci dessus te donne la possibilité de traiter via des jours. Je lui ai dit avec les deux lignes du dessus
        'que le premier caractère ne peut être au dessus de 3 (on ne peut pas aller au delà du 31).
        'La seconde ligne dit que si le premier caractère est un 3 alors on ne peut pas mettre autre chose qu'un 0 ou un 1
     
        'A toi d'adapter à ta convenance. Attention de ne pas oublier que tes "." comptent comme un caractère.
     
     
     
        'si ind est different de zero x=textbox.text:on remplace le  (ind)eme caracterepar un dans la variable x:on met la chaine x dans le textbox
        If ind <> 0 Then: X = MaDate.Text: Mid(X, ind, 1) = l: MaDate.Text = X
     
        'si le textbox contient un "_"
        If MaDate Like "*_*" Then
            'On recherche la position du  "_" oui!!!
            ind = InStr(1, MaDate, "_")
            'Et si la position du "_" n'est pas 0 alors on place le curseur sur l'emplacement précédent, oui!!!!
            'Sinon sur le dernier caractere de la MaDate
            MaDate.SelStart = IIf(ind <> 0, ind - 1, Len(MaDate))
        End If
    End Sub
    Ca devrait fonctionner, je t'avoue que je n'ai pas testé.

    Regarde bien le code, analyse par toi même, la compréhension viendra comme cela.

    Lis bien les commentaires pour la dernière partie, c'est comme cela que tu pourras adapter le code.

    Cordialement,

    E.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Masque de saisie de date et format d'une adresse mail dans un formulaire
    Par didier.dev dans le forum Balisage (X)HTML et validation W3C
    Réponses: 1
    Dernier message: 30/07/2015, 13h01
  2. [AC-2007] pb avec mon masque de saisie de date
    Par tibofo dans le forum IHM
    Réponses: 2
    Dernier message: 04/03/2010, 14h44
  3. Masque de saisie pour date au format Y-M-D
    Par Claude Poulin dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 02/03/2009, 13h52
  4. Masque de saisie de date
    Par minihart dans le forum VB 6 et antérieur
    Réponses: 16
    Dernier message: 26/11/2007, 01h42
  5. Masque de saisie texte+date
    Par Thibaut_Dupont dans le forum Access
    Réponses: 6
    Dernier message: 02/08/2006, 14h39

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo