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 ?
 

ChTi160

XLDnaute Barbatruc
Bonsoir
chez moi si je fais ce que tu décris je tapes 12320
VB:
Private Sub Worksheet_Change(ByVal Target As Range)
MsgBox VérifieEntréeDate(Target)
End Sub

Function VérifieEntréeDate(cel) 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
Ca me renvoie Faux et donc correct "ce n'est pas une date" !
par contre , je n'ai pas formaté mes cellules en Date avant la saisie!

jean marie
 
Dernière édition:

patricktoulon

XLDnaute Barbatruc
re
bonsoir
allons donc!!
la réponse est dans le commentaire que tu a mis dans ta fonction que je cite
'Vérifie si l'entrée est bien une date sous forme "jj/mm/aaaa"

VB:
Private Sub Worksheet_Change(ByVal Target As Range)
    MsgBox VérifieEntréeDate(Target)
End Sub

Function VérifieEntréeDate(cel As Variant) As Boolean
'Vérifie si l'entrée est bien une date sous forme "jj/mm/aaaa"
    VérifieEntréeDate = IsDate(cel.text) And Format(cel.Text, "dd/mm/yyyy") = cel.Text
End Function
pas compliqué ;)
il faudra m'expliquer pourquoi variant mais bon c'est pas pressé LOL
 

patricktoulon

XLDnaute Barbatruc
re
et pour shunter le dépassement de capacité
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.Text) Then VérifieEntréeDate = Format(cel.Text, "dd/mm/yyyy") = cel.Text
End Function
 

Magic_Doctor

XLDnaute Barbatruc
Re,

Un contrôle de saisies sert à contrôler une connerie que l'on pourrait rentrer.
Si, au lieu de 13/03/2020, un étourdi rentre 13320 --> 19/06/1936. Et s'il rentrait 130320 --> 19/10/2256. Nous tombons là sur des dates tout à fait ubuesques.
Si dans un contrôle de saisies de dates je décide de rentrer les dates uniquement sous la forme jj/mm/aaaa, cela sous-entend évidemment qu'une saisie strictement numérique sera exclue, pour ne pas se voir retourner une ineptie.
En somme, selon vous, je veux rentrer 13/03/2020, je me plante dans la saisie en entrant 13320. Ça me renvoie 19/06/1936 (donc VRAI dans la fonction) et vous voulez que je me dise "tudo bom". Non, je voudrais que dans ce cas de figure la fonction me renvoie FAUX !
Ai-je été clair ?
 

Hasco

XLDnaute Barbatruc
Repose en paix
Bonjour,
.
@Magic_Doctor les dates sont simplement des nombres de 1 (01/01/1900) à 2958465 (31/12/9999) en tous cas pour excel 2010 non sous calendrier 1904
Nombres qu'excel nous permet de représenter sous forme de dates compréhensibles et lisibles, mais qui n'en restent pas moins des nombres.
Le format n'en est qu'une représentation visuelle.
En VBA la propriété Value2 a été créée pour contenir les nombres représentés par des dates, indépendament de leur format.

voyez les tests dans la fenêtre d'exécution ci-dessous :
1612073180654.png


A nous de jongler avec ces propriétés pour reconnaître les valeurs de date et non date.

Un petit os toutefois. Lorsque vous tapez 18/11/1936 dans une cellule, excel fera une reconnaissance automatique de date et appliquera le format date à la cellule.
Si ensuite vous tapez 1320, la cellule étant au format date, excel traduira ce nombre en date.
Mettez la cellule au format standard, revalidez votre cellule pour activer vos fonctions et vous verrez que leur résultat est juste.
Ceci sera efficient jusqu'à ce que la cellule repasse au format date automatiquement ou non.

Pour conclure, les deux fonctions sont bonnes.

Bonne journée
 

patricktoulon

XLDnaute Barbatruc
le probleme c'est effectivement que la cellule est formater par excel quand c'est une date il faut donc reformater
donc pour une manip aisée on (re) met le format general a la selection de la cellule
au change on controle si c'est une date ET !!! que la valeur formaté soit bien = au text

donc vire ton modulo poubelle
et dans le module de ta feuille
VB:
Option Explicit

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

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    If Not Intersect(Target, [MaDate]) Is Nothing Then Target.NumberFormat = "General": Target.Value = ""
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,

Merci pour vos réponses et conseils.
J'avais pensé à la solution d'eriiiic, mais ça ne me satisfaisait pas. J'ai donc tenté de bricoler quelque chose en m'inspirant essentiellement de ce que propose patricktoulon. Ça marche bien, cependant il y a un problème, je dirais rédhibitoire, quand on ne fait que sélectionner la cellule où l'on rentre la date. Une fois sélectionnée, il faut rentrer quelque chose, sinon on reste avec un résultat pour le moins déconcertant pour ceux qui ne sont pas champions de calcul mental. Le dernier problème est, par conséquent, comment faire pour que, lors de la sélection de ladite cellule, celle-ci conserve un résultat intelligible ? Mais peut-être que ce n'est pas possible...
 

Pièces jointes

  • Saisie Date2.xlsm
    19.1 KB · Affichages: 4

Discussions similaires

Réponses
9
Affichages
1 K

Statistiques des forums

Discussions
312 336
Messages
2 087 387
Membres
103 534
dernier inscrit
Kalamymustapha