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


Sujet :

Macros et VBA Excel

  1. #1
    Candidat au Club
    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 du Club
    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
    Candidat au Club
    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 du Club
    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
    Candidat au Club
    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
    Responsable
    Office & Excel

    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 remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Une fois pour toutes, je donne mon avis. Je ne vais pas le répéter à chaque message...
    Si je propose une solution générique sur votre solution spécifique, c'est parce que, fainéant de nature, je privilégie le réutilisable...
    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
    Candidat au Club
    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
    Responsable
    Office & Excel

    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 remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Une fois pour toutes, je donne mon avis. Je ne vais pas le répéter à chaque message...
    Si je propose une solution générique sur votre solution spécifique, c'est parce que, fainéant de nature, je privilégie le réutilisable...
    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...
    ---------------