Saisir une date ou un nombre dans un userform

Bonjour à tous,

Je vois que cela a bien avancé dans ce fil.

Très sympa ce calendrier multicolore et international.

Je place déjà le paquet cadeau pour l'avoir dans la partie téléchargement au moins pour Noël.

le l'ai mis dans les téléchargement c'est en attente d'approbation

attention il es livré en version sans le Quebec en version 4.1.6

et oui je l'avais déjà déposé quand *ric m'a fait sa demande

je ferais la mise a jour

sinon vous pouvez le trouver sur exceldownlod

Effectivement,

Mais au temps qu'il prenne son envol ici.

Il est surement bien télécharger sur l'autre site.

RE

il a démarrer sur DVP puis sur XLD et maintenant ici aussi

ben si la modération veux bien ce donner la peine tu l'aura peut être avant noël

je livrerais l'instalateur et skinner (pour changer la peau)un peut plus tard si il y a la demande

pour l'instant il est livré avec ce theme

capture

Bonjour à tous,

En reprenant le code de patrick en page 1 de ce fil et en le modifiant pas mal, j'ai réalisé un code pour la gestion de la date dans un TextBox sans masque.
Le code permet de ne pas avoir plus de deux / et gère le nombre de caractère pour chaque partie de la date ; c'est à dire pas plus de 2 carac pour jours & mois et pas plus de 4 pour l'année. Si vous trouvez un bug dites le moi !

Private Sub TextBox_Date_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)

    Dim pos1 As Byte, pos2 As Byte
    Dim char$, d$, m$, y$

    'On autorise uniquement la saisie des caractères "0123456789"
    If InStr("0123456789", Chr(KeyAscii)) = 0 Then KeyAscii = 0: Exit Sub

    char = Chr(KeyAscii)
    With TextBox_Date
        .MaxLength = 10
        pos1 = IIf(InStr(1, .Value, "/") <> 0, InStr(1, .Value, "/"), 1)
        pos2 = IIf(InStr(4, .Value, "/") <> 0, InStr(4, .Value, "/"), 4)
        If .SelLength = 0 Then
            'Ici, gestion du nombre de caractère pour chaque partie de la date
            d = Val(Mid(.Value, 1, 2)): If Len(d) = 2 And .SelStart < 3 Then KeyAscii = 0: Exit Sub
            m = Val(Mid(.Value, pos1 + 1, 2)): If Len(m) = 2 And .SelStart > pos1 - 1 And .SelStart < pos2 Then KeyAscii = 0: Exit Sub
            y = Val(Mid(.Value, pos2 + 1, 4)): If Len(y) = 4 And .SelStart > pos2 - 1 Then KeyAscii = 0: Exit Sub
        End If
        'Ajout / et /20
        If Len(.Value) = 1 Then .Value = .Value & char & "/": KeyAscii = 0 _
        Else: If Len(.Value) = 4 And .Value & char Like Mid("##/##/####", 1, .SelStart + 1) Then .Value = .Value & char & "/20": KeyAscii = 0
        If Len(.Value & char) = 10 And IsDateFR(.Value & char) = False Then MsgBox "La date est incorrecte"
    End With
End Sub

Function IsDateFR(ByVal dat As Variant) As Boolean
If IsDate(dat) Then IsDateFR = Format(dat, "dd/mm/yyyy") = dat And Len(dat) = 10
End Function

Le contrôle de la date se fait pour le moment à la fin, je vais regarder pour faire une autre solution avec un contrôle pendant la saisie.

Bonne journée,

Baboutz

re

je regarde même pas je n'en ai pas besoins je sais d'avance qu'il y a des situations que l'on peut pas gérer dans le keypress

enfin c'est bon pour le sport cérébral

mais bon tu a compris ma méthode je pense que tu la maîtrise un peu maintenant alors pourquoi t'ennuie tu a faire moins bien????

sincèrement attendre la fin pour tester si c'est bon autant ne pas formater du tout chez moi on appelle ça (pisser dans un violon)

en gros (et tu en conviendra toi même) tout ton code sert a rien a par la fin le test date

réfléchi un peu plus loin que l'exercice lui même

allez je test par respect pour le travail mais bon

demo7

réfléchi 1 seconde a tester uniquement la fin autant s'occuper que des séparateurs automatiques (1 ligne de code ) et c'est tout

non sérieux ?????

demo7

je regarde même pas je n'en ai pas besoins je sais d'avance qu'il y a des situations que l'on peut pas gérer dans le keypress

