Saisir une date ou un nombre dans un userform

demain j aurais un écran tout neuf je pourrais étudier ça ,remplace le par le len pour voir si j ai raison

Bonjour à tous,

Après quelques jours j'ai, pendant mon temps libre, essayé de comprendre les superbes mais difficiles codes de gestion de dates de patricktoulon, merci encore à toi pour ton partage.
En reprenant beaucoup de ses code, en l'adaptant (améliorer ?) pour une version uniquement FR (ou Europe) avec masque adaptable selon les envies de chacun.

Premier fichier qui contrôle la date à la fin de la saisie et qui supprimer si incorrecte :

Second fichier qui contrôle la date à la fin de la saisie et qui sélectionne l'erreur si incorrecte :

Troisième fichier qui contrôle la date au fur et à mesure de la saisie :

J'ai commenté pour ceux qui veulent se lancer dans la compréhension !
Je rappelle que c'est patricktoulon qui a fait la grande majorité du travail.

Qu'en pensez-vous ?

Baboutz

re

bonsoir Baboutz

allez j’arrête de faire souffrir je voulais vous faire un petit tuto sur le principe date interphone N°secu, riban, préfixe,suffixe,part in chain etc....

mais comme je vois que tu te presse voila ma méthode uniquement fr avec masque de saisie

et la tu peux y aller essaie donc de taper une date erronée

Noyeux Joel

'********************************************
'collection textboxs formaté episode 1
'auteur patricktoulon sur exceldownload et excel pratique
'version 3.7
'extrait du tutoriel episode 1
' UN DATEBOX avec masque de saisie
'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&, D$, M$, A, T$, mask, C2, D2: mask = "__/__/____"
    'pour ceux qui n'ont pas le pavé numerique conversion du keycode du pavé haut du clavier
    If KeyCode >= 48 And KeyCode <= 57 Then KeyCode = KeyCode + 48
    'c'est parti on démarre le controle!!
    With TxtB
        Xl = .SelLength: If Xl = 0 Then Xl = 1    'Xl= la longeur de texte selectionné
        .Value = IIf(.Value = "", mask, .Value): If KeyCode = 8 And Xl > 1 Then KeyCode = 46
        T = .Value: .SelStart = IIf(T = mask, 0, .SelStart): X = .SelStart:
        Select Case KeyCode
        Case 96 To 105  'pavé numerique haut et bas (Attention!!!pas besoins de bloquer la touche MAJ!!!!!!!!le code se charge de convertir)
            If X = 10 Then KeyCode = 0: Exit Sub
            If X = 2 Or X = 5 Then X = X + 1
            Mid(T, X + 1, Xl) = Chr(KeyCode - 48) & Mid(mask, X + 2, Xl - 1)
            X = X + 1: Xl = 0: If X = 2 Or X = 5 Then X = X + 1
            'le plus gros tu traitement se passe avec controle de validité de date en fait!!!
            If Val(T) > 31 Or Val(Mid(T, 1, 1)) > 3 Then X = 0: Xl = 2: Mid(T, 1, 2) = Mid(mask, 1, 2): Beep
            If Val(Mid(T, 4, 2)) > 12 Or Val(Mid(T, 4, 1)) > 1 Then Mid(T, 4.2) = Mid(mask, 4, 2): X = 3: Xl = 2: Beep
            D = Mid(T, 1, 2): M = Mid(T, 4, 2): A = Mid(T, 7, 4)
            If IsDate(D & "/" & M) And Not IsDate(D & "/" & M & "/2000") Then Mid(T, 4, 2) = Mid(mask, 4, 2): X = 3: Xl = 2: Beep: KeyCode = 0
            If X = 10 And Not IsDate(T) Then Mid(T, 7, 10) = Mid(mask, 7, 10): X = 6: Xl = 4: Beep

        Case 8:
            If X = 0 Then KeyCode = 0:: .Value = "": Exit Sub
            Mid(T, X, 1) = Mid(mask, X, 1): X = X - 1: Xl = 0
            If T = mask Then T = ""
        Case 46:
            If X = 10 Then Exit Sub
            Mid(T, X + 1, Xl) = Mid(mask, X + 1, Xl): X = X: Xl = 0
            If T = mask Then T = ""
        Case Else: KeyCode = 0    ' on annule toutes les autre touches
        End Select
        .Value = T: .SelStart = X: .SelLength = Xl: KeyCode = 0
    End With
