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 :

Construire une date à partir d'une saisie dans une TextBox [XL-2016]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Physicien Médical
    Inscrit en
    Mai 2020
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Haute Loire (Auvergne)

    Informations professionnelles :
    Activité : Physicien Médical
    Secteur : Santé

    Informations forums :
    Inscription : Mai 2020
    Messages : 4
    Par défaut Construire une date à partir d'une saisie dans une TextBox
    Bonjour,
    D'habitude j'arrive à bricoler mes routines excel dans mon coin, en m'appuyant de recherches sur les forums, et en adaptant à mon petit projet...mais là...je m'arrache les cheveux depuis pas mal de jours sur un (petit ?) problème.

    J'ai un classeur avec plusieurs pages. J'y engrange des informations de pannes de systèmes de soins, et souhaite l'assortir d'une recherche sur les données enregistrées afin de retrouver les solutions des pannes du passé. ça marche sur une version qui scanne tous les enregistrements à ce jour. J'anticipe le jour où il y aura beaucoup, beaucoup d'enregistrements, et souhaite que l'utilisateur puisse filtrer sa recherche sur une période de dates définies.
    J'ai trouvé sur developpez.net quelques (élégantes) solutions qui utilisent des textbox.
    Le code que j'ai construit, avec votre aide donc, permet la saisie de la date de début et de la date de fin de la recherche. IL teste que l'utilisateur saisisse bien des chiffres (autre chose que des chiffres met le fond de la box en rouge et affiche un message d'alerte). Au 8e caractère saisit, je voudrais que la date soit reconstruite (JJ/MM/AAAA).

    Soucis :
    • si je met longueur=7, il faut taper un 8e caractère pour que le résultat s'affiche dans la box (et l'année est fausse puisqu'au moment du calcul il n'y a que 7 caractères dans la texbox).
    • si je met longueur=8, il faut taper un 9e caractère pour que le résultat s'affiche dans la box (pas intuitif pour l'utilisateur). Je sais pas utiliser la touche entrée pour valider ma saisie (je sais pas la gérer dans VBA).
    • Je n'arrive pas non plus à transférer le focus de ma textebox "date début" vers ma texbox"datefin" quand la première saisie est terminée.


    Mon souhait : qu'à la frappe du 8e caractère de la date le code affiche dans la texbox la date reformatée avec les "/", et positionne le curseur sur la texbox suivante.

    Existe-t-il une solution à mes tourments ?
    merci de votre aide !

    La macro que je dépose est pour la textbox de saisie de la date de fin. L'autre est exactement la même pour la date de début.
    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
     
    Private Sub TextBoxDateFinSearch_KeyPress(ByVal Cancel As MSForms.ReturnBoolean)
     
    Dim jour, mois, annee As String
     
        If Len(TextBoxDateFinSearch) = 8 Then '(testé avec "7", mais dans ce cas l'année est fausse)
     
            jour = Left(TextBoxDateFinSearch.Value, 2)
            mois = Mid(TextBoxDateFinSearch.Value, 3, 2)
            annee = Right(TextBoxDateFinSearch.Value, 4)
     
            'ci-après tests de validité de la date saisie
     
            If jour = 0 Or jour > 31 Then
            MsgBox "Jour impossible : recommencez votre saisie."
            GoTo finsaisieDateFin
            End If
     
            If mois = 0 Or mois > 12 Then
            MsgBox "Mois impossible : recommencez votre saisie."
            GoTo finsaisieDateFin
            End If
     
            If annee < 2020 Then
            MsgBox "Pas de données antérieures à l'année 2020 : recommencez votre saisie."
            GoTo finsaisieDateFin
            End If
     
            If annee > Year(Date) Then
            MsgBox "Les recherches dans le futur ne sont pas encore possibles : recommencez votre saisie (année)."
            GoTo finsaisieDateFin
            End If
     
            'construction de la date formatée comme je la veux
            TextBoxDateFinSearch.Value = jour & "/" & mois & "/" & annee
     
        'message si utilisateur continue à saisir des chiffres
        MsgBox "Nombre de caractères maximaux atteint. Cliquez dans le champs de DATE FIN, ou appuyer sur RAZ pour recommencer une nouvelle saisie", vbOKOnly, "GESPAN"
        KeyAscii = 0
     
        GoTo finsaisieDateFin
        End If
     
    'Si utilisateur continue à rentrer des caractères, pour éviter un recalcul de la date
    If Len(TextBoxDateFinSearch) >= 8 Then
    KeyAscii = 0
    MsgBox "Nombre de caractères maximaux atteint. Lancez la recherche ou appuyer sur RAZ pour recommencer une nouvelle saisie", vbOKOnly, "GESPAN"
    End If
     
        If Len(TextBoxDateFinSearch.Value) < 8 Then
     
            If InStr("0123456789", VBA.Chr(KeyAscii)) = 0 Then
                TextBoxDateFinSearch.BackColor = &H80000005
                KeyAscii = 0
                TextBoxDateFinSearch.BackColor = &HFF&
                MsgBox "Format de saisie JJMMAAAA (chiffres uniquement, sans Slash)", vbOKOnly, "GESPAN"
                TextBoxDateFinSearch.BackColor = &H80000005
            End If
     
        End If
     
     
    finsaisieDateFin:
     
    End Sub

  2. #2
    Membre averti
    Homme Profil pro
    No
    Inscrit en
    Février 2018
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : No

    Informations forums :
    Inscription : Février 2018
    Messages : 47
    Par défaut
    Hello

    Le traitement de la date saisie dans le Texbox me semble plus simple en utilisant l'evenement "AfterUpdate"



    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
    Private Sub TextBoxDateFinSearch_AfterUpdate()
     
    On Error Resume Next
    ddeb = CDate(Me.TextBoxDateFinSearch)
    If Err.Number <> 0 Then
        MsgBox "Date non reconnue"
        Me.TextBoxDateFinSearch = ""
    End If
    On Error GoTo 0
    If ddeb > Date Then
        MsgBox "Traitement impossible avec date dans le futur"
        Me.TextBoxDateFinSearch = ""
    End If
    'construction de la date format?e comme je la veux
    TextBoxDateFinSearch.Value = Format(TextBoxDateFinSearch, "dd/mm/yyyy")
    End Sub
    Ceci n'est qu'une propistion

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Physicien Médical
    Inscrit en
    Mai 2020
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Haute Loire (Auvergne)

    Informations professionnelles :
    Activité : Physicien Médical
    Secteur : Santé

    Informations forums :
    Inscription : Mai 2020
    Messages : 4
    Par défaut
    Bonsoir,
    Merci pour cette suggestion.
    J'ai tenté de bricoler avec beforeupdate et afterupdate. Mais ça ne marche pas.
    J'ai collé ton code à la place du mien pour ma macro, mais excel ne fait rien dans ce cas (??). Pas de plantage, mais c'est comme si il n'y avait aucune macro associée à la textbox "datefin".
    Je ne comprends pas. désolé, je suis un vrai bricoleur en VBA, et là, je ne connais pas ces instructions donc je ne sais pas comment elles fonctionnent.

    Je précise que je suis en Excel 2016/ VBA 7.1

  4. #4
    Membre averti
    Homme Profil pro
    No
    Inscrit en
    Février 2018
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : No

    Informations forums :
    Inscription : Février 2018
    Messages : 47
    Par défaut
    Désole, je suis parti sur une mauvaise interpretation. J'ai cru que tes TextBox etaient integrés dans une Userform alors que se sont vraisemblablement des Textbox crees directement dans une feuille.

    Je propose alors d'utiliser l'evenement "Lost_Focus"

    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
    Private Sub TextBoxDateFinSearch_LostFocus()
    On Error Resume Next
    ddeb = CDate(Me.TextBoxDateFinSearch)
    If Err.Number <> 0 Then
        MsgBox "Date non reconnue"
        Me.TextBoxDateFinSearch = ""
    End If
    On Error GoTo 0
    If ddeb > Date Then
        MsgBox "Traitement impossible avec date dans le futur"
        Me.TextBoxDateFinSearch = ""
    End If
    'construction de la date format?e comme je la veux
    TextBoxDateFinSearch.Value = Format(TextBoxDateFinSearch, "dd/mm/yyyy")
    End Sub
    Dans ces conditions pour vérifier la saisie (déclencher la macro) il faut sortir du Textbox , cliquer ailleurs dans la feuille

    La sortie n'est donc pas automatique comme tu le souhaitais mais tu peux saisir tes dates sous tous les formats reconnaissables 5/2/19, 05/02/2019, 5 nov 19, 5 novembre 2019.... sans te soucier du nombre de caractères saisis

    Il y a sans doute mieux

    Bonne soiree

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Physicien Médical
    Inscrit en
    Mai 2020
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Haute Loire (Auvergne)

    Informations professionnelles :
    Activité : Physicien Médical
    Secteur : Santé

    Informations forums :
    Inscription : Mai 2020
    Messages : 4
    Par défaut
    Bonjour,
    Génial ! ça maaaaarche !
    merci ++. il faut en effet cliquer hors du champs de la Textbox pour que la macro se déclenche, mais ça marche.

    Merci beaucoup pour ce dépannage (en plus j'ai appris de nouvelles instructions).

    Je poste ci-après le code final, pour la textbox de date de fin, à toutes...fins utiles (il y a deux macros associée du coup)

    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
     
    Private Sub TextBoxDateFinSearch_LostFocus()
     
    On Error Resume Next
     
    ddeb = CDate(Me.TextBoxDateFinSearch)
     
    If Err.Number <> 0 Or Len(ddeb) < 10 Or Len(ddeb) > 10 Then
        MsgBox "Date non reconnue. Respectez le format dd/mm/aaaa"
        Me.TextBoxDateFinSearch = ""
    End If
     
    On Error GoTo 0
     
    If ddeb > Date Then
        MsgBox "Traitement impossible avec date dans le futur"
        Me.TextBoxDateFinSearch = ""
    End If
     
    TextBoxDateFinSearch.Value = Format(TextBoxDateFinSearch, "dd/mm/yyyy")
    End Sub
     
    '----------------------------------------------
     
    Private Sub TextBoxDateFinSearch_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
     
    If Len(TextBoxDateFinSearch.Value) < 10 Then
     
            If InStr("0123456789/", VBA.Chr(KeyAscii)) = 0 Then
                TextBoxDateFinSearch.BackColor = &H80000005
                KeyAscii = 0
                TextBoxDateFinSearch.BackColor = &HFF&
                MsgBox "caractère interdit", vbOKOnly, "GESPAN"
                TextBoxDateFinSearch.BackColor = &H80000005
            End If
     Else
        TextBoxDateFinSearch.BackColor = &H80000005
        KeyAscii = 0
        TextBoxDateFinSearch.BackColor = &HFF&
        MsgBox "Maximum de caractères atteint", vbOKOnly, "GESPAN"
        TextBoxDateFinSearch.BackColor = &H80000005
    End If
     
    End Sub

  6. #6
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 125
    Billets dans le blog
    131
    Par défaut
    Salut.

    Attention que CDdate n'est pas fiable pour transformer une saisie textuelle en date... Si tu saisis 02/13/2019 à la place de 02/12/2019 (tu as glissé sur la touche ), CDate va se dire que tu as saisis 13/02/2019 et va accepter la saisie sans lever d'erreur.

    Jusqu'à maintenant, la seule façon qui soit sûre de valider une date est de passer par une fonction perso qui, selon le format de saisie attendu, va valider et transformer la saisie en date.
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  7. #7
    Nouveau membre du Club
    Homme Profil pro
    Physicien Médical
    Inscrit en
    Mai 2020
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Haute Loire (Auvergne)

    Informations professionnelles :
    Activité : Physicien Médical
    Secteur : Santé

    Informations forums :
    Inscription : Mai 2020
    Messages : 4
    Par défaut
    Bonsoir, et merci pour cette précision. J'espère aussi que l'utilisateur saura ouvrir les yeux, mais il est vrai que l'inattention est vite arrivée (heureusement nous sommes un petit service).
    Sans trop de conséquences pour mon petit classeur (rien de critique dans les recherches).

  8. #8
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 125
    Billets dans le blog
    131
    Par défaut
    Perso, je ne comprends pas le besoin de passer par un textbox. Pourquoi ne pas saisir les dates dans des cellules et traiter les valeurs saisies? La validation d'Excel permet de contrôler la saisie pour n'accepter que des dates, éventuellement dans une plage de dates précisée et qui peut être variable si on crée correctement sa validation...
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 3
    Dernier message: 30/04/2018, 15h06
  2. Réponses: 3
    Dernier message: 14/06/2014, 00h47
  3. Réponses: 6
    Dernier message: 02/05/2014, 15h30
  4. Comment stocker en "dur" une variable saisie dans un textbox ?
    Par philoflore dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 19/08/2008, 23h13
  5. Convertir une chaîne de caractère (saisie dans un textbox) en décimal
    Par sab_etudianteBTS dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 23/09/2007, 21h17

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