XL 2010 Contrôle saisie dates

Magic_Doctor

XLDnaute Barbatruc
Bonsoir,

Pour contrôler des saisies de dates, j'ai rédigé ceci :
VB:
Function VérifieEntréeDate(cel As Range) As Boolean
'Vérifie si l'entrée est bien une date sous forme "jj/mm/aaaa"

    If IsDate(cel) And cel.Text Like "##/##/####" Then
        VérifieEntréeDate = True
    Else
        VérifieEntréeDate = False
    End If
    
End Function
Ça a l'air de bien marcher. En revanche, si je rentre, par exemple, 12320 (ce qui n'a rien à voir avec 12/3/20), l'erreur n'est pas reconnue et ça me renvoie, bien évidemment, 23/09/1933.
Comment contourner ce problème en faisant en sorte qu'une entrée, comme dans cet exemple, soit reconnue comme une erreur ?
 

Magic_Doctor

XLDnaute Barbatruc
Bonjour,

Ça peut toujours intéresser, dans un autre forum j'ai pu glaner cette fonction (une autre façon d'aborder le problème) :
VB:
Function checkDate(c As Range) As Boolean
'Vérifie si l'entrée est bien une date sous forme "jj/mm/aaaa"
'Akuini

    checkDate = UBound(Split(c.Text, "/")) = 2 And IsDate(c)
  
End Function
Enfin, j'ai réussi à résoudre le problème, en fait très facilement. Pour preuve : voir PJ.
Persiste un dernier petit problème. Quand on saisit, par exemple, 3/6/88, ça renvoie 06/03/1988.
Décidément, ces Anglo-Saxons qui font et voient toujours tout à l'envers... Comment régler ce dernier petit problème ?
 

Pièces jointes

  • Saisie Date3.xlsm
    19.7 KB · Affichages: 11
Dernière édition:

Magic_Doctor

XLDnaute Barbatruc
Bonjour,