End Sub

soit patient je vous prépare une collection

Merci, j'attends de voir la collection.

Je suis un peu déçu, tu n'as même pas regardé un de mes fichiers ! Eux aussi ne laisse pas passer une date erronée

je suis en train de préparer un tuto tu imagine que c'est du boulot quand même

bon je vais les regarder Attention maintenant tu es sensé avoir tout pigé ça va chauffer pour toi si tu me fait des roulades

bon on va dire que le 3 eme marche car c'est celui là qui m’intéresse

je le répète un date box ne doit rien laisser passer ni pendant ni a la fin de la saisie donc les deux autres ne m’intéresse pas

donc pour le 3eme tu t'es un peu étalé quand même

le positionnement n'est plus anticipé bien que la saisie soit correcte c'est déroutant pour l'utilisateur

le control de validité en externe c'est bof

sinon ben ça fonctionne

mais tu n'a aucune pitié pour celui qui va te relire hein

je montre les choses qui peuvent déroutantes pour l'utilisateur

quand on a tapé le jour le selstart n'est pas a sa place

quand on a tapé le mois le curseur n'est pas a sa place ce qui fait que quand on tape la suite (l'année) l'utilisateur peut etre dérouté car on a l'habitude de taper 2020

si l'utilisateur veux taper 2021 il va se retrouver avec 2020

c'est pas du tout ergonomique laisse l'utilisateur taper la date entière et revois l'anticipation pour le selstart

demo7

la mienne

demo7

mais tu a compris l'essentiel de la méthode quand tu gérera d'autre thème que les dates tu apprendra a gérer l'anticipation du selstart et tes codes diminueront petit a petit

bravo pour ta perspicacité en tout cas

Merci Patrick.

En effet la position du SelStart n'était pas toujours bonne, j'ai réussi à corriger cela sur mon fichier !

J'ai en effet mis un /20 automatique mais que s'il est enlevé, le code marche toujours. Le code est dynamique !

re

bonsoir j'ai un lot d'exemple prêts je mes ça dans un topic demain j'ai tout simplifié

Bonjour Patrick,

'********************************************
'le moteur séparé de l'event pour utilisation multi textbox
'********************************************

dans ce cas, autant faire un module de classe, c'est plus facile à transposer

bonjour Steelson

un module classe !!!!!et on perd donc la notion de transportabilité

je m'en viens donc te montrer comment on classe des textboxs sans module classe

alors pour l'exemple

