OVH Cloud OVH Cloud

Tester des dates

2 réponses
Avatar
Pampa-sr
Salut,

J'invite les utilisateurs d'une application =E0 saisir des=20
dates dans plusieurs textbox. Afin de v=E9rifier qu'il=20
s'agit bien d'une date, j'utilise la s=E9quence de code=20
suivante :

Private Sub CommandButton1_Click()

mydate =3D TextBox1.Value
mycheck =3D IsDate(mydate)
Select Case mycheck
Case False
MsgBox "date non valide"
Case True
ActiveCell.Value =3D CDate(TextBox1.Value)
End Select

End Sub

Cette fa=E7on de proc=E9der semble convenir. Je me suis=20
toutefois aper=E7u avec stupeur que des saisies telles=20
que "01/13/2000" n'=E9taient pas invalid=E9es ; pire, la=20
valeur plac=E9e dans la cellule inverse le jour et le "faux=20
mois" pour donner en r=E9sultat "13/01/2000", ce qui est=20
extr=EAmement f=E2cheux en terme de fiabilit=E9 des donn=E9es.

Question : =E0 quoi est-ce d=FB ? Mon code est-il mauvais ? En=20
ce cas quelle alternative possible ?

Oserais-je solliciter une r=E9ponse dans la journ=E9e sans=20
=EAtre insolent ? S=E9rieusement, m=EAme si c'est une question=20
r=E9currente, j'ai vraiment besoin d'une r=E9ponse urgente.=20
Merci beaucoup.

2 réponses

Avatar
ashto
bonjour,

il se trouve que les dates se comportent de cette façon
dans vba parce que la date est interprétée au format
anglo-saxon : mois/jour/année quand çà l'arrange... que
tu saisisses 13/01/2003 ou 01/13/2003, vba va s'arranger
pour convertir la date au mieux ; dans les 2 cas, il va
considérer que c'est le 13 janvier 2003.

pour que ton test soit correct, il te faut vérifier "à la
main" que les chiffres saisis entre les 2 shlash sont
compris entre 1 et 12.

ce que tu récupère dans la TextBox est du texte (type de
données String), donc tu peux faire :

If IsDate(mydate) Then
' je trouve les positions des slash qui entourent le
mois
PosSlash1 = InStr(mydate, "/")
PosSlash2 = InStr(PosSlash1 + 1, mydate, "/")
' je compare le mois que me renvoit la fonction Month
avec ce que j'ai entre les 2 slash
If Month(mydate) <> CInt(Mid(mydate, PosSlash1 + 1,
PosSlash2 - PosSlash1 - 1)) Then
MsgBox "date non valide"
Else
ActiveCell.Value = Format$(mydate, "dd/mm/yyyy")
End If
End If

il y a peut-être plus simple mais pour l'instant je vois
pas...

à bientôt

ashto

-----Message d'origine-----
Salut,

J'invite les utilisateurs d'une application à saisir des
dates dans plusieurs textbox. Afin de vérifier qu'il
s'agit bien d'une date, j'utilise la séquence de code
suivante :

Private Sub CommandButton1_Click()

mydate = TextBox1.Value
mycheck = IsDate(mydate)
Select Case mycheck
Case False
MsgBox "date non valide"
Case True
ActiveCell.Value = CDate(TextBox1.Value)
End Select

End Sub

Cette façon de procéder semble convenir. Je me suis
toutefois aperçu avec stupeur que des saisies telles
que "01/13/2000" n'étaient pas invalidées ; pire, la
valeur placée dans la cellule inverse le jour et
le "faux

mois" pour donner en résultat "13/01/2000", ce qui est
extrêmement fâcheux en terme de fiabilité des données.

Question : à quoi est-ce dû ? Mon code est-il mauvais ?
En

ce cas quelle alternative possible ?

Oserais-je solliciter une réponse dans la journée sans
être insolent ? Sérieusement, même si c'est une question
récurrente, j'ai vraiment besoin d'une réponse urgente.
Merci beaucoup.
.



Avatar
Pampa-sr
Je me doutais qu'il y avait une histoire de format là-
dessous. Par contre, je trouve complètement taré qu'Excel
interprète la date saisie comme ça lui chante. Du reste,
je ne voispas bien la signification de ta dernière
remarque à propos du fait que le 13/01/2003 et le
01/13/2001 sont une seule et même date : le 13/01/2001 ???

Personnellement, j'ai opté pour la solution suivante :

mydate = TextBox1.Value
mycheck = IsDate(mydate)
Select Case mycheck
Case False
MsgBox "date non valide"

Case True
Dim anystring, mystr
anystring = TextBox1.Value
mystrmois = Mid(anystring, 4, 2)
Select Case mystrmois
Case Is > 12
MsgBox "mois incorrect"
End Select

ActiveCell.Value = CDate(TextBox1.Value)
End Select

A priori, si j'ai bien saisi, la seule chose à contrôler,
c'est que le mois ne soit pas supérieur à 12 puisque les
autres possibilités d'erreur semblent détectées par la
portion de code précédente.

Qu'en penses-tu ?

@+

-----Message d'origine-----
bonjour,

il se trouve que les dates se comportent de cette façon
dans vba parce que la date est interprétée au format
anglo-saxon : mois/jour/année quand çà l'arrange... que
tu saisisses 13/01/2003 ou 01/13/2003, vba va s'arranger
pour convertir la date au mieux ; dans les 2 cas, il va
considérer que c'est le 13 janvier 2003.

pour que ton test soit correct, il te faut vérifier "à la
main" que les chiffres saisis entre les 2 shlash sont
compris entre 1 et 12.

ce que tu récupère dans la TextBox est du texte (type de
données String), donc tu peux faire :

If IsDate(mydate) Then
' je trouve les positions des slash qui entourent le
mois
PosSlash1 = InStr(mydate, "/")
PosSlash2 = InStr(PosSlash1 + 1, mydate, "/")
' je compare le mois que me renvoit la fonction Month
avec ce que j'ai entre les 2 slash
If Month(mydate) <> CInt(Mid(mydate, PosSlash1 + 1,
PosSlash2 - PosSlash1 - 1)) Then
MsgBox "date non valide"
Else
ActiveCell.Value = Format$(mydate, "dd/mm/yyyy")
End If
End If

il y a peut-être plus simple mais pour l'instant je vois
pas...

à bientôt

ashto

-----Message d'origine-----
Salut,

J'invite les utilisateurs d'une application à saisir des
dates dans plusieurs textbox. Afin de vérifier qu'il
s'agit bien d'une date, j'utilise la séquence de code
suivante :

Private Sub CommandButton1_Click()

mydate = TextBox1.Value
mycheck = IsDate(mydate)
Select Case mycheck
Case False
MsgBox "date non valide"
Case True
ActiveCell.Value = CDate(TextBox1.Value)
End Select

End Sub

Cette façon de procéder semble convenir. Je me suis
toutefois aperçu avec stupeur que des saisies telles
que "01/13/2000" n'étaient pas invalidées ; pire, la
valeur placée dans la cellule inverse le jour et
le "faux

mois" pour donner en résultat "13/01/2000", ce qui est
extrêmement fâcheux en terme de fiabilité des données.

Question : à quoi est-ce dû ? Mon code est-il mauvais ?
En

ce cas quelle alternative possible ?

Oserais-je solliciter une réponse dans la journée sans
être insolent ? Sérieusement, même si c'est une question
récurrente, j'ai vraiment besoin d'une réponse urgente.
Merci beaucoup.
.

.