Mais n'y a-t-il pas moyen de régler ce problème via VBA ? Parce que si chaque fois qu'on change de bécane il faut aller bricoler dans le panneau de configuration (où je n'y suis jamais allé...). Enfin, je signale qu'en espagnol (j'imagine que ce panneau de configuration est, où je vis, configuré par défaut en espagnol) on manipule les dates à la française.
 

patricktoulon

XLDnaute Barbatruc
re

VB:
Private Sub Worksheet_Change(ByVal Target As Range)
    If Not Intersect(Target, [madate]) Is Nothing Then
        [d4] = VérifieEntréeDate2([madate])
    End If
End Sub

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    If Not Intersect(Target, [madate]) Is Nothing Then d = [madate]: Target.NumberFormat = "General": Target.Value = CStr(d)
End Sub
Function VérifieEntréeDate2(cel As Variant) As Boolean
'Vérifie si l'entrée est bien une date sous forme "jj/mm/aaaa"
'patricktoulon
    VérifieEntréeDate2 = IsDate(cel.Value) And Format(cel.Text, "dd/mm/yyyy") = cel.Text
End Function
 

Magic_Doctor

XLDnaute Barbatruc
Bonsoir,

J'ai peaufiné ce casse-tête. Subsiste, malheureusement, un dernier problème, quand le jour de la date est <= 12.
Supposons que la date affichée soit 03/06/2021. Si l'on tente de rentrer quoi que ce soit qui ne soit pas une date cohérente (par ex : "efgyuefr", "15/25/20"...), la dernière date valide entrée (ici 03/06/2021) reste affichée dans la cellule de saisie des dates. En revanche, si l'on rentre 8521 (on voulait rentrer 08/05/2021), s'affiche alors 30/04/1923, au lieu de 03/06/2021. Problème qui n'apparaît pas quand le jour de la date est > 12.
C'est bizarre et c'est dommage. Si près du but...

Module standard :
VB:
Option Explicit
-----------------------------------------------------------------------------

Function CheckDate(c As Range) As Boolean
'Vérifie si la saisie est bien sous forme "jj/mm/aaaa"
'Akuini

    CheckDate = UBound(Split(c.Text, "/")) = 2 And IsDate(c)
    
End Function
-----------------------------------------------------------------------------

Sub CorrectDate()
'Vérifie si le jour de la date est > 12 ou pas

Dim CheckDayDate As Boolean

    CheckDayDate = IIf(Day([MyDateBis]) > 12, False, True)
    [C3] = CheckDayDate                                                             'juste pour vérifier

    If CheckDayDate Then                                                            'jour <= 12
        [MyDateBis] = Month([MyDate]) & "/" & Day([MyDate]) & "/" & Year([MyDate])  'inversion jour/mois
    Else                                                                            'jour > 12
        [MyDateBis] = [MyDate]
    End If

End Sub
Module de feuille :
VB:
Option Explicit

Public remember As Date
Public StringDate$
--------------------------------------------------------------------------------

Private Sub Worksheet_Change(ByVal Target As Range)

    If Not Intersect(Target, [MyDate]) Is Nothing Then
        If CheckDate([MyDate]) = True Then  'la date est valide
            [MyDateBis] = CStr(Target)      'la cellule nommée "MyDateBis" récupère la nouvelle date valide entrée sous forme de chaîne de caractères
            StringDate = [MyDateBis]        'la date est mémorisée par la variable "StringDate" comme une chaîne de caractères
            CorrectDate                     'vérifie si le jour de la date est > 12 ou pas
        Else                                'on a rentré n'importe quoi ("efgyuefr", "17521", "15/25/20"...)
            Target = remember               'la cellule nommée "MyDate" reprend la dernière date valide qui avait été entrée
        End If
        Target.Select
    End If

End Sub
--------------------------------------------------------------------------------

Private Sub Worksheet_SelectionChange(ByVal Target As Range)

    If Not Intersect(Target, [MyDate]) Is Nothing Then
        remember = [MyDateBis]           'dès que l'on sélectionne la cellule nommée "MyDate", la variable "remember" récupère la dernière date valide qui avait été entrée
        Target.NumberFormat = "General"  'on quitte le format "Date"
        Target = StringDate              'la cellule nommée "MyDate" affiche la date
    End If

End Sub
 

Pièces jointes

  • Saisie Date4.xlsm
    22.8 KB · Affichages: 1

patricktoulon

XLDnaute Barbatruc
re
je ne t'avais pas mis le else pour le retour
VB:
  If Not Intersect(Target, [madate]) Is Nothing Then
        [d4] = VérifieEntréeDate2([madate])
    End If
End Sub

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    If Not Intersect(Target, [madate]) Is Nothing Then
        If IsDate([madate].Text) Then
            d = [madate].Text: Target.NumberFormat = "General": Target.Value = "'" & CStr(d)
        End If
    Else
        If IsDate(Replace([madate].Text, ",", "")) Then [madate] = CDate(Format([madate].Text, "m/d/yyyy"))
    End If
   End Sub
Function VérifieEntréeDate2(cel As Variant) As Boolean
'Vérifie si l'entrée est bien une date sous forme "jj/mm/aaaa"
'patricktoulon
    VérifieEntréeDate2 = IsDate(cel.Value) And Format(cel.Text, "dd/mm/yyyy") = cel.Text
End Function
demo8.gif


et quoi que jouer avec le format n'est pas indispensable me semble t il puise qu'il je met l' apostrophe et il est invisible
le principe
a la selection de la cellule D3 elle garde sa date mais en string
si tu tape pas une date elle reste en string et D4=faux quand elle est dé sélectionnée après le change
si tu la selection et déselectionne elle redevien la meme date mais en date pas en string

pas compliqué
;)
 

ChTi160

XLDnaute Barbatruc
Bonjour
Une question dans la procédure jointe par Patrick ci dessus #26
Y'a t'il pas une erreur ?
Je vois une virgule dans le Replace soit "," au lieu de " ' " je crois!
Alors que la vidéo montre une apostrophe devant le libellé.
Bonne journée à vous
Jean marie
 

patricktoulon

XLDnaute Barbatruc
Bonjour
@ChTi160
craneur!!! 🤣
de toute façon on peut supprimer le replace étonnamment le test isdate passe avec

VB:
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, [madate]) Is Nothing Then
        [d4] = VérifieEntréeDate2([madate])
    End If
End Sub

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    If Not Intersect(Target, [madate]) Is Nothing Then
        If IsDate([madate].Text) Then
            d = [madate].Text: Target.NumberFormat = "General": Target.Value = "'" & CStr(d)
        End If
    Else
        If IsDate([madate].Text) Then [madate] = CDate(Format([madate].Text, "m/d/yyyy"))
    End If
   End Sub
Function VérifieEntréeDate2(cel As Variant) As Boolean
'Vérifie si l'entrée est bien une date sous forme "jj/mm/aaaa"
'patricktoulon
    VérifieEntréeDate2 = IsDate(cel.Value) And Format(cel.Text, "dd/mm/yyyy") = cel.Text
End Function

maintenant que @Magic_Doctor me dise encore que ça ne fonctionne pas ( il va m'entendre celui là)
 

Discussions similaires

Réponses
9
Affichages
1 K

Statistiques des forums

Discussions
312 331
Messages
2 087 360
Membres
103 528
dernier inscrit
hplus