prend un userform et met lui 3 textbox l(laisse leur nom d'origine)

le userform appelle le "ufclassetextbox"c'est très important

tu va reprendre ma fonction ici on va prendre la FR et la mettre dans le module userform

Private Sub CtrL_KeyDown(ByVal TxtB As MSForms.TextBox, ByVal KeyCode As MSForms.ReturnInteger)
    Dim X&, Xl&, D$, M$, A, T$, mask, C2, D2: mask = "__/__/____"
    'pour ceux qui n'ont pas le pavé numerique conversion du keycode du pavé haut du clavier
    If KeyCode >= 48 And KeyCode <= 57 Then KeyCode = KeyCode + 48
    'c'est parti on démarre le controle!!
    With TxtB
        Xl = .SelLength: If Xl = 0 Then Xl = 1    'Xl= la longeur de texte selectionné
        .Value = IIf(.Value = "", mask, .Value): If KeyCode = 8 And Xl > 1 Then KeyCode = 46
        T = .Value: .SelStart = IIf(T = mask, 0, .SelStart): X = .SelStart:
        Select Case KeyCode
        Case 96 To 105  'pavé numerique haut et bas (Attention!!!pas besoins de bloquer la touche MAJ!!!!!!!!le code se charge de convertir)
            If X = 10 Then KeyCode = 0: Exit Sub
            If X = 2 Or X = 5 Then X = X + 1
            Mid(T, X + 1, Xl) = Chr(KeyCode - 48) & Mid(mask, X + 2, Xl - 1)
            X = X + 1: Xl = 0: If X = 2 Or X = 5 Then X = X + 1
            'le plus gros tu traitement se passe avec controle de validité de date en fait!!!
            If Val(T) > 31 Or Val(Mid(T, 1, 1)) > 3 Then X = 0: Xl = 2: Mid(T, 1, 2) = Mid(mask, 1, 2): Beep
            If Val(Mid(T, 4, 2)) > 12 Or Val(Mid(T, 4, 1)) > 1 Then Mid(T, 4.2) = Mid(mask, 4, 2): X = 3: Xl = 2: Beep
            D = Mid(T, 1, 2): M = Mid(T, 4, 2): A = Mid(T, 7, 4)
            If IsDate(D & "/" & M) And Not IsDate(D & "/" & M & "/2000") Then Mid(T, 4, 2) = Mid(mask, 4, 2): X = 3: Xl = 2: Beep: KeyCode = 0
            If X = 10 And Not IsDate(T) Then Mid(T, 7, 10) = Mid(mask, 7, 10): X = 6: Xl = 4: Beep

        Case 8:
            If X = 0 Then KeyCode = 0:: .Value = "": Exit Sub Else Mid(T, X, 1) = Mid(mask, X, 1): X = X - 1: Xl = 0
            If T = mask Then T = ""
        Case 46:
            If X = 10 Then Exit Sub Else Mid(T, X + 1, Xl) = Mid(mask, X + 1, Xl): X = X: Xl = 0: If X = 2 Or X = 5 Then X = X + 1
            If T = mask Then T = ""
        Case Else: KeyCode = 0    ' a pour effet d'inhiber toutes les autre touches
        End Select
        .Value = T 'restitution
        .SelStart = X: .SelLength = Xl: KeyCode = 0
    End With
End Sub

nous reste maintenant a faire communiquer ces trois textboxs avec cette sub

la belle affaire

on va donc en haut de module de ce userform remettre mon entête et les déclarations

'********************************************************************
'COLLECTION TEXTBOX FORMATE EPISODE 1 EXERCICE 1                    *
'des  DATEBOX avec masque de saisformat FR (1 seul sub et 1 seul events                  *
'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
Public WithEvents TxT As MSForms.TextBox
Dim cls(1 To 3) As New ufclassetextbox

là deja tu commence a comprendre mais peut etre que tu l'ignorais et ca te semble pas logique mais passons

on va ajouter dans le module du userform l'event activate et on va classer les textboxs dans cet event

Private Sub UserForm_Activate()
    Dim i&
    For i = 1 To 3
        Set cls(i).TxT = Me.Controls("TextBox" & i)
    Next
End Sub

voila c'est pas compliqué

maintenant ben il nous reste plus qu'a rajouter le map de l'event keydown

'!!!!!!!!!!!!!!!!!!!!!!!un seul event pour tout les textboxs!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Private Sub TxT_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
    CtrL_KeyDown TxT, KeyCode
End Sub

tu teste et là tu me dis mais bon sang de bonsoir un userform n'est pas un module classe

ben je te dis QUE"SI!!!!"

LOL

je fourni les aspro aussi si tu veux

il va me maudir le Steelson

bonjour Steelson

un module classe !!!!!et on perd donc la notion de transportabilité

Ah bon ! c'est tellement facile de le translater un module (de classe ou un autre) d'un fichier témoin à un autre ! et cela n'alourdit pas la visibilité de la macro du module de l'usf. J'aime bien la modularité.

re

moi j'aime bien la transportabilité

une classe pour ceci

une classe pour cela

une classe pour je sais pas quoi

et pour peu que le développeur ai des habitudes(tout développeur en a) ben si il utilise une variable déjà utilisé et qu'il a le message d'erreur typique d'une instanciation de classe ou la ligne jaune est celle de l'appel de l’instanciation et non l'erreur dans la classe ,ben il cours Forest avant de trouver la bulle

je parle même pas du poids des instanciations dans la mémoire et en fonctionnement

les modules classe a utiliser a bon escient

d'ailleurs tout a l'heure j'ai lu une discussion ou un membre proposait un userform calendrier

ben dit donc il lui a fallu un module,un module classe,un module userform ET !! en plus même pas en mode responsif le calendrier

moi je dis que celui qui a perdu sa grand mère viendra pas la chercher là dedans (pauvre grand mère)"private sub grand_mère_terminate(byval clamsé as boolean)

LOL

d'ailleurs tout a l'heure j'ai lu une discussion ou un membre proposait un userform calendrier

juste un module et compatible mac https://www.excel-pratique.com/fr/telechargements/calendriers/saisie-date-excel-no458

je l'ai vu déjà tu pense bien que j'ai fait le tour apres avoir vu l'hécatombe qui était proposée dans une discussion

vraiment pas mal du tout

2 choses me gênent cependant ( juste une idée que je donne comme ça)

  1. c'est la création a chaque click alors que l'on pourrait le créer a l'open cacher le group l'afficher au click (on voit bien la latence pendant la construction)
  2. pour un textbox dans un userform ben walouhh

https://www.excel-pratique.com/fr/telechargements/calendriers/calendrier-all-windows-no518

dans l'exemplaire tu aura un apercu de tout les sujets que l'on traite depuis quelque jour et bien plus encore

pour info il n'y a que le calendrier a exporter et c'est une boite de dialog a part entière (mode responsif) et non applicatif)

  1. c'est la création a chaque click alors que l'on pourrait le créer a l'open cacher le group l'afficher au click (on voit bien la latence pendant la construction)
  2. pour un textbox dans un userform ben walouhh