J'ai repris le code que tu as donné en page 1, que tu as codé dans le keypress. De toute façon, mon but ici n'est pas de gérer cela comme avec le masque, je ne cherche pas à contrôler toutes les situations.

alors pourquoi t'ennuie tu a faire moins bien????

sincèrement attendre la fin pour tester si c'est bon autant ne pas formater du tout chez moi on appelle ça (pisser dans un violon)

Par ce que, de ce que j'ai expérimenté en entreprise, il y a des fois où l'utilisateur tape la date rapidement (6 chiffres) sans regarder son écran. Ta solution dans mon cas, me convient donc moins, c'est moins "user-friendly". C'est pour ça que je conçois d'abords la version plus simple aussi, du test à la fin et que je fais après celle du contrôle "continue".

Tu relèves l'erreur que Val ne détecte pas le 0, merci je vais regarder pour corriger.

user friendly!!!????

faut il encore que je te montre comment on fait avec un mask avec partie fixe"/20"

faut il que je te montre aussi comment supprimer les tests dates sauf le derniers

ma fois comme tu veux

tiens Baboutz c'est kado

j'ai enlevé les tests dates intermédiaires (comme le tiens) je laisse juste le test date en len(10)

on a donc que 3 nombres a taper (comme le tiens)

mais ce coup si je vais même un peu plus loin je te propose le mask invisible (non inscrit )

le résultat est exactement le même que le tiens sauf que je ne peux pas avoir un segment jour ou mois a trois chiffres

et je gère toujours les touches suppr et del

pour ton info (car je crois que tu n'a pas saisie toute les utilités du masque de saisie) il sert justement a ce que ce genre d'erreur n'arrive pas ;et cela en rédaction et en réédition

il n'est pas que là pour l'aide visuelle et faire joli

et bien entendu seul le format FR passera

'********************************************************************
'COLLECTION TEXTBOX FORMATE EPISODE 1 EXERCICE 1                    *
'         UN DATEBOX avec masque de saisie invisible format FR      *
'Avec préfixe année                                                 *
'en version simplifié a but école                                   *
'auteur patricktoulon sur exceldownload et excel pratique           *
'version 3.7                                                        *
'                                                                   *
'le moteur séparé de l'event pour utilisation multi textbox         *
'********************************************************************
Option Explicit
Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
    CtrL_KeyDown TextBox1, KeyCode
End Sub

Private Sub CtrL_KeyDown(ByVal TxtB As MSForms.TextBox, ByVal KeyCode As MSForms.ReturnInteger)
    Dim X&, Xl&, T$, mask, tt, f: mask = "  /  /20  "
    If KeyCode >= 48 And KeyCode <= 57 Then KeyCode = KeyCode + 48
    With TxtB
        Xl = .SelLength: If Xl = 0 Then Xl = 1: tt = mask: Mid(tt, 1, Len(Trim(.Value))) = Trim(.Value)
        T = tt: .SelStart = IIf(T = mask, 0, .SelStart): X = .SelStart:
        Select Case KeyCode
        Case 96 To 105
            If X = 10 Then KeyCode = 0: Exit Sub
            If X = 2 Then X = X + 1 Else If X = 5 Then X = X + 3
            Mid(T, X + 1, Xl) = Chr(KeyCode - 48) & Mid(mask, X + 2, Xl - 1): X = X + 1
            If X = 2 Then X = X + 1 Else If X = 5 Then X = X + 3
        Case 8: KeyCode = IIf(X = 0, 0, 8): T = Left(T, X - IIf(X > 0, 1, 0))
        Case 46: T = Mid(T, 1, X)
        Case Else: KeyCode = 0    ' a pour effet d'inhiber toutes les autre touches
        End Select
        f = InStr(1, T, " "): f = IIf(f = 0, 10, f): T = Trim(Mid(T, 1, f))
        If Len(T) = 10 Then If Not IsDate(T) Or Val(Mid(T, 4, 2)) > 12 Then X = 0: T = "": MsgBox "Date non valide " Else Xl = 0
        .Value = T  'restitution
        .SelStart = X: .SelLength = Xl: KeyCode = 0
    End With
End Sub

est ce cela que tu appelle "user friendly"

LOL

Bonjour à tous,

@Baboutz,

Peut être trouveras tu dans ce programme une possibilité pour vérifier tes dates.

Voir AppelBoxDate. Le but: éviter des jours ou des mois incongrus en format France.

De plus une bande de chiffres est intégrée et évite une saisie clavier.

45textboxdate5.xlsm (46.89 Ko)
Rechercher des sujets similaires à "saisir date nombre userform"