1- pas con !

2- je suis en général assez récalcitrant aux usf et je préfère dédier un onglet à une saisie, de plus cela convient aux macboys and macgirls

mis a part activewindow.activepane.pointtoscreenpixel(x ou y) je ne vois pas trop ce qui empecherait les mac(histe) d'utiliser mon calendrier

au quel cas si j'ai des retours je peux solutionner le problème

pour ton calendrier shape on peut ajouter un truc aussi

dans le thisworkbooksheet_change

on copie le group on le colle dans la feuille active on delete l'original

et tu l'a dans toutes tes feuilles du classeur sans latence

je n'ai pas préciser pour le (2) textbox je parle des textbox dans userform (tester l'exemple avec l'userform test )car mon calendrier fait les deux et les deux langue aussi et les 3 regions( 0=US, 1=FR,2=CA ou AUTO)traite les jours fériés aussi des 3 régions précédemment citées

Bonjour à tous,

@patricktoulon > dans ton calendrier sur textbox dans un userform > il y a US, FR et CA > mais en fait, il manque une option qui est un calendrier de langue française ET les "Dimanche" premier jour de la semaine ...

La communauté francophone du Canada apprécierait ...

Merci à l'avance ...

ric

traite les jours fériés aussi des 3 régions précédemment citées

et pour la Suisse aussi selon les cantons ?

non j'ai dis les 3 régions précédemment cités FR US CA

je m'aligne aux valeurs de des fonctions natives de application.international(xldateorder) en injection est en responsif (voir la démo)

Et ben dis donc...

@ bientôt

LouReeD

Rechercher des sujets similaires à "saisir date nombre userform"